回答:
それらは2つのまったく異なるものです。==
変数に含まれているオブジェクト参照があれば、それを比較します。.equals()
2つのオブジェクトが等しいかどうかの契約に従って、2つのオブジェクトが等しいかどうかを確認します。2つの異なるオブジェクトインスタンスが契約に従って「等しい」ことは完全に可能です。そして、マイナーな詳細があります。それ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
したがって、適用される場所でメソッドを呼び出す前にnullをチェックすることを常にお勧めします
if(str!=null && str.equals("hi")){
//str contains hi
}
こちらもご覧ください
if ("hi".equals(str))
ます。
someObject.equals(null)
はNullPointerException
equalsメソッドに入ることなくを発生させます。
Objects.equals(a, b)
これはNullPointerExceptionを発生させませんが、それでも「a」と「b」の「等しい」メソッドに依存します
受け入れられた回答に加えて(https://stackoverflow.com/a/4501084/6276704):
Java 1.7以降、nullの可能性がある2つのオブジェクトを比較する場合は、次の関数をお勧めします。
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
このクラスは、オブジェクトを操作するための静的ユーティリティメソッドで構成されています。これらのユーティリティには、オブジェクトのハッシュコードを計算し、オブジェクトの文字列を返し、2つのオブジェクトを比較するためのnullセーフまたはnullトレラントメソッドが含まれています。
以来:1.7
Javaでは、0またはnullは単純型であり、オブジェクトではありません。
メソッドequals()は単純型用に作成されていません。単純型は==と照合できます。
Object.equalsはnullセーフですが、2つのオブジェクトがnullの場合、object.equalsはtrueを返すため、object.equalsを比較。
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
上記のスニペットの例は同等を返します!
equalはObjectクラスから派生した関数なので、この関数はクラスのアイテムを比較します。nullと一緒に使用すると、falseが返されます。これは、クラスのコンテンツがnullではないためです。さらに==はオブジェクトへの参照を比較します。
false
or のみです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)
true を返すことです。これは通常のJavaの動作を破壊するため、混乱を招きます。それはfield.equals("null")
、少なくとも私の観点では、でのみ機能するはずです。ライブラリ開発者がなぜこれをサポートするのが良いだろうと思ったのか、私にはわかりません。
str != null
と str.equals(null)
リターンtrue
使っorg.jsonを。」?
jsonObject
理由である「フィールド」キーが含まれているためだと思いfield
ます。json.org.JSONObject$Null
オブジェクトを含む参照があります
Null
ように扱わず、代わりにnull
使用し"null"
ます。しかし、私は彼らが文字列を必要としないようにするためにそれをしたと思います。しかし、そのlibを使用しfield.equals(null)
ても、ほとんど常に問題です:P。
あなたはコードがデメテルの法則を破ります。そのため、デザイン自体をリファクタリングする方が良いでしょう。回避策として、オプションを使用できます
obj = Optional.ofNullable(object1)
.map(o -> o.getIdObject11())
.map(o -> o.getIdObject111())
.map(o -> o.getDescription())
.orElse("")
上記はオブジェクトの階層をチェックすることなので、単純に使用します
Optional.ofNullable(object1)
チェックするオブジェクトが1つしかない場合
お役に立てれば !!!!
いつでもできる
if (str == null || str.equals(null))
これは、最初にオブジェクト参照をチェックしてから、参照がnullでない場合はオブジェクト自体をチェックします。
x.equals(null)
。
equals()
ことです。試してみるとすぐにわかります