微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

String.Intern 方法只是向实习池添加对字符串的引用还是创建字符串的副本?

如何解决String.Intern 方法只是向实习池添加对字符串的引用还是创建字符串的副本?

假设我有一个字符串“str”。我想使用 String.Intern 方法实习它。我只是想知道,如果 'str' 的值尚未被实习,那么 String.Intern 究竟是如何工作的。 documentation 中的方法描述如下:

Intern 方法使用 intern 池搜索等于的字符串 str 的值。如果这样的字符串存在,它在实习生中的引用 池返回。如果字符串不存在,对 str 的引用是 添加到实习生池中,然后返回该引用。

但是这本书的摘录“CLR via C#”却有不同的说法:

实习生,接受一个字符串,获取它的哈希码,并检查 匹配的内部哈希表。如果一个相同的字符串已经 存在,则返回对已经存在的 String 对象的引用。 如果不存在相同的字符串,则制作该字符串的副本, 副本被添加到内部哈希表中,并引用了这个 返回副本。

我猜文档中的描述是正确的。那么,在不复制字符串对象的情况下,只将 str 的引用添加到实习池中?

解决方法

这很容易直接测试:

// Make string from char[] to ensure it's not already interned
string s1 = new string(new[] { 'H','e','l','o' });
string i1 = string.Intern(s1);
bool result1 = object.ReferenceEquals(s1,i1);

string s2 = new string(new[] { 'H','o' });
string i2 = string.Intern(s2);
bool result2 = object.ReferenceEquals(s2,i2);

请注意,result1 设置为 true,表示未复制原始 string 对象。另一方面,result2 设置为 false,表明在实习池中找到了第二个构造的 string 对象 "Hello",因此 string.Intern()方法返回该实习实例,而不是传入的新构造实例。

string.Intern() 方法不复制字符串。它只是检查传递的引用是否等于池中已有的字符串,如果不相等,则将其添加到池中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?