Java에서는 null 검사를 할 때 .equals () 대신 ==을 사용해야한다고 들었습니다. 그 이유는 무엇입니까?
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
public int data
입니까?
Object
네, 그게 기본값입니다 . 하지만 많은 수의 JDK 클래스에 의해 재정의됩니다. 그러나 요점은 구현에 관한 것이 아니라 의미에 관한 것입니다. (참고 : JDK7은 매우 구식입니다.)
당신이 호출 할 경우 .equals()
에 null
당신은 얻을 것이다NullPointerException
따라서 항상 적용되는 메서드를 호출하기 전에 nullity를 확인하는 것이 좋습니다.
if(str!=null && str.equals("hi")){
//str contains hi
}
참조
if ("hi".equals(str))
.
someObject.equals(null)
이 a NullPointerException
를 발생시킵니다.
Objects.equals(a, b)
그것은 NullPointerException이 인상되지 않습니다,하지만 여전히 "A"와 "B"의 "동일"방법에 따라 달라집니다
허용 된 답변 ( 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 () 메소드는 단순 유형에 대해 빌드되지 않습니다. 단순 유형은 ==와 일치 할 수 있습니다.
Object.equals는 null 안전하지만 두 개체가 null이면 object.equals는 true를 반환하므로 object.equals를 사용하기 전에 비교하는 개체가 null이 아닌지 (또는 null 값을 보유) 확인해야합니다. 비교.
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
위의 예제 스 니펫은 equal을 반환합니다!
equal은 Object 클래스에서 파생 된 함수이므로이 함수는 클래스의 항목을 비교합니다. null과 함께 사용하면 클래스 내용이 null이 아니기 때문에 false를 반환합니다. 또한 ==는 객체에 대한 참조를 비교합니다.
false
또는 NullPointerException
( equals
나쁜 것으로 대체되지 않은 경우 ) 일 수 있습니다.
여기서 예는 어디 str != null
하지만 str.equals(null)
사용시org.json
JSONObject jsonObj = new JSONObject("{field :null}");
Object field = jsonObj.get("field");
System.out.println(field != null); // => true
System.out.println( field.equals(null)); //=> true
System.out.println( field.getClass()); // => org.json.JSONObject$Null
편집 :
여기에 org.json.JSONObject $ Null 클래스가 있습니다.
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/
private static final class Null {
/**
* A Null object is equal to the null value and to itself.
*
* @param object
* An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object or
* null.
*/
@Override
public boolean equals(Object object) {
return object == null || object == this;
}
}
field.equals(null)
는 사실 을 반환 한다는 것입니다. 이것은 일반적인 Java 동작을 깨뜨려 혼란 스럽습니다. field.equals("null")
적어도 내 관점에서는 에서만 작동합니다 . 도서관 개발자들이 이것이 지원하기에 좋을 것이라고 생각한 이유를 모르겠습니다.
str != null
및 str.equals(null)
반환 true
사용하는 경우 org.json을 ."?
jsonObject
그 이유 field
는 null이 아닌 "필드"키가 포함되어 있기 때문이라고 생각합니다 . json.org.JSONObject$Null
개체 를 포함하는 참조가 있습니다.
Null
싶습니다 . 그러나 나는 그들이 Strings를 요구하지 않기 위해 그렇게했다고 생각합니다. 그러나 그 lib를 사용하더라도 여전히 거의 항상 문제입니다. null
"null"
field.equals(null)
당신은 데메테르의 법칙을 위반합니다. 그렇기 때문에 디자인 자체를 리팩토링하는 것이 좋습니다. 해결 방법으로 선택 사항을 사용할 수 있습니다.
obj = Optional.ofNullable(object1)
.map(o -> o.getIdObject11())
.map(o -> o.getIdObject111())
.map(o -> o.getDescription())
.orElse("")
위는 객체의 계층 구조를 확인하는 것이므로 간단히 사용하십시오.
Optional.ofNullable(object1)
확인할 개체가 하나만있는 경우
도움이 되었기를 바랍니다 !!!!
당신은 항상 할 수 있습니다
if (str == null || str.equals(null))
이것은 먼저 개체 참조를 확인한 다음 참조가 null이 아닌 경우 개체 자체를 확인합니다.
x.equals(null)
.
equals()
하고 보는 것입니다. 시도하면 즉시 분명해질 것입니다