文
章
目
录
章
目
录
Java 中的String.intern ()返回字符串池中存在的相等字符串文字的引用。如果字符串池中存在现有字符串文字,则返回其引用。否则,创建一个具有相同内容的新字符串,并返回新字符串的引用。
请注意,在内部,字符串相等性是使用String.equals()方法检查的。
1.什么是字符串常量池?
字符串常量池是堆内存中的保留内存区域,Java 用于存储字符串常量。请注意,Java 字符串默认是不可变的。
Java 在字符串池中存储每个不同字符串值的且仅一份副本。它有助于在程序执行期间重用字符串以节省内存。正在运行的程序中可能会有很多对某个字符串的引用,但字符串池中只会有一份字符串的副本。
2. 字符串文字和对象
在Java中,我们可以通过两种方式创建字符串。第一种方法是创建字符串文字,第二种方法是使用new关键字创建 String 对象。
String str1 = "hello world"; //String 字面量
String str2 = new String("hello world"); //String 对象
- 当我们使用文字创建字符串时(也是推荐的),字符串文字总是直接创建到字符串池中。
- 当我们使用new关键字创建字符串时,该字符串将在普通堆内存中创建。
3. String.intern()方法
String.intern ()是一个本机方法,它返回对字符串池中存在的相等字符串文字的引用。请注意,所有字符串文字都会在字符串池中自动创建,因此intern()方法对于使用new关键字创建的String对象很有用。
下面的程序中,name变量包含了对堆中String对象的引用。当我们调用intern()时,会在字符串池中创建一个内容为“Alex”的新字符串文字。变量str包含对池中创建的字符串文字的引用。
String strObject = new String("Alex");
String strLiteral = strObject.intern();
Assertions.assertFalse(strObject == strLiteral); //指向不同的对象
Assertions.assertTrue(strObject.equals(strLiteral)); //相同内容值
任何使用相同内容创建的新字符串文字都将指向字符串池中的对象。
String newLiteral = "Alex";
Assertions.assertTrue(strLiteral == newLiteral);
通常,任何两个字符串 s1 和 s2,s1.intern() == s2.intern()当且仅当s1.equals(s2)为true时才为true。
4.结论
在本 Java 教程中,我们学习了如何实习字符串,以及字符串文字与字符串对象有何不同。String.intern ()是本机实现的方法,提供非常高的性能。