要回答您的问题,
“给定案例的性能相对于 Map 实现有何变化?”
性能差异可以忽略不计。
要评论您的评论,
“在第二个片段中,我不喜欢在更广泛的范围内声明值的事实。”
好,你不应该。 你看,有两种方法可以从 Map 返回 null:
- 密钥不存在或
- 键确实存在,但它的值为空(如果 Map 实现允许空值,如 HashMap)。
因此,如果键以空值存在,这两种情况实际上可能会产生不同的结果!
编辑
我编写了以下代码来测试两种场景的性能:
public class TestMapPerformance {
static Map<String, String> myMap = new HashMap<String, String>();
static int iterations = 7000000;
// populate a map with seven million strings for keys
static {
for (int i = 0; i <= iterations; i++) {
String tryIt = Integer.toString(i);
myMap.put(tryIt, "hi");
}
}
// run each scenario twice and print out the results.
public static void main(String[] args) {
System.out.println("Key Exists: " + testMap_CheckIfKeyExists(iterations));
System.out.println("Value Null: " + testMap_CheckIfValueIsNull(iterations));
System.out.println("Key Exists: " + testMap_CheckIfKeyExists(iterations));
System.out.println("Value Null: " + testMap_CheckIfValueIsNull(iterations));
}
// Check if the key exists, then get its value
public static long testMap_CheckIfKeyExists(int iterations) {
Date date = new Date();
for (int i = 0; i <= iterations; i++) {
String key = Integer.toString(i);
if(myMap.containsKey(key)) {
String value = myMap.get(key);
String newString = new String(value);
}
}
return new Date().getTime() - date.getTime();
}
// Get the key's value, then check if that value is null
public static long testMap_CheckIfValueIsNull(int iterations) {
Date date = new Date();
for (int i = 0; i <= iterations; i++) {
String key = Integer.toString(i);
String value = myMap.get(key);
if(value != null) {
String newString = new String(value);
}
}
return new Date().getTime() - date.getTime();
}
}
我运行了它,结果如下:
Key Exists: 9901
Value Null: 11472
Key Exists: 11578
Value Null: 9387
所以总而言之,性能上的差异可以忽略不计。