集合是否有可能碎片化
本文关键字:碎片 有可能 是否 集合 | 更新日期: 2023-09-27 17:57:21
考虑在Dictionary
中注册新成员的入口和进入时间:
Dictionary<string, DateTime> members = new Dictionary<string, DateTime>();
members.Add("Bob", DateTimeNow);
Thread.Sleep(1000);
members.Add("Joe", DateTimeNow);
Thread.Sleep(1000);
members.Add("Susan", DateTimeNow);
Thread.Sleep(1000);
// Now Joe exits
members.Remove("Joe");
// Then Mike enters
members.Add("Mike", DateTimeNow);
现在的问题是Mike
Dictionary
的位置在哪里.他是添加到Dictionary
末尾还是将填充Susan
的空白位置(如果我们使用 foreach
迭代或通过索引访问Dictionary
)?行为是否一直得到保证?
字典
不是排序的,因此如果您迭代键,则无法对它们的返回顺序进行任何推理。
正如 MSDN 站点告诉我们的那样,字典是作为哈希表实现的,并且:
项目的顺序 返回未定义。
如果要按定义的顺序循环访问键,则应使用 SortedDictionary。
顺序的概念不是为字典所代表的哈希表定义的。您永远不能依赖按特定顺序排列的项目。不能保证此行为。字典用于按键快速访问给定项目。
引用文档:
为了枚举的目的,每个项目 在字典中被视为
KeyValuePair<TKey, TValue>
结构 表示值及其键。这 退回物品的顺序 未定义。
访问Dictionary
是通过key
而不是通过index
来完成的 - 所以它本身的问题意义不大。
正如所有答案已经说过的那样 - Dictionary
没有顺序,通过Hashtable
实现(维基页面 - 花时间阅读它)
它自己的Dictionary
可以根据它维护的数据量和它自己的实现进行扩展和压缩,但是当使用像.NET
这样的丰富框架时,你不需要为这个问题而烦恼,它是为你完成的。如果您感兴趣,可以阅读 WIKI 页面中的Dynamic Resizing
部分以了解实现。