天天看點

比較兩個字元串是否相等(反編譯一目了然)

Demo1

String s1 = “a” + “b” + “c”;

String s2 = “abc”;

System.out.println(s1 == s2);

System.out.println(s1.equals(s2));

反編譯(後):
        String s1 = "abc";
		String s2 = "abc";
		System.out.println(s1 == s2);
		System.out.println(s1.equals(s2));
           

Demo2

String s1 = “ab”;

String s2 = “abc”;

String s3 = s1 + “c”;

System.out.println(s3 == s2);

System.out.println(s3.equals(s2));

反編譯(後):
	    String s1 = "ab";
        String s2 = "abc";
        String s3 = (new StringBuilder()).append(s1).append("c").toString();
        System.out.println(s3 == s2);
        System.out.println(s3.equals(s2));
           

分析:通過反編譯可以明顯看出,Demo1中字元串拼接時沒有變量參與s1和s2對象位址完全相等(常量池中),而Demo2中JVM(java虛拟機)通過生成StringBuilder對象,拼接而成的字元串對象明顯不是同一個位址(堆中)。