Java에서는 null 검사를 할 때 .equals () 대신 ==을 사용해야한다고 들었습니다. 그 이유는 무엇입니까?
답변
완전히 다른 두 가지입니다. ==
변수에 포함 된 개체 참조 (있는 경우)를 비교합니다. 평등이 의미하는 바에 대한 계약에 따라 .equals()
두 개체가 동일한 지 확인합니다 . 계약에 따라 두 개의 서로 다른 개체 인스턴스가 “동일”할 수 있습니다. 그리고 equals
메서드 이기 때문에 null
참조에서 호출하려고 하면 NullPointerException
.
예를 들면 :
class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */
}
Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances
System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition
Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it
System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything
System.out.println(f1.equals(f3));
// Outputs false, since `f1` is a valid instance but `f3` is null,
// so one of the first checks inside the `Foo#equals` method will
// disallow the equality because it sees that `other` == null
답변
당신이 호출 할 경우 .equals()
에 null
당신은 얻을 것이다NullPointerException
따라서 항상 적용되는 메서드를 호출하기 전에 nullity를 확인하는 것이 좋습니다.
if(str!=null && str.equals("hi")){
//str contains hi
}
참조
답변
허용 된 답변 ( https://stackoverflow.com/a/4501084/6276704 ) 외에 :
Java 1.7 이후로 null 일 수있는 두 개체를 비교하려면 다음 함수를 권장합니다.
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
이 클래스는 개체에서 작동하기위한 정적 유틸리티 메서드로 구성됩니다. 이러한 유틸리티에는 개체의 해시 코드를 계산하고, 개체에 대한 문자열을 반환하고, 두 개체를 비교하기위한 null-safe 또는 null 허용 메서드가 포함됩니다.
이후 : 1.7
답변
Java 0 또는 null은 객체가 아닌 단순 유형입니다.
equals () 메소드는 단순 유형에 대해 빌드되지 않습니다. 단순 유형은 ==와 일치 할 수 있습니다.
답변
foo.equals(null)
foo가 null이면 어떻게 되나요?
NullPointerException이 발생합니다.
답변
Object 변수가 null이면 equals () 메서드를 호출 할 수 없으므로 null 객체 참조 검사가 적절합니다.
답변
null 개체 참조에 대해 equals를 호출하면 null 포인터 예외가 발생합니다.