考虑以下代码:
var str1 = "1234567890qwertyuiop[asdfghjkl;zxcvbnm1,.";
Dictionary<string, Object> objects = new Dictionary<string, object> {{str1, new object()}};
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 100000000; i++)
{
object result;
objects.TryGetValue(str1, out result);
}
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
//////////////////////////////////////////////////////////////
var list = new List<string>();
list.Add(str1);
stopwatch.Start();
for (int i = 0; i < 100000000; i++)
{
foreach (var item in list)
{
var result = "";
if (item == str1)
{
result = item;
}
}
}
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
运行此代码时,会看到以下结果:
5157 // Dictionary
3881 // List
因此列表比字典快。
我想知道原因。字符串和长度之间是否有任何关系?
答案 0 :(得分:14)
因为你只有一个元素,所以你的列表代码只是跳过一个哈希检查而没有额外的工作 因为你有这么长的密钥,字典正在做更多的工作来计算密钥的散列,而列表实现会跳过所有这些,因为字符串是引用相等的(它不需要比较所有内容。)
添加更多项目,性能将发生巨大变化。
简而言之,如果n为1,则O(1)不比O(n)快。