ホームページ >テクノロジー周辺機器 >AI >Javaにおけるequals()と==の違いと使用法
Java 開発には、一見単純なトピックがありますが、インターネット上には、equals() と == 演算子の違いに関するトピックや質問がたくさんあります
今日の内容の紹介、所要時間は約 9 分です
写真
違いをよりよく理解するために、見てみましょう例:
String str1 = new String("Hello");String str2 = new String("Hello");System.out.println(str1.equals(str2)); // 输出 trueSystem.out.println(str1 == str2); // 输出 false
この例では、2 つの文字列の内容は同じですが、メモリ内のアドレスが異なります。したがって、.equals() メソッドを使用して内容を比較すると true が返されますが、「==」演算子を使用してアドレスを比較すると false
public boolean equals(Object obj) {return (this == obj);}特記事項: Latin1 (ISO 8859-1 とも呼ばれる) と UTF-16 (Unicode 変換形式 16 ビット) は、2 つの異なる文字エンコード方式です。Latin1 と UTF-16 は 2 つのエンコード方式ですが、違いはありません。 UTF-16のequals()メソッドを見てください
public boolean equals(Object anObject) { //如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;} //如果是String类型的实例if (anObject instanceof String) { //Object类型的对象强制转换为String类型String aString = (String)anObject;//如果当前字符串对象和传入的字符串对象的编码方式相同if (coder() == aString.coder()) { //如果当前字符串和传入的字符串都是Latin1编码,则调用StringLatin1类的equals方法进行比较;如果其中一个或两个字符串是UTF16编码,则调用StringUTF16类的equals方法进行比较return isLatin1() ? StringLatin1.equals(value, aString.value): StringUTF16.equals(value, aString.value);}}return false;}注: Java8とJava11のequals()メソッドのソースコードは異なります。 JDK8 のメソッド
@HotSpotIntrinsicCandidatepublic static boolean equals(byte[] value, byte[] other) {if (value.length == other.length) {int len = value.length >> 1;for (int i = 0; i <div></div>1.2. 例の説明<p></p>例 1:<div></div><pre class="brush:php;toolbar:false">public boolean equals(Object anObject) {// 如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;}// 如果是String类型的实例if (anObject instanceof String) {////Object类型的对象强制转换为String类型String anotherString = (String)anObject;int n = value.length;// 如果字符串长度相等if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;// 判断每个字符是否相等while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}出力結果は何ですか?equals of String クラス このメソッドは、文字列オブジェクトの内容が等しいかどうかを比較します。すべて "Hello" であるため、結果は true になります。例 2:
new String("hello").equals("hello")出力結果は何ですか?
#== 演算子で比較したオブジェクトのアドレスが等しいかどうか == 左側はヒープに作成されたオブジェクト、右側は文字列定数プール オブジェクト。内容は等しいが、アドレスが等しくないため、結果は false
new String("hello") == "hello";
出力結果は何ですか?
new から出力されるオブジェクトは完全に異なるメモリ アドレスである必要があるため、結果は false になります
new String("hello") == new String("hello");#出力は何ですかresult?h と ello はどちらも文字列定数プールにあるため、コンパイラは自動的に hello に最適化されるため、結果は true 例 5:
"hello" == "h"+"ello"出力結果は何ですか?new String("hello") 実行中、オブジェクトはまず文字列定数プールに作成され、次にヒープに作成されます。 intern() メソッドを実行すると、文字列定数プールにオブジェクト 'hello' がすでに存在することが判明したため、直接戻ります。 文字列定数プールのオブジェクトが参照され、文字列定数プールの 'hello' と比較されます。結果は trueです。String.intern() の詳細な分析でその理由がすでに紹介されています2. 他の比較方法
に加えて。
new String("hello").intern() == "hello"
以上がJavaにおけるequals()と==の違いと使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。