4

我遇到了一些关于哈希表的浅拷贝和深拷贝的文章/解释,我读的越多,我就越困惑。

Hashtable ht = new Hashtable();
ht.Add("1", "hello");

Hashtable ht2 = new Hashtable();
ht2 = ht;                          // case1: is this shallow copy?
ht2["1"] = "H2";

Hashtable ht3 = new Hashtable(ht); // case2: is this shallow copy?
ht3["1"] = "H3";

Hashtable ht4 = new Hashtable();
ht4 = (Hashtable)ht.Clone();       // case3: is this shallow copy?
ht4["1"] = "H4";
  • 案例1:结果,ht内容变化与ht2相同。
  • Case2:结果,ht内容与ht3不同。
  • Case3:结果,ht内容与ht4不同。

如果Case2和Case3是浅拷贝,结果不应该和Case1一样吗?

List、ArrayList 等也会发生这种情况吗?

4

1 回答 1

2

在案例 1 中,两者ht2和都ht指的是 的同一个实例Hashtable

在情况 2 和 3 中,ht3ht4引用通过复制原始条目创建的不同对象。Hashtable

请注意,即使进行“深度”复制(创建新映射),您仍然会复制引用。例如:

var original = new Dictionary<int, StringBuilder>();
original[10] = new StringBuilder();

var copy = new Dictoinary<int, StringBuilder>(original);
copy[20] = new StringBuilder();

// We have two different maps...
Assert.IsFalse(original.ContainsKey(20));

// But they both refer to a single StringBuilder in the entry for 10...
copy[10].Append("Foo");
Assert.AreEqual("Foo", original[10].ToString());
于 2012-07-19T11:17:47.837 回答