在 Java 中迭代 Set 的最佳方法

Pra*_*ary -2 java collections iterator loops set

情况是我必须迭代一个包含最多 5000 个元素的集合。目前,我正在使用带有迭代器的普通 for 循环。

for (Iterator iterator = allValues.iterator(); iterator.hasNext();) {

     ListMetadataElem element = (ListMetadataElem) iterator.next(); 
     NameValueObject value = new NameValueObject(); 
     value.setId(element.getListMetadataElemSeqId().toString());    
     value.setValue(element.getListMetadataElemNm());   
     abstractVO.getAllListMetadataElems().add(value);       
}
Run Code Online (Sandbox Code Playgroud)

问题是它需要太多时间来迭代 6-7 秒,我必须多次调用相同的循环。

Pri*_*jee 5

以下是对比:

public class IterateSet {

    public static void main(String[] args) {

        //example Set
        Set<String> set = new HashSet<>();

        set.add("Jack");
        set.add("John");
        set.add("Joe");
        set.add("Josh");

        long startTime = System.nanoTime();
        long endTime = System.nanoTime();

        //using iterator
        System.out.println("Using Iterator");
        startTime = System.nanoTime();
        Iterator<String> setIterator = set.iterator();
        while(setIterator.hasNext()){
            System.out.println(setIterator.next());
        }
        endTime = System.nanoTime();
        long durationIterator = (endTime - startTime);


        //using lambda
        System.out.println("Using Lambda");
        startTime = System.nanoTime();
        set.forEach((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationLambda = (endTime - startTime);


        //using Stream API
        System.out.println("Using Stream API");
        startTime = System.nanoTime();
        set.stream().forEach((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationStreamAPI = (endTime - startTime);


        //using Split Iterator (not recommended)
        System.out.println("Using Split Iterator");
        startTime = System.nanoTime();
        Spliterator<String> splitIterator = set.spliterator();
        splitIterator.forEachRemaining((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationSplitIterator = (endTime - startTime);


        //time calculations
        System.out.println("Iterator Duration:" + durationIterator);
        System.out.println("Lamda Duration:" + durationLambda);
        System.out.println("Stream API:" + durationStreamAPI);
        System.out.println("Split Iterator:"+ durationSplitIterator);
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码是不言自明的。持续时间的结果是:

Iterator Duration:495287
Lamda Duration:50207470
Stream API:2427392
Split Iterator:567294
Run Code Online (Sandbox Code Playgroud)

我们可以看到 Lambda 耗时最长,而 Iterator 最快。除此之外,还有传统的古老的增强型 for 循环。