Java String intern()

时间:2020-02-23 14:34:32  来源:igfitidea点击:

Java String intern()是本机方法。
当在String对象上调用intern()方法时,如果字符串池已经具有具有相同值的字符串,则将返回池中对String的引用。
否则,此字符串对象将添加到池中,并返回引用。

Java String intern()

让我们尝试通过一个简单的程序来了解intern()方法。

package com.theitroad.string;

public class StringIntern {

	public static void main(String args[]) {

		String s1 = new String("abc"); //goes to Heap Memory, like other objects
		String s2 = "abc"; //goes to String Pool
		String s3 = "abc"; //again, goes to String Pool

		//Let's check out above theories by checking references
		System.out.println("s1==s2? " + (s1 == s2)); //should be false
		System.out.println("s2==s3? " + (s2 == s3)); //should be true

		//Let's call intern() method on s1 now
		s1 = s1.intern(); //this should return the String with same value, BUT from String Pool

		//Let's run the test again
		System.out.println("s1==s2? " + (s1 == s2)); //should be true now

	}
}

输出:

s1==s2? false
s2==s3? true
s1==s2? true

字符串intern()示例说明

  • 当我们使用new运算符时,在堆空间中创建String。
    因此,将在堆内存中创建值为" abc"的" s1"对象。

  • 当我们创建字符串文字时,它是在字符串池中创建的。
    因此," s2"和" s3"是指池中具有值" abc"的字符串对象。

  • 在第一个打印语句中,s1和s2引用不同的对象。
    因此,s1 == s2返回" false"。

  • 在第二个打印语句中,s2和s3引用池中的同一对象。
    因此,s2 == s3返回" true"。

  • 现在,当我们调用s1.intern()时,JVM会检查池中是否存在值为" abc"的字符串?由于池中有一个字符串对象,其值为" abc",因此将返回其引用。

  • 注意,我们正在调用s1 = s1.intern(),因此s1现在引用的值为值" abc"的字符串池对象。

  • 此时,所有三个字符串对象都引用字符串池中的同一对象。
    因此s1 == s2现在返回" true"。