“ .equals”の違いは何ですかおよび“ ==&#8221 ;? [複製]
質問
この質問にはすでに回答があります:
今日、講師を交代しましたが、彼は奇妙なコードを使用していると言いました。 (彼は .equals
を使用した方が良いと言ったので、理由を尋ねると、彼は「そうだから!」と答えました)
だからここに例があります:
if (o1.equals(o2))
{
System.out.println("Both integer objects are the same");
}
私が慣れているものの代わりに:
if (o1 == o2)
{
System.out.println("Both integer objects are the same");
}
2つの違いは何ですか。そして、なぜ( .equals
を使用して)彼のやり方が良いのですか?
これを発見クイック検索ですが、その答えを本当に理解することはできません:
解決
Javaでは、 ==
は常に2つの参照を比較します(つまり、非プリミティブの場合)。つまり、2つのオペランドが同じオブジェクトを参照しているかどうかをテストします。
ただし、 equals
メソッドはオーバーライドできます。そのため、2つの別個のオブジェクトは等しくなります。
例:
String x = "hello";
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
System.out.println(x == y); // false
System.out.println(x.equals(y)); // true
さらに、2つの等しい文字列定数(主に文字列リテラルですが、連結による文字列定数の組み合わせ)は同じ文字列を参照することに注意してください。例:
String x = "hello";
String y = "he" + "llo";
System.out.println(x == y); // true!
ここで、 x
と y
は同じ文字列への参照です。これは、 y
が"と等しいコンパイル時定数であるためです。こんにちは"
。
他のヒント
==演算子は、オブジェクトが同じインスタンスであるかどうかを比較します。 equals()oeratorは、オブジェクトの状態を比較します(たとえば、すべての属性が等しい場合)。オブジェクトが別のオブジェクトと等しい場合、equals()メソッドをオーバーライドして自分自身を定義することもできます。
あなたと私がそれぞれ銀行に足を踏み入れた場合、それぞれが新しい口座を開設し、それぞれ100ドルを入金します...
-
myAccount.equals(yourAccount)
は、同じ値を持っているためtrue
ですが、 -
myAccount == yourAccount
は、同じアカウントではないため、false
です。
(もちろん、 Account
クラスの適切な定義を想定しています。;-)
==は演算子です。 equalsはObjectクラスで定義されたメソッドです
==は、2つのオブジェクトのメモリ内のアドレスが同じかどうかをチェックし、プリミティブの場合は、同じvalue.equalsメソッドがあるかどうかをチェックします。一方、比較される2つのオブジェクトの値が等しいかどうかオブジェクトに対してequalsメソッドがどのように実装されているか。equalsメソッドはプリミティブに適用できません(つまり、 aがプリミティブの場合、a.equals(someobject)は許可されませんが、someobject.equals(a)は許可されます)。
==演算子は、2つのオブジェクト参照を比較して、それらが同じインスタンスを参照しているかどうかを確認します。これも、成功したマッチでtrueを返します。たとえば、
public class Example{
public static void main(String[] args){
String s1 = "Java";
String s2 = "Java";
String s3 = new string ("Java");
test(Sl == s2) //true
test(s1 == s3) //false
}}
上記の例==は参照比較です。つまり、両方のオブジェクトが同じメモリ位置を指します
String equals()は、オブジェクト内の値の比較に対して評価されます。
public class EqualsExample1{
public static void main(String args[]){
String s = "Hell";
String s1 =new string( "Hello");
String s2 =new string( "Hello");
s1.equals(s2); //true
s.equals(s1) ; //false
}}
上記の例文字列の内容を比較します。文字列が一致する場合はtrueを返し、そうでない場合はfalseを返します。
Javaでは、“ ==” 演算子を使用して2つのオブジェクトを比較する場合、オブジェクトがメモリ内の同じ場所を参照しているかどうかを確認します。例:
String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1 == obj2)
System.out.println("obj1==obj2 is TRUE");
else
System.out.println("obj1==obj2 is FALSE");
文字列はまったく同じ文字(“ xyz”)ですが、上記のコードは実際に出力します: obj1 == obj2はFALSEです
Java Stringクラスは、実際にはObjectクラスのデフォルトの equals()実装をオーバーライドします–また、メソッドをオーバーライドして、メモリ内の位置ではなく、文字列の値のみをチェックするようにします。つまり、equals()メソッドを呼び出して2つのStringオブジェクトを比較した場合、実際の文字シーケンスが等しい限り、両方のオブジェクトは等しいと見なされます。
String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1.equals(obj2))
System.out.printlln("obj1==obj2 is TRUE");
else
System.out.println("obj1==obj2 is FALSE");
このコードは次を出力します:
obj1 == obj2はTRUEです
public static void main(String[] args){
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));
////
System.out.println(s1 == s2);
System.out.println("-----------------------------");
String s3 = "hello";
String s4 = "hello";
System.out.println(s3.equals(s4));
////
System.out.println(s3 == s4);
}
このコードでは、「==」と「.equals」の両方を比較できます
参照オブジェクトの比較には.equalsを使用し、オブジェクトの状態の比較には「==」を使用します。
(1)==はプリミティブとオブジェクトタイプの両方に適用できますが、equals()メソッドはオブジェクトタイプのみに適用できます。
(2)==コンテンツの比較ではオーバーライドできませんが、equalsメソッドはコンテンツの比較でオーバーライドできます(例; Stringクラス、ラッパークラス、コレクションクラス)。
(3)== as equalsメソッドがfalseを返す異種タイプに適用しようとすると、比較できないタイプのエラーが発生します。
equals()
メソッドと ==
演算子は、2つの異なる操作を実行します。 equals()
メソッドは、 String
オブジェクト内の文字を比較します。 ==
演算子は、2つのオブジェクト参照を比較して、それらが同じインスタンスを参照しているかどうかを確認します。次のプログラムは、2つの異なるStringオブジェクトに同じ文字を含める方法を示していますが、これらのオブジェクトへの参照は等しいと比較されません。
// equals() vs ==
class EqualsNotEqualTo {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = new String(s1);
System.out.println(s1 + " equals " + s2 + " -> " +
s1.equals(s2));
System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2));
}
}
変数 s1
は、“ Hello”
によって作成されたStringインスタンスを参照します。によって参照されるオブジェクト
s2
は、初期化子として s1
で作成されます。したがって、2つのStringオブジェクトの内容は同じです。
しかし、それらは別個のオブジェクトです。つまり、 s1
と s2
は同じオブジェクトを参照せず、
したがって、前述の例の出力で示されているように、 ==
ではありません。
Hello equals Hello -> true
Hello == Hello -> false
" =="と言います。演算子は、両方のオペランドが同じオブジェクトに属している場合にtrueを返しますが、1つのオブジェクトに複数の値を割り当てることができないためtrueを返します
public static void main(String [] args){
String s1 = "Hello";
String s1 = "Hello"; // This is not possible to assign multiple values to single object
if(s1 == s1){
// Now this retruns true
}
}
今、これが実際に起こるとき、それが起こらない場合、なぜこれが==であるかは機能を比較します。...
問題についての簡単な説明は次のとおりです。
==(等しい)算術式の評価に使用
where as
equals()メソッドは文字列の比較に使用されます
したがって、数値演算&には==を使用する方が適切です。 String関連操作のequals()メソッド。したがって、オブジェクトの比較には、equals()メソッドが正しい選択です。