c# - String.Intern 方法是否只是向实习生池添加对字符串的引用,还是创建字符串的副本?
问题描述
假设我有一个字符串'str'。我想使用 String.Intern 方法对其进行实习。我只是想知道,如果'str' 的值尚未被实习,String.Intern 究竟是如何工作的。文档中对该方法的描述如下:
Intern 方法使用实习池来搜索等于 str 值的字符串。如果存在这样的字符串,则返回其在实习池中的引用。如果字符串不存在,则将对 str 的引用添加到实习池,然后返回该引用。
但是这本书摘自“CLR via C#”这本书的摘录不同:
Intern,获取一个字符串,为其获取一个哈希码,并检查内部哈希表是否匹配。如果已存在相同的字符串,则返回对已存在的 String 对象的引用。如果不存在相同的字符串,则制作该字符串的副本,将该副本添加到内部哈希表中,并返回对该副本的引用。
我猜文档中的描述是正确的。那么,只在实习池中添加一个对 str 的引用而不复制字符串对象?
解决方案
这很容易直接测试:
// Make string from char[] to ensure it's not already interned
string s1 = new string(new[] { 'H', 'e', 'l', 'l', 'o' });
string i1 = string.Intern(s1);
bool result1 = object.ReferenceEquals(s1, i1);
string s2 = new string(new[] { 'H', 'e', 'l', 'l', 'o' });
string i2 = string.Intern(s2);
bool result2 = object.ReferenceEquals(s2, i2);
注意result1
设置为true
,表示原始string
对象没有被复制。另一方面,result2
设置为false
,表示在实习池中找到了第二个构造string
对象"Hello"
,因此该string.Intern()
方法返回该实习实例而不是传入的新构造实例。
该string.Intern()
方法不复制字符串。它只是检查传递的引用是否等于池中已经存在的字符串,如果不是,则将其添加到池中。
推荐阅读
- php - PHP - 访问服务器时生成屏幕警报
- python - 尝试将 Python 脚本编译为 exe 时出错
- java - 如何在 Spring Data MongoDB 中进行这种聚合?
- sql - SQL根据日期范围合并记录
- java - 通过java selenium在表中输入值
- oracle - 如何根据 oracle 表单 10g 中的值禁用归档?
- java - 如何每 10 分钟重置一次线程?
- qt - Squish 不记录 Qt 应用程序中映射键的按键事件
- sql - CASE 条件和 SUM() 公用表表达式或 Group By
- oracle - 如何通过 Apache NiFi 提高从 Oracle 到 IBM DB2 的批量插入速度