- 能否存放重复的元素
- 遍历的顺序是怎样的
- 是否支持多线程
下面首先介绍集合的常用,随后根据每种行为分别进行讨论。
常用操作
常用的操作一般就是增加删除查询。常用的增加操作有add、addAll,常用的删除操作有remove、removeAll,常用的读取操作有contains、get、indexOf,还可以通过迭代器进行遍历。说这些比较抽象,下面就用代码举个例子吧。import java.util.LinkedList; public class Main { public static void main(){ LinkedList<Integer> list = new LinkedList<Integer>(); // 增加三个元素 list.add(1); list.add(2); list.add(3); // 删除一个元素 list.remove(2); // 输出list中所有的元素 for(int e:list) { System.out.println(e); } } }
这个程序最后输出的结果如下:
1 3
以上就是集合框架最简单的例子。虽然简单,但是平时编码的时候经常会用到。
重复值
除了Set和Map,其余的类都支持重复元素。对于Map,针对的是它的Key,也就是说它的Key不能重复,而Value随便如何取值对可以,就不在讨论范围了。遍历的顺序
遍历的顺序是各种集合之间最大的区别。遍历的顺序一般有三种:按照插入顺序进行遍历、按照compareTo结果进行遍历、无序遍历。按照插入顺序进行遍历的类有List、Vector、Stack、Queue、Deque、LinkedHashMap。其中Stack的遍历顺序和插入的顺序是相反的,Deque是Stack和Queue合体,两种顺序都支持,而且性能更快。
按照compareTo结果进行遍历的类有SortedMap、TreeMap、SortedSet、PriorityQueue。
无序遍历的类有:HashMap、Set、Hashtable。
多线程
只有早期版本的集合类支持多线程,后来发现多线程不关集合框架的事,后来出现的类就都不支持多线程了。所以,在Java的集合框架中,支持多线程的类只有三个:Stack、Vector、Hashtable,这些都是早期的类,接口设计不良,性能一般,所以在新的工程中一般不再使用。
除了这三个类,其他的类都不支持多线程。如果确实需要用到多线程,可以调用\path{Collections.synchronizedMap}或者\path {Collections.synchronizedSet}让对象支持对线程。
算法细节
不同的类采用了不同的算法,总体上使用了链表、数组、哈希表、红黑树、堆这几种算法。下面都是我阅读了OpenJDK的源码之后总结出来的。使用链表进行实现的类有:LinkedList、HashMap、Hashtable。
使用数组实现的类有:ArrayList、Deque、Stack、Vector。
使用哈希表进行实现的类有:HashMap、HashSet、Hashtable、LinkedHashMap、LinkedHashSet、WeakHashMap。
使用红黑树实现的类有:TreeMap。
使用堆实现的类有:PriorityQueue。