学习是最好的投资!
String a = new String("abc"); a = a.intern(); String b = "abc"; if (a == b) { System.out.println("相等"); } else { System.out.println("不等"); }
你是呼叫了a.intern()方法,但是你又没有将返回结果重新赋值,a还是原来那个a。
a.intern()
a
字串相等用 equals() 判斷,Java 中這個題都考爛了噠!
equals()
a.intern();不會改變a字元的引用,他有個回傳值。 下面這樣才會相等
String b = a.intern();
String a = new String("abc");
這裡的a和"abc"是兩個對象,當呼叫intern 方法時,字元常數池中已經包含一個等於此物件的字串了,所以intern這個方法呼叫等於沒用,即使後面b="abc" ,b和a也不是同一個物件。
想要輸出相等的話,要嘛第一句變成:
String a = "abc";
要么第二句變成:
a = a.intern();
首先要知道一點是==操作判斷的是:是否a,b兩個物件或基本型別指向同一記憶體區域
String的底層實作是private final value[]String實例化時,實際上是透過System.arraycopy劃分一段連續記憶體保存char數組。
new String("abc")其實不推薦這種方法初始化String,實際實作起來比 a = "abc"多了一個步驟,底層步驟是
劃分記憶體空間,建立臨時數組temp
temp[0] = 'a';temp[1] = 'b';temp[2] = 'c';
建立數組value ,將value所指記憶體空間指向temp指向的記憶體空間,即 &value = &temp(若使用a = "abc"則不需要這步)
intern方法是jdk1.5提供的方法,用於記憶體最佳化的,相同String引用共同記憶體空間,實際上就是上述的第三步。這裡若要a,b相等,可以寫為
String a = "abc"; String b = "abc".intern(); 或者String b = a.intern();
實際上 進行的操作就是上述的第三步,即 b = a;
String b = "abc"實際的底層實作是:
劃分記憶體空間,建立數組value
value[0] = a.value[0];value[1] = a.value[0]';value[2] = a.value[0];
第二步驟中,String b中value[0]中的String a中的value[0]實際上指向的是同一個記憶體位址,因此實際上b.value[0] = a.value[0] = 'a',但b.value 不等於a.value,根本原因在於指向記憶體區域不同
推薦看一下String的源碼分析【JAVA源碼分析-Java.lang】String源碼分析
你是呼叫了
a.intern()
方法,但是你又没有将返回结果重新赋值,a
还是原来那个a
。字串相等用
equals()
判斷,Java 中這個題都考爛了噠!a.intern();不會改變a字元的引用,他有個回傳值。
下面這樣才會相等
這裡的a和"abc"是兩個對象,當呼叫intern 方法時,字元常數池中已經包含一個等於此物件的字串了,所以intern這個方法呼叫等於沒用,即使後面b="abc" ,b和a也不是同一個物件。
想要輸出相等的話,要嘛第一句變成:
要么第二句變成:
首先要知道一點是==操作判斷的是:是否a,b兩個物件或基本型別指向同一記憶體區域
String的底層實作是
private final value[]
String實例化時,實際上是透過System.arraycopy劃分一段連續記憶體保存char數組。
new String("abc")其實不推薦這種方法初始化String,實際實作起來比 a = "abc"多了一個步驟,底層步驟是
劃分記憶體空間,建立臨時數組temp
temp[0] = 'a';temp[1] = 'b';temp[2] = 'c';
建立數組value ,將value所指記憶體空間指向temp指向的記憶體空間,即 &value = &temp(若使用a = "abc"則不需要這步)
intern方法是jdk1.5提供的方法,用於記憶體最佳化的,相同String引用共同記憶體空間,實際上就是上述的第三步。這裡若要a,b相等,可以寫為
實際上 進行的操作就是上述的第三步,即 b = a;
String b = "abc"實際的底層實作是:
劃分記憶體空間,建立數組value
value[0] = a.value[0];value[1] = a.value[0]';value[2] = a.value[0];
第二步驟中,String b中value[0]中的String a中的value[0]實際上指向的是同一個記憶體位址,因此實際上b.value[0] = a.value[0] = 'a',但b.value 不等於a.value,根本原因在於指向記憶體區域不同
推薦看一下String的源碼分析
【JAVA源碼分析-Java.lang】String源碼分析