初めて Java を学習するときは、よく次のコードに遭遇するかもしれません:
1 String str1 = new String("hello");
2 String str2 = new String("hello");
3
4 System.out.println(str1==str2);
5 System.out.println(str1.equals(str2));
4行目と5行目の出力結果が異なるのはなぜですか? == メソッドと等しいメソッドの違いは何ですか?初めて Java を学習するときにこれを理解していないと、将来コードを書くときにいくつかの低レベルのエラーを犯すことになります。今日は == メソッドと等しいメソッドの違いについて学びましょう。
1. 関係演算子「==」は何を比較するのですか?
次の文は、書籍「Java Programming Thoughts」からの抜粋です:
「関係演算子はブール結果を生成し、オペランドの値間の関係を計算します。関係」。
この文は簡単そうに見えますが、それでも注意深く理解する必要があります。簡単に言うと、==は値が等しいかどうかを比較するために使用されます。いくつかの例を見てみましょう:
: char(2 byte)public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成メソッドスタブ ello");
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1==str2); str2 = str;
System.out.println(str1==str2); 変数 n と m に格納される値は両方とも 3 であり、等しい必要があることが容易に理解できます。 str1 と str2 の 2 つの比較結果が異なるのはなぜですか?これを理解するには、基本データ型変数と非基本データ型変数の違いを理解するだけで済みます。
Java には 8 つの基本データ型があります:
浮動小数点
: float (4 バイト)、double (8 バイト)
Integer
: バイト (1)バイト) 、short(2 byte)、int(4 byte)、long(8 byte)
Character
Boolean
: boolean(JVM 仕様ではありません占有するスペースのサイズを明確に規定していますが、リテラル値「true」と「false」のみを取ることができると規定しているだけです) これら 8 つの基本データ型の変数の場合、変数は直接格納しますしたがって、関係演算子 == を使用して比較する場合、比較されるのは「値」そのものです。浮動小数点型と整数型はどちらも符号付き型ですが、char 型は符号なし型 (char 型の値の範囲は 0~2^16-1) であることに注意してください。つまり、たとえば:
int n=3;
int m=3;
変数nと変数mはどちらも値「3」を直接格納しているので、==と比較すると結果はtrueになります。非基本データ型の変数のことを、書籍によっては参照型変数と呼んでいます。たとえば、上記の 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 クラスでのquals メソッドの実装です:
明らかに、Object クラスでは、equals メソッドは 2 つのオブジェクトの参照が等しいかどうかを比較するために使用されます。つまり、それらが同じオブジェクトを指しているかどうかです。
しかし、何人かの友人はまた質問をしました。なぜ次のコードの出力結果は true なのでしょうか?
String クラスが、文字列オブジェクトに格納されている文字を比較するために、equals メソッドを書き換えていることがわかります。文字列が等しいかどうかを指します。 Double、Date、Integer などの他のクラスは、ポイントされたオブジェクトに格納されている内容が等しいかどうかを比較するために、equals メソッドをオーバーライドしました。public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成メソッドスタブ
String str1 = new String("hello");
String str2 = new String("hello")
System.out.println(str1.equals(str2));
String クラスの equals メソッドの特定の実装。また、このパスの下では、String.java が String クラスの実装です。 以下は、String クラスの等しいメソッドの具体的な実装です:
要約:
1) == の場合、基本データ型の変数に作用する場合、その格納された「値」が等しいかどうかを直接比較します。参照型の変数の場合、ポイントされたオブジェクトのアドレスが比較されます
2)equals メソッドの場合、注意してください:equals メソッドは基本データ型の変数には作用できません
equals メソッドが書き換えられていない場合、比較は、参照型変数によって指されるオブジェクトのアドレスです。
String や Date などのクラスが、equals メソッドをオーバーライドする場合、指されたオブジェクトの内容が比較されます。
以上が等しいと == の違いについての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。