Java String 类 intern() 方法返回内部字符串。它返回字符串的规范表示。
如果它是由新关键字创建的,它可用于从内存中返回字符串。它在字符串常量池中创建堆字符串对象的精确副本。
签名
intern() 方法的签名如下:
public String intern()
返回
字符串
String.intern() 方法的需要和工作
在 Java 中创建字符串时,它会占用堆中的内存。此外,我们知道 String 类是不可变的。因此,每当我们使用 new 关键字创建字符串时,都会在堆中为相应的字符串分配新的内存,这与数组的内容无关。考虑以下代码片段。
String str = new String("Welcome to JavaTpoint.");
String str1 = new String("Welcome to JavaTpoint");
System.out.println(str1 == str); // prints false
println 语句打印 false,因为为每个字符串文字分配了单独的内存。因此,在内存中创建了两个新的字符串对象,即 str 和 str1。持有不同的引用。
我们知道在 Java 中创建对象是一项代价高昂的操作。因此,为了节省时间,Java 开发人员提出了字符串常量池 (SCP) 的概念。 SCP 是堆内存中的一个区域。它包含唯一的字符串。为了将字符串放入字符串池,需要调用 intern() 方法。在字符串池中创建对象之前,JVM 会检查字符串是否已经存在于池中。如果字符串存在,则返回其引用。
String str = new String("Welcome to JavaTpoint").intern(); // statement - 1
String str1 = new String("Welcome to JavaTpoint").intern(); // statement - 2
System.out.println(str1 == str); // prints true
在上面的代码片段中,对 String 对象调用了 intern() 方法。因此,内存分配在SCP中。对于第二条语句,没有创建新的字符串对象,因为 str 和 str1 的内容相同。因此,为 str1 返回在第一条语句中创建的对象的引用。因此, str 和 str1 都指向相同的内存。因此,print 语句打印 true。
Java 字符串 intern() 方法示例
文件名:InternExample.java
public class InternExample{
public static void main(String args[]){
String s1=new String("hello");
String s2="hello";
String s3=s1.intern();//returns string from pool, now it will be same as s2
System.out.println(s1==s2);//false because reference variables are pointing to different instance
System.out.println(s2==s3);//true because reference variables are pointing to same instance
}}
输出:
false true
Java 字符串 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"; // compiler treats it as String p = "d".intern();
System.out.println(s == p); // prints true
2) 每当我们使用 new 关键字创建 String 对象时,都会创建两个对象。例如,
String str = new ("Hello World");
在这里,由于使用了 new 关键字,在 SCP 之外的堆内存中创建了一个对象。因为我们也得到了字符串文字 ("Hello World");因此,如果文字 "Hello World" 已经不存在于 SCP 中,则会在 SCP 内创建一个对象。
相关用法
- Java String indexOf()用法及代码示例
- Java String indent()用法及代码示例
- Java String isEmpty()用法及代码示例
- Java String valueOf()用法及代码示例
- Java String getChars()用法及代码示例
- Java String substring()用法及代码示例
- Java String replace()用法及代码示例
- Java String contains()用法及代码示例
- Java String copyValueOf()用法及代码示例
- Java String toString()用法及代码示例
- Java String endsWith()用法及代码示例
- Java String split()用法及代码示例
- Java String lines()用法及代码示例
- Java String repeat()用法及代码示例
- Java String strip()用法及代码示例
- Java String lastIndexOf()用法及代码示例
- Java String equals()用法及代码示例
- Java String replaceAll()用法及代码示例
- Java String subSequence()用法及代码示例
- Java String startsWith()用法及代码示例
注:本文由纯净天空筛选整理自 Java String intern()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。