List和Set之间的性能和内存分配比较List和Set之间的性能和内存分配比较(Performan

2019-05-16 15:28发布

我想知道,在性能,内存的分配和可用性方面List和Set之间的比较。

如果我没有保持独特性的对象列表中的任何要求,也不需要插入以进行维护,我可以使用ArrayList和SortedSet的/ HashSet的互换? 这将是很好直接使用Collections类来代替甚至列表/套?

PS我也没有任何需要列出或设置Java提供特定的功能。 我使用列表/集,而不是只阵,因为他们可以动态成长过程中没有额外的编程工作。

Answer 1:

如果你不关心的排序,并且不要删除元素,那么它真的可以归结为是否需要找到这个数据结构元素,以及如何快速,你需要这些查找是。

通过在值找到一个元件HashSetO(1) 在一个ArrayList ,这是O(n)

如果你只使用容器来存储一串独特的对象,并在结束(以任意顺序)遍历它们,那么可以说ArrayList是一个更好的选择,因为它更简单,更经济。



Answer 2:

HashSet消耗大约5.5倍超过存储器ArrayList对于相同数量的元件(尽管他们都仍然是线性的),并且具有显著较慢的迭代(虽然具有相同的渐近); 一个快速谷歌搜索显示了2-3倍放缓HashSet迭代与ArrayList

如果你不关心的唯一性或性能contains ,然后使用ArrayList



Answer 3:

如果您打算只添加元素,后来在他们迭代,最好的办法是ArrayList ,因为它是最接近要更换的阵列。 这是更多的内存效率比LinkedList或任何Set实现,具有快速插入,重复和随机访问。



Answer 4:

如果你比较,List和Set之间的搜索,设置将因为下划线散列算法的更好。

在名单的情况,在最坏的情况下,包括将搜索到年底。 在设置的情况下,由于散列和桶,这将只搜索子集。

样本用例:加1到100_000整数ArrayList和HashSet的。 搜索在ArrayList和HashSet的每个整数。

集将于9毫秒,其中作为名单将于16232秒。

private static void compareSetvsList(){
    List<Integer> list = new ArrayList<>() ;
    Set<Integer> set = new HashSet<>() ;

    System.out.println("Setting values in list and set .... ");
    int counter = 100_000  ;

    for(int i =0 ; i< counter ; i++){            
        list.add(i);
        set.add(i);
    }

    System.out.println("Checking time .... ");
    long l1 = System.currentTimeMillis();
    for(int i =0 ; i< counter ; i++) list.contains(i);

    long l2 = System.currentTimeMillis();
    System.out.println(" time taken for list : "+ (l2-l1));

    for(int i =0 ; i< counter ; i++)set.contains(i);

    long l3 = System.currentTimeMillis();
    System.out.println(" time taken for set : "+ (l3-l2));

    //      for 10000   time taken for list : 123        time taken for set : 4
    //      for 100000  time taken for list : 16232          time taken for set : 9
    //      for 1000000 time taken for list : hung       time taken for set : 26

}


Answer 5:

如果您没有要求在收集独特的元素简单地使用ArrayList ,除非你有非常特殊的需求。

如果你必须有在收集只有唯一elemets的要求,然后使用HashSet ,除非你有非常特殊的需求。

关于SortedSet (和它的实现者TreeSet ),按JavaDoc的:

进一步提供关于元素的总体排序的Set。 这些元素使用其自然顺序进行排序,或者通过一个比较通常在创建有序集合时提供。

这意味着它定位于非常具体的使用情况,当要素应当按照总是有序的set ,它通常并不需要。



Answer 6:

使用HashSet ,如果你需要使用.contains(T)频繁。

例:

private static final HashSet<String> KEYWORDS = Stream.of(new String[]{"if", "do", "for", "try", "while", "break", "return"}).collect(Collectors.toCollection(HashSet::new));

public boolean isKeyword(String str) {
     return KEYWORDS.contains(str);
}


文章来源: Performance and Memory allocation comparison between List and Set