因为构造 String 对象有几种不同的方法,我们可以通过直接赋值的方式构造 String 对象,我们也可以通过 new 的方式来构造一个 String 对象。 在这里我们需要说说如果使用new这个关键字来
因为构造 String 对象有几种不同的方法,我们可以通过直接赋值的方式构造 String 对象,我们也可以通过 new 的方式来构造一个 String 对象。
在这里我们需要说说如果使用 new 这个关键字来构造的 String对象。
简单来说,如果你使用了 new 这个关键字来构造 String 对象的话,不管 String 对象中的值是不是相同,JVM 都会为构造的对象开辟存储空间,这个存储空间在 JVM 的 heap 中。
因此每个使用 new 构造的 String 对象都会有自己的内存地址。
让我们来看看下面的代码:
@Testpublic void whenCreatingStringsWithTheNewOperator_thenTheirAddressesAreDifferent() {
String newString1 = new String("HoneyMoose");
String newString2 = new String("HoneyMoose");
assertThat(newString1).isNotSameAs(newString2);
logger.info("newString1 Address: {}", System.identityHashCode(newString1));
logger.info("newString2 Address: {}", System.identityHashCode(newString2));
}
上面的代码将会输出:
16:03:38.916 [main] INFO c.o.stringpool.StringPoolUnitTest - newString1 Address: 42907547816:03:38.919 [main] INFO c.o.stringpool.StringPoolUnitTest - newString2 Address: 1802066694
我们可以看到使用 new 以后的 String 的地址空间是不一样的。
https://www.ossez.com/t/java-string-pool/14017