JAVAにおける「==」と「equals()」の理解
1 public class TestString {
2 public static void main(String[] args) {
3 String s1 = "Monday";
4 String s2 = "Monday";
5 if (s1 == s2)
6 {
7 System.out.println("s1 == s2");}
8 else{
9 System.out.println("s1 != s2");}
10 }
11 }
プログラムをコンパイルして実行し、出力:s 1==s 2説明:s 1とs 2は同じStringオブジェクト--「Monday」を参照します!2.もう少しプログラムを変更すると、もっと奇妙な発見があります.
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}
s 2をnewオペレータでプログラム出力を作成します:s 1!=s 2 s 1 equals s 2の説明:s 1 s 2はそれぞれ2つの「Monday」Stringオブジェクトを参照する.文字列バッファは元々、プログラムが実行されている間に文字列バッファが作成されていました.s 2=「Monday」という表現を使用して文字列が作成されている場合、プログラムはまずこのStringバッファで同じ値のオブジェクトを探します.最初のプログラムでは、s 1が先にプールに配置されているので、s 2が作成されたとき、プログラムは同じ値を持つs 1を見つけてs 2をs 1に引用したオブジェクト「Monday」の2段目のプログラムでnewオペレータを使って、彼ははっきりとプログラムに「新しいものがほしい!古いものは要らない!」と言った.新しいMonday Stingオブジェクトがメモリに作成されます.彼らの値は同じですが、位置が異なり、池で泳いで岸辺で休んでいます.いや、資源の浪費だ.同じなのに分けて何をしなければならないのか.4.プログラムの再変更:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
s2 = s2.intern();
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}
今回加入:s 2=s 2.intern();プログラム出力:s 1==s 2 s 1 equals s 2元、(java.lang.Stringのintern()メソッド「abc」.intern()メソッドの戻り値は文字列「abc」で、表面的にはこのメソッドは役に立たないように見えます.しかし、実際には、文字列プールにabcという文字列が存在するかどうかをチェックし、存在する場合はプールの文字列を返します.存在しない場合、このメソッドは「abc」を文字列プールに追加し、参照を返します.)