String等号==比較とequals比較
1748 ワード
JAVAではデータ型が大きく2つに分けられています.1つは基本データ型、もう1つは参照データ型です.基本データ型は4つの整数型(byte、short、int、long)、2つの浮動小数点数型(float、double)、1つの文字型(char)、1つのブール型(boolean)の8種類に分けられています. 参照データ型は私たちがよく言うクラスで、javaではStringも参照タイプです. ==比較を使用すると、次の2つのケースに分けられます. 1,等号の左右が基本データ型の場合,それは値の比較である. 例: int a=1;
左右とも基本データ型なので、変数の値が等しいかどうかを比較します
2,等号程度が基本データ型でない場合,それはアドレスの比較である. 例:
1、
「aa」.equals(「aa」)/trueを返します.StringクラスはObjectオブジェクトのequalsを書き換えたため
2、
"=="はいずれもアドレス比較であり,なぜ2番目のa 1=a 2はtrueを返すのか.
なぜなら、「aa」のように付与された値がstackスタックに存在する場合、stackはスタック領域を検索し、同じ値がなければ新しい値を生成します.
new Stringは 出てきたオブジェクトはheapスタックに存在し、newが一度も新しいオブジェクトではない.
int b=1;
int c=2;
System.out.println(a==b); // true
System.out.println(a==c); // false
左右とも基本データ型なので、変数の値が等しいかどうかを比較します
2,等号程度が基本データ型でない場合,それはアドレスの比較である. 例:
1、
「aa」.equals(「aa」)/trueを返します.StringクラスはObjectオブジェクトのequalsを書き換えたため
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
2、
String a1=new String("aa"); String a2=new String("aa");System.out.println(a1==a2) // false
String a1="aa"; String a2="aa";
System.out.println(a1==a2)// true
"=="はいずれもアドレス比較であり,なぜ2番目のa 1=a 2はtrueを返すのか.
なぜなら、「aa」のように付与された値がstackスタックに存在する場合、stackはスタック領域を検索し、同じ値がなければ新しい値を生成します.
new Stringは 出てきたオブジェクトはheapスタックに存在し、newが一度も新しいオブジェクトではない.