String使用 == 和 equal

xiaoxiao2021-02-27  239

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()方法将会对字符串内容拆解,然后逐个进行比较,如果字符串内容十分大的话,那么这个比较动作则大大降低了性能。

转载请注明原文地址: https://www.6miu.com/read-15749.html

最新回复(0)