Java Collection - 参考

时间:2016-08-11 01:51:08

标签: java-8

我有一个HashMap来存储来自DB的数据。用户是否必须创建迭代引用?

Map<String, List<Employee>> **map** = Cache.getMap(key);

for( Map.Entry<String, List<Employee>> me: map.entrySet()){

或者:

for(Map<String, List<Employee>> me : Cache.getMap(key)){

在任何给定的时间点,最少20个线程将命中Cache。每个调用者将花费大约500毫秒来完成处理地图中的数据。

那说,从GC和速度的角度来看,这是上述两个中更好的选择。

或者是否有比上述选项更好的选择?

1 个答案:

答案 0 :(得分:0)

是否写作

IterableOrArray all=expression;
for(ElementType element: all) {
    …
}

for(ElementType element: expression) {
    …
}

没有任何区别,因为在这两种情况下,expression将仅在循环开始时而不是在每次迭代中计算一次。在Iterable的情况下,甚至很难想象,结果代码如何重新评估表达式并告诉新Iterator在旧表达式的前一个位置继续。

如果仍有疑问,可以使用以下示例程序进行验证:

public static void main(String[] args) {
    for(String s: getTheCollection()) {
        System.out.println(s);
    }
}
static Iterable<String> getTheCollection() {
    System.out.println("getTheCollection() called");
    return () -> {
        System.out.println("iterator() called");
        return Stream.of("foo", "bar", "baz").iterator();
    };
}

public static void main(String[] args) {
    String[] array={ "foo", "bar", "baz" };
    for(String s: array) {
        System.out.println(s);
        // has no consequences:
        array=null;
    }
}

因此,由于没有任何区别,因此GC和速度观点也没有差异。