String str="i"与 String str=new String(“i”)一样吗?
要想知道二者是否一样,我们只需要通过==进行比较,为什么不用equals的原因,大家可以认真阅读这篇文章
测试代码如下:
public class Test1 {
public static void main(String[] args) {
String str1="i";
String str2=new String("i");
System.out.println(str1==str2);
}
}
运行结果如下:
它们的的值都是为"i",为什么结果为false呢?
原因为如下:
String str="i"
;是采用字符串常量的方式创建对象,在Java中,String类型的对象使用率非常高,但我们在编写程序的过程中,主要关心的是String对象的值,为了避免频繁的创建与销毁String对象,JVM为了提升性能和减少内存开销,在内存中维护了一段特殊的空间称为
字符串对象池,它的工作原理是这样的
,创建一个字符串时,JVM首先会检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放至字符串常量池中,并返回新创建的字符串的引用地址,但是字符串对象池只对字符串常量的方式创建字符串对象适用。
而String str=new String(“i”)
采用的是构造方法的方式创建字符串对象,new关键字会在堆内存开辟空间,即使已经存在具有相同字符序列的字符串常量,它还是会创建一个新的字符串对象。
由于二者创建对象方式的不同导致创建出的对象,虽然值相同,但并不是同一个对象,因此它们并不一样!