65

私は今日講師を変えました、そして彼は私に奇妙なコードを使っていると言いました. (使っ.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) が優れているのでしょうか?

クイック検索でこれを見つけましたが、その答えを本当に理解できません:

4

11 に答える 11

112

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!

ここでxyは同じ文字列への参照です。これyは、コンパイル時の定数が に等しいため"hello"です。

于 2009-10-29T11:29:57.353 に答える
20

== 演算子は、オブジェクトが同じインスタンスであるかどうかを比較します。equals() 演算子は、オブジェクトの状態を比較します(たとえば、すべての属性が等しい場合)。equals() メソッドをオーバーライドして、オブジェクトが別のオブジェクトと等しい場合に自分自身を定義することもできます。

于 2009-10-29T11:30:50.827 に答える
14

あなたと私がそれぞれ銀行に足を踏み入れ、それぞれがまったく新しい口座を開設し、それぞれが100ドルを入金した場合...

  1. myAccount.equals(yourAccount)値が同じtrueだからですが、
  2. myAccount == yourAccount原因はfalse、それらが同じアカウントではないためです。

(もちろん、クラスの適切な定義を前提としていますAccount。;-)

于 2009-10-29T11:37:18.777 に答える
2

== は演算子です。equals は Object クラスで定義されたメソッドです

== は、2 つのオブジェクトがメモリ内で同じアドレスを持っているかどうかをチェックし、プリミティブの場合は、それらが同じ値を持っているかどうかをチェックします。 equals メソッドはオブジェクトに実装されています. equals メソッドはプリミティブには適用できません (つまり、a がプリミティブの場合、a.equals(someobject) は許可されませんが、someobject.equals(a) は許可されます)。

于 2012-06-08T16:26:03.080 に答える
0

== 演算子は、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 を返します。

于 2015-09-18T05:10:41.720 に答える
-1
于 2014-05-08T12:58:04.970 に答える
-2

「==」演算子は、両方のオペランドが同じオブジェクトに属している場合に true を返しますが、単一のオブジェクトに複数の値を割り当てることができないため、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
   }
}

これが実際に起こったとき、それが起こらなかった場合、なぜこれが==なのか機能を比較します....

于 2014-09-26T14:20:02.123 に答える
-2

(1) == はプリミティブ型とオブジェクト型の両方に適用できますが、equals() メソッドはオブジェクト型のみに適用できます。

(2) == はコンテンツ比較でオーバーライドできませんが、equals メソッドはコンテンツ比較でオーバーライドできます (例: String クラス、ラッパー クラス、コレクション クラス)。

(3) == は、equals メソッドが false を返すため、異種の型に適用しようとすると、比較できない型のエラーを返します。

于 2015-08-21T03:37:14.293 に答える
-2

あなたの問題についての簡単な解釈は次のとおりです。

== (等しい) 算術式の評価に使用

一方

文字列の比較に使用される equals() メソッド

したがって、数値演算には == を使用し、文字列関連の演算には equals() メソッドを使用することをお勧めします。したがって、オブジェクトの比較には equals() メソッドが正しい選択です。

于 2016-02-14T03:30:42.110 に答える