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; 
          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が一度も新しいオブジェクトではない.