我可能很快就会教“Java崩溃课程”。虽然假设观众成员会知道Big-O表示法可能是安全的,但假设他们知道各种集合实现的各种操作的顺序是不安全的。
我可能需要花时间自己生成一个摘要矩阵,但如果它已经在公共领域的某个地方,我肯定想重复使用它(当然还有适当的信用。)
有人有任何指示吗?
答案 0 :(得分:191)
本书Java Generics and Collections有此信息(页数:188,211,222,240)。
列出实施:
get add contains next remove(0) iterator.remove
ArrayList O(1) O(1) O(n) O(1) O(n) O(n)
LinkedList O(n) O(1) O(n) O(1) O(1) O(1)
CopyOnWrite-ArrayList O(1) O(n) O(n) O(1) O(n) O(n)
设置实施:
add contains next notes
HashSet O(1) O(1) O(h/n) h is the table capacity
LinkedHashSet O(1) O(1) O(1)
CopyOnWriteArraySet O(n) O(n) O(1)
EnumSet O(1) O(1) O(1)
TreeSet O(log n) O(log n) O(log n)
ConcurrentSkipListSet O(log n) O(log n) O(1)
地图实施:
get containsKey next Notes
HashMap O(1) O(1) O(h/n) h is the table capacity
LinkedHashMap O(1) O(1) O(1)
IdentityHashMap O(1) O(1) O(h/n) h is the table capacity
EnumMap O(1) O(1) O(1)
TreeMap O(log n) O(log n) O(log n)
ConcurrentHashMap O(1) O(1) O(h/n) h is the table capacity
ConcurrentSkipListMap O(log n) O(log n) O(1)
队列实施:
offer peek poll size
PriorityQueue O(log n) O(1) O(log n) O(1)
ConcurrentLinkedQueue O(1) O(1) O(1) O(n)
ArrayBlockingQueue O(1) O(1) O(1) O(1)
LinkedBlockingQueue O(1) O(1) O(1) O(1)
PriorityBlockingQueue O(log n) O(1) O(log n) O(1)
DelayQueue O(log n) O(1) O(log n) O(1)
LinkedList O(1) O(1) O(1) O(1)
ArrayDeque O(1) O(1) O(1) O(1)
LinkedBlockingDeque O(1) O(1) O(1) O(1)
java.util包的javadoc底部包含一些好的链接:
答案 1 :(得分:131)
这个网站非常好但不是特定于Java:http://bigocheatsheet.com/
答案 2 :(得分:12)
来自Sun的Javadocs每个集合类通常会告诉您确切的内容。 HashMap,例如:
此实现为基本操作(get和put)提供常量时间性能,假设散列函数在桶之间正确地分散元素。对集合视图的迭代需要时间与HashMap实例的“容量”成比例(桶的数量)加上其大小(键值映射的数量)。
此实现为containsKey,get,put和remove操作提供保证log(n)时间成本。
此实现为基本操作提供保证log(n)时间成本(添加,删除和包含)。
(强调我的)
答案 3 :(得分:6)
上面的人给出了HashMap / HashSet与TreeMap / TreeSet的对比。
我将讨论ArrayList与LinkedList:
的ArrayList:
get()
add()
ListIterator.add()
或Iterator.remove()
在中间插入或删除元素,则移动所有以下元素将为O(n)链表:
get()
add()
ListIterator.add()
或Iterator.remove()
在中间插入或删除元素,则为O(1)