我想知道,在性能,内存的分配和可用性方面List和Set之间的比较。
如果我没有保持独特性的对象列表中的任何要求,也不需要插入以进行维护,我可以使用ArrayList和SortedSet的/ HashSet的互换? 这将是很好直接使用Collections类来代替甚至列表/套?
PS我也没有任何需要列出或设置Java提供特定的功能。 我使用列表/集,而不是只阵,因为他们可以动态成长过程中没有额外的编程工作。
我想知道,在性能,内存的分配和可用性方面List和Set之间的比较。
如果我没有保持独特性的对象列表中的任何要求,也不需要插入以进行维护,我可以使用ArrayList和SortedSet的/ HashSet的互换? 这将是很好直接使用Collections类来代替甚至列表/套?
PS我也没有任何需要列出或设置Java提供特定的功能。 我使用列表/集,而不是只阵,因为他们可以动态成长过程中没有额外的编程工作。
如果你不关心的排序,并且不要删除元素,那么它真的可以归结为是否需要找到这个数据结构元素,以及如何快速,你需要这些查找是。
通过在值找到一个元件HashSet
是O(1)
在一个ArrayList
,这是O(n)
如果你只使用容器来存储一串独特的对象,并在结束(以任意顺序)遍历它们,那么可以说ArrayList
是一个更好的选择,因为它更简单,更经济。
HashSet
消耗大约5.5倍超过存储器ArrayList
对于相同数量的元件(尽管他们都仍然是线性的),并且具有显著较慢的迭代(虽然具有相同的渐近); 一个快速谷歌搜索显示了2-3倍放缓HashSet
迭代与ArrayList
。
如果你不关心的唯一性或性能contains
,然后使用ArrayList
。
如果您打算只添加元素,后来在他们迭代,最好的办法是ArrayList
,因为它是最接近要更换的阵列。 这是更多的内存效率比LinkedList
或任何Set
实现,具有快速插入,重复和随机访问。
如果你比较,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
}
如果您没有要求在收集独特的元素简单地使用ArrayList
,除非你有非常特殊的需求。
如果你必须有在收集只有唯一elemets的要求,然后使用HashSet
,除非你有非常特殊的需求。
关于SortedSet
(和它的实现者TreeSet
),按JavaDoc的:
进一步提供关于元素的总体排序的Set。 这些元素使用其自然顺序进行排序,或者通过一个比较通常在创建有序集合时提供。
这意味着它定位于非常具体的使用情况,当要素应当按照总是有序的set
,它通常并不需要。
使用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);
}