初めて Java を学習すると、次のようなコードに遭遇することがよくあります:
String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); System.out.println(str1.equals(str2));
4 行目と 5 行目の出力結果が異なるのはなぜですか? == メソッドと等しいメソッドの違いは何ですか?初めて Java を学習するときにこれを理解していないと、将来コードを書くときにいくつかの低レベルのエラーを犯すことになります。今日は == メソッドと等しいメソッドの違いについて学びましょう。
1. 関係演算子「==」は何を比較するのですか?
以下の文は書籍『Java Programming Thoughts』からの原文引用です:
「関係演算子はブール結果を生成し、オペランドの値間の関係を計算します。」
この文は簡単そうに見えますが、それでも注意深く理解する必要があります。簡単に言うと、==は値が等しいかどうかを比較するために使用されます。いくつかの例を見てみましょう:
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int n=3; int m=3; System.out.println(n==m); String str = new String("hello"); String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); str1 = str; str2 = str; System.out.println(str1==str2); } }
出力結果は true false true
n==m の結果は true です。 これは、変数 n と変数 m に格納されている値が両方とも 3 であることを理解するのが簡単です。これは等しい必要があります。 str1 と str2 の 2 つの比較結果が異なるのはなぜですか?これを理解するには、基本データ型変数と非基本データ型変数の違いを理解するだけで済みます。
Javaには8つの基本データ型があります:
浮動小数点型: float (4バイト)、double (8バイト)
整数型: byte (1バイト)、short (2バイト)、int (4バイト) 、long(8 byte)
文字型: char(2 byte)
Boolean型: boolean (JVM仕様では占有する領域サイズを明確に規定しておらず、リテラル値のみを取ることができると規定しているだけです) true」と「false」)
これら8つの基本データ型の変数は、変数に直接「値」が格納されているため、関係演算子 == を使って比較する場合、比較されるのは「値」そのものになります。浮動小数点型と整数型はどちらも符号付き型ですが、char 型は符号なし型 (char 型の値の範囲は 0~2^16-1) であることに注意してください。
つまり、たとえば次のようになります。
int n= 3; int m=3; 変数n、変数mともに値「3」が直接格納されているので、==と比較すると結果はtrueになります。 非基本データ型の変数のことを、書籍によっては参照型変数と呼んでいます。たとえば、上記の str1 は参照型変数です。参照型変数は、「値」そのものではなく、それに関連付けられたオブジェクトのアドレスをメモリに格納します。たとえば、次のコード行: String str1; この文は参照型変数を宣言していますが、現時点ではどのオブジェクトにも関連付けられていません。 そして new String("hello") を使ってオブジェクト (String クラスのインスタンスとも呼ばれます) を生成し、このオブジェクトを str1 にバインドします: str1= new String("hello"); 次に、str1 は次を指します。オブジェクト (str1 は、多くの場所でオブジェクトへの参照とも呼ばれます) このとき、変数 str1 には、「値」そのものではなく、メモリ内でそれが指すオブジェクトの格納アドレスが格納されます。文字列「hello」は直接保存されません。ここでの参照は、C/C++ のポインターに非常に似ています。 つまり、 == を使用して str1 と str2 を初めて比較すると、結果は false になります。したがって、それらはそれぞれ異なるオブジェクトを指します。これは、それらが実際に格納されるメモリアドレスが異なることを意味します。 2 番目の比較では、str1 と str2 の両方が str が指すオブジェクトを指しているため、得られる結果は間違いなく true です。 2. 等しいとは何と比較しますか? equalsメソッドは基底クラスObjectのメソッドなので、Objectを継承するクラスはすべてこのメソッドを持つことになります。 equals メソッドの役割をより直観的に理解するために、Object クラスの equals メソッドの実装を直接見てみましょう。 このクラスのソースコードのパスは、C:Program FilesJavajdk1.6.0_14 の src.zip の java.lang パスの下の Object.java です (個人用の jdk インストール パスに応じて異なります)。 以下は、Object クラスでの equals メソッドの実装です: 明らかに、Object クラスでは、equals メソッドは、2 つのオブジェクトの参照が等しいかどうか、つまり、それらがポイントしているかどうかを比較するために使用されます。同じオブジェクトに。 しかし、次のコード部分の出力結果はなぜ true なのか、また疑問を持つ友人もいるかもしれません。public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1.equals(str2)); } }何が起こっているのかを知るには、String クラスの equals メソッドの具体的な実装を見てください。また、このパスの下にある String.java は String クラスの実装です。 以下は、String クラスのquals メソッドの具体的な実装です: String クラスは、ポイントされた文字列オブジェクトに格納されている文字列が等しいかどうかを比較するために、equals メソッドを書き換えていることがわかります。 Double、Date、Integer などの他のクラスでは、指すオブジェクトに格納されている内容が等しいかどうかを比較するために、equals メソッドをオーバーライドしています。 要約:
1) == の場合、基本データ型の変数に作用する場合は、その格納されている「値」が等しいかどうかを直接比較します。
参照型の変数に作用する場合は、アドレスを比較します。 2)equals メソッドについては、注意してください:equals メソッドは基本データ型の変数には作用できません
equals メソッドがオーバーライドされていない場合、参照型変数が指すオブジェクトのアドレスが比較されます;
String、Dateなど クラスがequalsメソッドをオーバーライドする場合、ポイントされたオブジェクトの内容が比較されます。
Java の等号と == に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。