集合框架最大的作用就是维护一组类型同样的对象。
以下首先介绍集合的经常使用,随后依据每种行为分别进行讨论。
这个程序最后输出的结果例如以下:
以上就是集合框架最简单的样例。尽管简单,可是平时编码的时候常常会用到。
使用链表进行实现的类有:LinkedList、HashMap、Hashtable。
使用数组实现的类有:ArrayList、Deque、Stack、Vector。
使用哈希表进行实现的类有:HashMap、HashSet、Hashtable、LinkedHashMap、LinkedHashSet、WeakHashMap。
使用红黑树实现的类有:TreeMap。
仅仅是不同的类有不同的行为和性能。通常关注下面这些行为:
- 是否能存放反复的元素
- 遍历的顺序是如何的
- 是否支持多线程
以下首先介绍集合的经常使用,随后依据每种行为分别进行讨论。
经常使用操作
经常使用的操作一般就是添加删除查询。经常使用的添加操作有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,这些都是早期的类,接口设计不良,性能一般,所以在新的project中一般不再使用。
除了这三个类。其它的类都不支持多线程。
假设确实须要用到多线程。能够调用path{Collections.synchronizedMap}或者path {Collections.synchronizedSet}让对象支持对线程。
算法细节
不同的类採用了不同的算法,整体上使用了链表、数组、哈希表、红黑树、堆这几种算法。以下都是我阅读了OpenJDK的源代码之后总结出来的。使用链表进行实现的类有:LinkedList、HashMap、Hashtable。
使用数组实现的类有:ArrayList、Deque、Stack、Vector。
使用哈希表进行实现的类有:HashMap、HashSet、Hashtable、LinkedHashMap、LinkedHashSet、WeakHashMap。
使用红黑树实现的类有:TreeMap。
使用堆实现的类有:PriorityQueue。