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()方法,有一些重要的要点需要记住:

  1. 字符串字面量始终调用intern()方法,无论是否将intern()方法与字符串字面量一起使用。例如,

    String s = "d".intern();  
    String p = "d"; //编译器将其视为 String p = "d".intern();  
    System.out.println(s == p); // 打印true  
  2. 每当我们使用new关键字创建一个String对象时,会创建两个对象。例如,

    String str = new ("Hello World");  

在这里,由于使用了new关键字,所以一个对象在SCP之外的堆内存中被创建。由于我们也获得了字符串字面量("Hello World"),因此,只要字面量"Hello World"在SCP中不存在,就会在SCP中创建一个对象。

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想