我们在创建String对象时,如果使用new()创建String对象,每次String对象打开时JVM都会在堆内存中为我们创建腾出一个储物空间用于储物。但是,如果我们使用赋值方式创建一个String对象,JVM会先在StringPool中查找我们赋值的值,如果找到,就会返回一个已经存在的值的引用。如果未找到,则创建一个新的String对象并返回对已创建对象的引用。例如,如果我们使用赋值方法创建值“HoneyMoose”,我们可能会得到现有值的内存地址,以便我们重新使用分配的内存,也可能是一个全新的内存地址。简单来说,这两个方法创建的String字符串都是String对象。唯一不同的是每次new操作都会给一个新的地址,而其他操作不能每次都是新的内存地址。为了解释这种情况,我们可以用一道数据面试基础题来解释为什么在使用==进行字符串比较时有时会得到False的值。因为,我们都知道==比较的是地址,而不是String中存储的值。考虑以下代码:Stringfirst="HoneyMoose";Stringsecond="HoneyMoose";System.out.println(第一==第二);//True在上面的初始化后比较中,我们会得到True的值,因为上面2个String的地址是一样的。接下来我们使用new关键字新建两个String对象,然后比较String对象的引用:Stringthird=newString("HoneyMoose");Stringfourth=newString("HoneyMoose");System.out.println(第三==第四);//false也是一样,我们用new来创建对象,可以看到上面创建的String的地址是不一样的。所以使用==计算结果为False。Stringfifth="HoneyMoose";Stringsixth=newString("HoneyMoose");System.out.println(fifth==sixth);//False一般来说,在初始化String对象的时候,我们推荐使用texttoString对象初始化,这样可以让JVM在String初始化之前有判断的机会,完成内存优化,而不用重复创建同一个对象。https://www.ossez.com/t/java-...
