关于String字符串的比较

1.

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

原因: new String() 对象会在堆上开辟一个空间,s1指向这个地址0x1111。
再 new String()对象又会在堆上开辟一个空间,s2指向这个地址0x1112。
== 如果基本类型比较字面值,如果是引用类型比较引用地址。
false毫无疑问。
System.out.println(s1.equals(s2));
由于string重写了equals方法(具体可看jdk源码),同一个对象就直接返回true,
重写了比较string的值是否相同,相同则返回true。

2.

String s1 = "String";  
String s2 = "String";  
System.out.println(s1 == s2 ); true 
System.out.println(s1.equals(s2));  true  

为什么这个结果?
那么来分析一下。首先这两个String对象都是作为一个基本类型来使用的,
而不是通过new关键字来创建的,因此虚拟机不会为这两个String对象分配新的内存堆,而是到String缓冲池中来寻找。
首先为s1寻找String缓冲池内是否有与"Hello"相同值的String对象存在,
此时String缓冲池内是空的,没有相同值的String对象存在,
所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String(“String”);。
然后把此String对象的引用赋值给s1。
接着为s2寻找String缓冲池内是否有与"String"相同值的String对象存在,
此时虚拟机找到了一个与其相同值的String对象,这个String对象其实就是为s1所创建的String对象。
既然找到了一个相同值的对象,那么虚拟机就不在为此创建一个新的String对象,
而是直接把存在的String对象的引用赋值给s2。
这里既然s1和s2所引用的是同一个String对象,即自己等于自己,所以以上两种比较方法都返回ture。

String s = new String("Hello");
s = s.intern();
以上代码段的功能实现可以简单的看成如下代码段:
String s = "Hello";

先在堆上创建了一个对象,s.intern方法会池中创建一个对象。字符串有了一个 “备份”

intern方法 返回值 jdk源码如此说明的。

a string that has the same contents as this string, but is
 guaranteed to be from a pool of unique strings.

返回一个相同内容的字符串,但是保证是池中唯一的字符串。

如果你有很大的字符串,里面可能有许多重复字符串,因为字符只会在缓存池创建一次,相同字符串就会从池中取了。
使用intern优化字符串,能够减少内存开销。(只是理论分析。)
intern方法优化字符串

参考博客 :https://www.cnblogs.com/baotong-9396/p/7182906.html

猜你喜欢

转载自blog.csdn.net/huang__2/article/details/83020071