Java中List、Map、Set关系
集合框架
- Map
- HashMap
- HashMap 使用哈希表(hash table)实现, 在 keys 和/或 values 之中,都是无序的.
- TreeMap
- TreeMap 基于红黑树(red-black tree)数据结构实现, 按 key 排序.
- LinkedHashMap
- LinkedHashMap 保持者插入顺序.
- HashTable
- Hashtable 与HashMap实现方式一样,但Hashtable属于同步(synchronized)的.
- HashMap
- Collection
- List
- 总结
在查询(get)、遍历(iterator)、修改(set)使用的比较多的情况下,用ArrayList
在增加(add)、删除(remove)使用比较多的情况下,用LinkedList
在需要线程安全而且对效率要求比较低的情况下,使用Vector,当然,实现ArrayList线程安全的方法也有很多,以后再说
在需要使用栈结构的情况下,使用Deque,Stack废弃就行了
- ArrayList
非线程安全
基于对象数组 get(int index)不需要遍历数组,速度快;
iterator()方法中调用了get(int index),所以速度也快
set(int index, E e)不需要遍历数组,速度快
add方法需要考虑扩容与数组复制问题,速度慢
remove(Object o)需要遍历数组,并复制数组元素,速度慢
remove(int index)不需要遍历数组,需要复制数组元素,但不常用
contain(E)需要遍历数组
- LinkedList
非线程安全 基于环形双向链表
get(int index)需要遍历链表,速度慢;
iterator()方法中调用了get(int index),所以速度也慢
set(int index, E e)方法中调用了get(int index),所以速度也慢
add方法不需要考虑扩容与数组复制问题,只需创建新对象,再将新对象的前后节点的指针指向重新分配一下就好,速度快
remove(Object o)需要遍历链表,但不需要复制元素,只需将所要删除的对象的前后节点的指针指向重新分配一下以及将所要删除的对象的三个属性置空即可,速度快
remove(int index)需要遍历链表,但不需要复制元素,只需将所要删除的对象的前后节点的指针指向重新分配一下以及将所要删除的对象的三个属性置空即可,但不常用
contain(E)需要遍历链表
- Vector(线程安全的ArrayList)
- 线程安全
扩容机制与ArrayList不同
- 线程安全
- Stack(extends Vector)
- 线程安全
效率低下,可采用双端队列Deque或LinkedList来实现,Deque用的较多
- 线程安全
- 总结
- Set
- 特点:无序不可重复
- HashSet
HashSet 底层是使用了哈希表来支持的,特点: 存取速度快.
hashSet的实现原理:
往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 , 然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。
- TreeSet
- treeSet 底层是以红-黑树的数据结构实现的,默认对元素进行自然排序(String)。
如果在比较的时候两个对象返回值为0,那么元素重复。
- treeSet 底层是以红-黑树的数据结构实现的,默认对元素进行自然排序(String)。
- List
- 两个工具类
- Collections
- 作用于集合
- Arrays
- 作用于数组
- Collections