Java中判斷String字符串是否相等


一定要注意一下幾點:

  • 只要使用引用變量 a 來加一個常量池內容"xxx"或者引用變量,都是放在堆里
  • intern()返回的是常量池中字符串的引用,而不是堆中字符串的引用
首先看第一個字符串比較的例子
public static void main(String[] args){

        String a = "a";
        String b = "b";
        // 這里的a + b應該是放在堆里的對象,常量池沒有
        String c = a + b;
        // 這里的a + b應該是放在常量池里面的
        String d = "a" + "b";
        // 經測試,發現只要有使用引用變量a加上一個常量池內容"xxx"或者引用變量,都會放在堆里
        String e = a + "b";
    	// 注意intern()返回的是常量池中字符串的引用,而不是堆中字符串的引用
        String f = c.intern();
        String g = "ab";
        String h = new String("ab");

        System.out.println(a + b == "ab");  // false
        System.out.println(c == "ab");      // false
        System.out.println(c == a + b);     // false
        System.out.println(c == h);         // false
        System.out.println(c == f);         // false
        System.out.println(d == e);         // false
        System.out.println(d == f);         // true
        System.out.println(d == g);         // true
        System.out.println(f == g);         // true
    
}
下面看另外一個關於創建了幾個對象的例子:
public static void main(String[] args){

	String a = "abc";
    String b = "abc";
    String c = new String("abc");
    /*
    	注意:這個雖然看起來似乎要在常量池新建三個字符串對象:"ab","c",和拼接生成的"abc"
        但是結果是內存中僅有生成的,前面的兩個算是過程變量。這反編譯得出來的結論!
        這樣做實際上是一種優化,避免了創建多余的字符串對象,也沒有發生字符串拼接問題
    */
    String d = "ab" + "c";

    System.out.println("a == b" + " " + (a == b));  // true 
    System.out.println("a == c" + " " + (a == c));  // false
    System.out.println("a == d" + " " + (a == d));  // true
    System.out.println("b == c" + " " + (b == c));  // false
    System.out.println("b == d" + " " + (b == d));  // true
    System.out.println("c == d" + " " + (c == d));  // false
}

  這個例子主要強調了類似於String d = "ab" + "c";String d = new String("ab" + "c");創建了幾個對象的問題。答案:前者1個(常量池創建),后者2個(常量池、堆都要創建)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM