Java教程-Java String intern()方法

Java String类的intern()方法返回被interned(内部化)的字符串。它返回字符串的规范表示。
它可以用于从内存中返回字符串,如果字符串是使用new关键字创建的。它在字符串常量池中创建堆字符串对象的精确副本。
语法
intern()方法的语法如下:
public String intern()
返回值
interned(内部化)的字符串
String.intern()方法的需要和工作原理
当在Java中创建字符串时,它占用堆中的内存。我们也知道String类是不可变的。因此,无论我们使用new关键字创建字符串时,都会为相应的字符串在堆中分配新的内存,而与数组的内容无关。考虑以下代码片段。
String str = new String("Welcome to JavaTpoint.");
String str1 = new String("Welcome to JavaTpoint");
System.out.println(str1 == str); //打印错误
println语句打印false,因为每个字符串字面量都分配了单独的内存。因此,内存中创建了两个新的字符串对象,即str和str1,它们具有不同的引用。
我们知道在Java中创建对象是一个昂贵的操作。因此,为了节省时间,Java开发人员提出了字符串常量池(SCP)的概念。SCP是堆内存中的一个区域,它包含唯一的字符串。为了将字符串放入字符串池中,需要调用intern()方法。在在字符串池中创建对象之前,JVM会检查字符串是否已经存在于池中。如果字符串已经存在,则返回其引用。
String str = new String("Welcome to JavaTpoint").intern(); // 语句 - 1
String str1 = new String("Welcome to JavaTpoint").intern(); // 语句 - 2
System.out.println(str1 == str); // 打印 true
在上面的代码片段中,intern()方法在String对象上被调用。因此,内存被分配到了SCP中。对于第二个语句,由于str和str1的内容相同,因此不会创建新的字符串对象。因此,返回了在第一个语句中创建的对象的引用给str1。因此,str和str1都指向相同的内存。因此,打印语句输出true。
Java String intern()方法示例
文件名:InternExample.java
public class InternExample{
public static void main(String args[]){
String s1=new String("hello");
String s2="hello";
String s3=s1.intern();//从池中返回字符串,现在它将与 s2 相同
System.out.println(s1==s2);//false 因为引用变量指向不同的实例
System.out.println(s2==s3);//true 因为引用变量指向同一个实例
}}
输出:
false
true
Java String intern()方法示例2
让我们看一个更多的例子来理解字符串内部化的概念。
文件名:InternExample2.java
public class InternExample2 {
public static void main(String[] args) {
String s1 = "Javatpoint";
String s2 = s1.intern();
String s3 = new String("Javatpoint");
String s4 = s3.intern();
System.out.println(s1==s2); // True
System.out.println(s1==s3); // False
System.out.println(s1==s4); // True
System.out.println(s2==s3); // False
System.out.println(s2==s4); // True
System.out.println(s3==s4); // False
}
}
输出:
true
false
true
false
true
false
需要记住的要点
关于intern()方法,有一些重要的要点需要记住:
字符串字面量始终调用intern()方法,无论是否将intern()方法与字符串字面量一起使用。例如,
String s = "d".intern(); String p = "d"; //编译器将其视为 String p = "d".intern(); System.out.println(s == p); // 打印true
每当我们使用new关键字创建一个String对象时,会创建两个对象。例如,
String str = new ("Hello World");
在这里,由于使用了new关键字,所以一个对象在SCP之外的堆内存中被创建。由于我们也获得了字符串字面量("Hello World"),因此,只要字面量"Hello World"在SCP中不存在,就会在SCP中创建一个对象。