我们都知道 Strings 在 Java 中是不可变的( immutable),因此 JVM 可以通过访问这个字符串的引用,或者我们可以借用指针的这个概念来访问 String 字符串。
通过指针访问字符串值的这个过程就可以称为引用(interning)。
当我们在内存中创建一个字符串的时候,JVM 将会根据你创建字符串的值在内存中进行查找有没有和你创建值相同的 String 对象已经被创建了。
如果,JVM 找到了这个对象的话,JVM 就将会为你创建的对象返回已经存在 String 的地址的引用,而不会继续申请新的内存空间,以便于提高内存的利用率。
如果,JVM 没有找到与创建对象相同的值的话,JVM 将会申请内存空间并且创建这个 String 对象,然后将新创建的这个 String 的对象进行返回,这个过程就称为引用(interned)。
让我们使用下面的方法进行验证:
@Test
public void whenCreatingConstantStrings_thenTheirAddressesAreEqual() {
String constantString1 = "HoneyMoose";
String constantString2 = "HoneyMoose";
assertThat(constantString1).isSameAs(constantString2);
}
上面的方法将会通过,原因是 constantString2 在创建的时候,将会得到的是 constantString1 内存地址的引用。
因此上面 2 个字符串是完全相同的。