String使用 == 和 equal

来源:互联网 发布:地图开疆 知乎 编辑:程序博客网 时间:2024/06/15 05:47

String作为基本数据类型:String str = “string”;
String作为一个对象:String str = new String(“string”);
== :比较的是两个String类型的变量的引用,即是否是同一块内存地址;
Equal:继承自Object对象,但进行了重写;比较的是字符串的内容是否一致;
———————————————
String s1 = new String(“Hello”);
String s2 = new String(“Hello”);

s1 == s2 false
s1.equals(s2) true
s1和s2都是通过new创建了新的String对象,分别被分配了一块新的独立的内存堆;
———————————————
String s1 = new String(“Hello”);
String s2 = s1;

s1 == s2 true
s1.equals(s2) true

s1创建了新对象,直接把这个引用给了s2;
——————————————
String s1 = “Hello”;
String s2 = “Hello”;

s1 == s2 true
s1.equals(s2) true
不是用new创建的,JVM不会为其创建新的内存堆,而是去String缓冲池寻找;
**首先为s1寻找String缓冲池内是否有与”Hello”相同值的String对象存在,此时String缓冲池内是空的,没有相同值的String对象存在,所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String(“Hello”);。然后把此String对象的引用赋值给s1。
接着为s2寻找String缓冲池内是否有与”Hello”相同值的String对象存在,此时虚拟机找到了一个与其相同值的String对象,这个String对象其实就是为s1所创建的String对象。既然找到了一个相同值的对象,那么虚拟机就不在为此创建一个新的String对象,而是直接把存在的String对象的引用赋值给s2。**

String方法的intern()方法应用:

String s = new String(“Hello”);
s = s.intern();
————————————
String s = “Hello”;
上下两段代码等同;
过程:上边的就是,先创建一个String内存堆,调用intern()方法,虚拟机会在String缓冲池内寻找与此Stirng对象所封装的字符串内容相同值的String对象,然后把引用赋值给引用原来的那个String对象的String类型变量。如果String缓冲池内没有与此String对象所封装的字符串内容相同值的String对象存在,那么虚拟机会为此创建一个新的String对象,并把其引用赋值给引用原来的那个String对象的String类型变量。这样就达到了共享同一个String对象的目的,而原先那个通过new关键字所创建出的String对象将被抛弃并被垃圾回收器回收掉。

降低了内存的使用消耗,提高了性能;
在String对象的比较上也同样更方便,因为相同的String对象将被共享,所以要判断两个String对象是否相同,则只需要使用”==”来比较,而无需再使用equals()方法来比较,这样不但使用起来更方便,而且也提高了性能,因为String对象的equals()方法将会对字符串内容拆解,然后逐个进行比较,如果字符串内容十分大的话,那么这个比较动作则大大降低了性能。

原创粉丝点击