java - String.intern() 显示奇怪的结果,它是如何工作的
问题描述
我知道如果 String.intern() 不包含对象,它会将字符串添加到池中,但是如何解释结果。
下面的代码:
public static void main(String[] args) {
char[] abc = new char[]{'a','b','c'};
String str = new String(abc);
System.out.println(str == "abc");
str.intern();
System.out.println(str == "abc");
}
输出是:
错误的
错误的
但是,当代码如下:
public static void main(String[] args) {
char[] abc = new char[]{'a','b','c'};
String str = new String(abc);
str.intern();
System.out.println(str == "abc");
}
输出是:
真的
有什么不同。
解决方案
不同之处在于,当您String
在显式调用 之前使用文字“abc”时intern
,它是隐式实习的。
str.intern()
如果池中已经存在相等的值,则不会将引用的实例存储str
在字符串String
池中。
第一个片段:
System.out.println(str == "abc"); // "abc" is interned
str.intern(); // str is not stored in the pool
System.out.println(str == "abc"); // returns false
第二个片段:
str.intern(); // str is stored in the pool
System.out.println(str == "abc"); // returns true
来自实习生的 Javadoc:
字符串 java.lang.String.intern()
当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对此 String 对象的引用... 所有文字字符串和字符串值常量表达式都是 interned。
推荐阅读
- c - 从队列中删除所有项目
- python - 数据框在另一个数据框中查找重复项,然后从该行的另一列中提取一个值
- r - 错误:row_number() 只能在数据上下文中调用
- python - 为什么这些列表没有得到修改?
- c# - 如何验证从另一个应用程序生成的 JWT 令牌?
- javascript - 如何在 React Hooks 中的状态对象内设置对象键
- node.js - Node JS - Mongoose - 如何按 ID 正确连接两个集合的结果
- c - 要求用户在 C 中输入几个数字的正确方法是什么?
- apache-knox - 访问hadoop ui(端口为50070)或hbase ui(端口为16010)时如何将URL重定向到Apache knox网关(端口为8443)?
- javascript - 如何让 JavaScript 为模式生成 n 个 var 按钮