頭が痛い==とequals
JAVA中==とequalsは頭の痛い問題で、今日1篇の関連する良い文章を見て、我慢できずに摘み取りました:
この話題についてネット上の資料は少なくありませんが、「==比較引用、equalsは比較引用の対象です」という言葉で、多くの友达が本当に理解していることを知りません.ここで私はこの問題に対する理解について話します.
ここでは主に==についてお話しします.まず、コードを見てみましょう.
このコードの答えを知っていますか.ほほほ、自分を騙さないで、やってみましょう!
プログラム出力結果:falsetruefalsetruetruetalsefalse
答えを見て、私はいくつかの友达が多少退屈になると思います.ここでは、前の文の大部分の友达が理解できるはずです.str 1とstr 2の定義から見ると、str 1=「abc」ここの「abc」は定数です.str 1参照を作成するときは、まず文字定数プールに行って「abc」という定数があるかどうかを見ます.定数ストレージスペースにスペースストレージ「abc」を開いて定数を参照しないで、存在する場合は直接参照します.str2 = new String("abc");newキーワードを使用すると、java仮想機会はスタックに直接メモリ空間を開き、「abc」を保存します.したがってstr 1とstr 2は同じメモリアドレスを指すわけではない.ただし、それぞれ参照するメモリブロックの値は同じです.==メモリ空間アドレス(すなわち参照)が同じかどうかを比較するために使用され、equalsは参照されたメモリブロックの値を比較するため、前の4つの文の出力が容易に得られる理由です.最初の文をtrueとして入力する場合は、System.out.println(str 1==str 2.intern()に変更します.internメソッドは、文字定数プールの等しい値を取り出し、なければ仮想マシンが自動的に作成されます.str 8=「a」+「b」を見てみましょう.この言葉を見て皆さんに質問したいのですが、定数と定数は何に等しいですか?ほほほ、もちろん定数に等しいです.
この点はコンパイル時に決定され、str 8が作成されると「a」+「b」が「ab」としてプールに入り、見つかったら直接それを指します.したがってstr 7とstr 8は根本的に同じメモリを指し,すべての==とequals判断が等しい.
str 9は定数に変数を加える問題で、定数に変数を加えると必ず変数になるので、String str 9=“a”+str 6;String str 9=new String(「ab」)に相当する.これで最後の2つの文の出力がわかりますが、実はこれは簡単に言えば2つの文で要約することができます.
定数+定数=定数、
プールに入る、変数+定数=変数、プールに入らない!
はい、説明を見てから、もう一度練習します.
答え:
d:\>java Testtrue true true true false true===============================================truefalsetruefalsetruefalse
この話題についてネット上の資料は少なくありませんが、「==比較引用、equalsは比較引用の対象です」という言葉で、多くの友达が本当に理解していることを知りません.ここで私はこの問題に対する理解について話します.
ここでは主に==についてお話しします.まず、コードを見てみましょう.
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
String str3 = new String();
String str4 = new String("");
System.out.println(str1 == str2);// ①
System.out.println(str1.equals(str2));// ②
System.out.println(str3 == str4);// ③
System.out.println(str3.equals(str4));// ④
String str5 = "a";
String str6 = "b";
String str7 = "ab";
String str8 = "a" + "b";
String str9 = "a" + str6;
System.out.println(str7 == str8);// ⑤
System.out.println(str7 == str9);// ⑥
System.out.println(str7 == str5 + str6);// ⑦
}
このコードの答えを知っていますか.ほほほ、自分を騙さないで、やってみましょう!
プログラム出力結果:falsetruefalsetruetruetalsefalse
答えを見て、私はいくつかの友达が多少退屈になると思います.ここでは、前の文の大部分の友达が理解できるはずです.str 1とstr 2の定義から見ると、str 1=「abc」ここの「abc」は定数です.str 1参照を作成するときは、まず文字定数プールに行って「abc」という定数があるかどうかを見ます.定数ストレージスペースにスペースストレージ「abc」を開いて定数を参照しないで、存在する場合は直接参照します.str2 = new String("abc");newキーワードを使用すると、java仮想機会はスタックに直接メモリ空間を開き、「abc」を保存します.したがってstr 1とstr 2は同じメモリアドレスを指すわけではない.ただし、それぞれ参照するメモリブロックの値は同じです.==メモリ空間アドレス(すなわち参照)が同じかどうかを比較するために使用され、equalsは参照されたメモリブロックの値を比較するため、前の4つの文の出力が容易に得られる理由です.最初の文をtrueとして入力する場合は、System.out.println(str 1==str 2.intern()に変更します.internメソッドは、文字定数プールの等しい値を取り出し、なければ仮想マシンが自動的に作成されます.str 8=「a」+「b」を見てみましょう.この言葉を見て皆さんに質問したいのですが、定数と定数は何に等しいですか?ほほほ、もちろん定数に等しいです.
この点はコンパイル時に決定され、str 8が作成されると「a」+「b」が「ab」としてプールに入り、見つかったら直接それを指します.したがってstr 7とstr 8は根本的に同じメモリを指し,すべての==とequals判断が等しい.
str 9は定数に変数を加える問題で、定数に変数を加えると必ず変数になるので、String str 9=“a”+str 6;String str 9=new String(「ab」)に相当する.これで最後の2つの文の出力がわかりますが、実はこれは簡単に言えば2つの文で要約することができます.
定数+定数=定数、
プールに入る、変数+定数=変数、プールに入らない!
はい、説明を見てから、もう一度練習します.
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((hello == Other.hello) + " ");
System.out.print((hello == ("Hel" + "lo")) + " ");
System.out.print((hello == ("Hel" + lo)) + " ");
System.out.println(hello == ("Hel" + lo).intern());
System.out.println("===============================================");
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = c.intern();
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);
System.out.println(b == c);
System.out.println(b == d);
System.out.println(c == d);
}
}
class Other {
static String hello = "Hello";
}
答え:
d:\>java Testtrue true true true false true===============================================truefalsetruefalsetruefalse