String对于我们来说,是熟悉的不能再熟悉了,但越是熟悉,越容易忽略。
对此,就针对这个特意去探究了下几种场景,在此记录下
场景一
1 String a = "hello world"; 2 String d = "hello"; 3 String b = "hello"; 4 String c = b + " world"; 5 System.out.println(b.equals(d)); 6 System.out.println(b == d); 7 System.out.println(a.equals(c)); 8 System.out.println(a == c);
这时候大家可以分析一波,5,7应该是true,至于6和8则需要犹豫下了。
直接运行,发现答案对应从5-8是true true true false
细想下就知道了,String是有一个常量池的,所以6是true,而8是两个不同的对象地址了,相加是指向不同位置了,接下来我们在验证下一个场景
场景二
1 String str1 = "what a nice day"; 2 String str2 = new String("what a nice day"); 3 System.out.println(str1.equals(str2)); 4 System.out.println(str1 == str2);
答案是true和false,同样的 ,你因为你new了一个对象,所以第二种未false
场景三
1 String str11 = "what"; 2 String str22 = str11.concat(" a nice day"); 3 System.out.println("what a nice day".equals(str22)); 4 System.out.println("what a nice day" == str22); 5 System.out.println("what a nice day" == str22.intern());
这次3,4,5对应的是true,false,true
至于5为什么为true,看下源码注释就知道了
当他们在同一个常量池时,会返回equals相同的值,所以结果和equals一样
以前我们所忽视的,现在看来还是有点意思的,需要多试验探讨下。
原文:https://www.cnblogs.com/xzshare/p/12255005.html