Java字符串的==

首先,==比較的是字符串的地址。

我們知道以下的結果爲true,即直接用""包裹字符串賦值的,只要值相等,地址也相等。

	String s1="aa"+"bb";
	String s2="aabb";
	System.out.println(s1==s2);

接下來看下面這個:結果爲false。

如果是String s5="b"+new String("aa");結果依然是false。

原因:直接用字符串或new String()賦值的,字符串會被放入字符串常量池,下一次賦值時相等的會直接從相同地址取出來。如果是一個字符串“”和一個變量或2個變量相加,像下面這種,字符串常量池有b和aa,到s6賦值時常量池纔有了baa,此前的s5只是指向一個堆中字符串值爲baa的對象。所以,他們的地址當然不相等。

	String temp1="aa";
	String s5="b"+temp1;
	String s6="baa";
	System.out.println(s5==s6);//false

同樣爲false的比如這個大家都知道:其實在s1的時候1就已經放入常量池了,s2的時候確實是從常量池取的。但是s1的指向仍然是堆中值爲“1”的對象。

	String s1=new String("1");
	String s2="1";
	System.out.println(s1==s2);

String中有一個方法intern:根據方法介紹,如果常量池中沒有則將其放入常量池,如果有了則返回相應引用。

再看以下例子:根據以上介紹,字符串1在new的時候就已經在常量池了,intern的作用並不會將它放入常量池,它的作用是返回常量池中“1”的引用給s1,注意此時s1指向的就不再是堆中的對象了。

	String s1=new String("1").intern();
	String s2="1";
	System.out.println(s1==s2);//true

從另一個方面來驗證一下:此時返回false。這個intern毫無作用,因爲沒有東西去接收它的返回值。

	String s1=new String("1");
	s1.intern();
	String s2="1";
	System.out.println(s1==s2);//false

 以下2種方式都返回true。

第一種好理解些,直接將字符串放入常量池,並將返回值,即常量池對應的引用賦給了s9

第二種在jdk1.7之前是false的。在jdk1.7之後intern方法調用是將s9指向對象的地址放入了常量池的,也許第一種放入的也是堆中對象xxhh的地址,即s10賦值時將引用s9賦給了它。

	String temp3="hh";
	String s9=("xx"+temp3).intern();//這裏可以先賦值再用s9調用intern
	String s10="xxhh";
	System.out.println(s9==s10);//true

        String temp3="hh";
	String s9="xx"+temp3;
	s9.intern();
	String s10="xxhh";
	System.out.println(s9==s10);//true

如果交換一下順序,如下,則爲false。意思也很好理解,s10的時候xxhh放入常量池並返回引用。s9再調用intern的時候常量池已經有了xxhh,並不會將s9指向堆中對象的地址放入常量池。s9仍然指向堆中對象的。除非用一個變量接收intern的返回值去比較,這樣的話才爲true。

		String temp3 = "hh";
		String s9 = "xx" + temp3;
		String s10 = "xxhh";
		s9.intern();
		System.out.println(s9 == s10);// false

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章