java - 字符串实习生()方法
问题描述
据我所知, String s1 = new String("abc") 创建两个对象 -
- 一个在堆中
- 字符串常量池(SCP)中的另一个。
因此,每当我们使用“new”关键字创建字符串对象时,它都会在 SCP 中创建一个对象。
是否有可能在堆中存在 String 对象但在 SCP 中不存在?
- 如果否,那么 intern() 方法的用途是什么,因为它添加了 String 对象,如果它不存在于 SCP 中。
- 如果是,请您举个例子。
解决方案
intern() 方法通过查看预先存在的字符串字面量池,帮助使用 == 运算符比较两个 String 对象,它比 equals() 方法更快。
尽管默认情况下 Java 会自动实习所有字符串,但请记住,我们只需要在字符串不是常量时实习,并且我们希望能够快速将它们与其他实习字符串进行比较。intern() 方法应该用于使用 new String() 构造的字符串,以便通过 == 运算符比较它们。
包装测试;
公共类TestString {
public static void main(String[] args) {
String s1 = "Test";
String s2 = "Test";
String s3 = new String("Test");
final String s4 = s3.intern();
System.out.println(s1 == s2);
System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s3));
System.out.println(s3.equals(s4));
System.out.println(s1.equals(s4));
System.out.println(s1.equals(s3));
}
}
推荐阅读
- terraform - 刷新状态时出错:状态快照由 Terraform v0.15.0 创建,比当前 v0.12.18 更新
- sql - 从 GDELT 查询中提取主题或文本的 URL
- r - 在 R 中,如何仅使用加法公式在分类变量之间添加手动交互?
- c# - C# 和 C++ 数据封送处理之间的内存泄漏
- javascript - React Native WebView 渲染空白页
- cordova - 离子 OneSignal 通知中断
- webpack - (如何)你可以在 Webpack 编译钩子中操作 AST 吗?
- spring - 尝试使用 id strategy = GenerationType.SEQUENCE 且现有列标记为 @CreationTimestamp 的实体时出现意外行为
- linkedin - Linkedin API 发布预览问题
- c# - 如何处理使用 threading.timer 的库中的异常?