Collection
├ List
│ ├ LinkedList(非线程安全)
│ ├ ArrayList(非线程安全)
│ └ Vector(线程安全)
│ └ Stack
└ Set(非线程安全)
│ ├ HashSet
│ └ TreeSet
Map
├ Hashtable(线程安全)
├ HashMap(非线程安全)
└ WeekHashMap
list、Set与Map
- List、Set都是继承Collection接口,而Map不是
- List元素放入有序,可重复,而Set元素放入无序,且不重复。List支持for循环便利,但Set不能(元素在Set中的位置是由该元素的HashCode决定,位置是固定的)
- Set检索元素效率低,但删除和插入效率高(因为插入和删除不会引起元素位置改变);List查找效率高,但插入删除效率低。
- Map适合储存键值对的数据
ArrayList与LinkedList
ArrayList查询效率高,插入删除效率低
LinkedList查询效率低,插入删除效率高
原因:在于ArrayList是基于动态数组的数据结构,地址连续。而LinkedList是基于链表的数据结构,地址是任意的,在开辟内存空间的时候不需要等一个连续的地址。
public ArrayList()//构造一个初始容量为10的空列表。
HashSet与Treeset
TreeSet是二叉树(红黑树的树据结构)实现的,Treeset中的数据是自动 排好序 的,不允许放入null值
HashSet是哈希表实现的,HashSet中的数据是 无序 的,可以放入null,但只能放入一个null
总结
- 如果涉及到堆栈,队列等操作,应该考虑用List
- 对于需要快速插入,删除元素,应该使用LinkedList
- 如果需要快速随机访问元素,应该使用ArrayList
- 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类
- 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法
- 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。