引用一张图
List
通俗理解:
可以为空,是有序的,线程不安全的
List可以完全当作数组来使用,但list中可以有重复元素,Map里也可以,但Set集合不允许出现重复元素
ArrayList
-
显而易见,其是数组list,那说明他跟数组一样,可以很好的通过数组下标查找元素,查找快
-
那数组还有一个特点就是修改会比较慢,因为他的下标都是有序的 改变了一个就得牵动别的
-
其添加元素(add)的时间复杂度为O(n),其实线性的
-
在你添加元素进去的时候,其容量(Capacity)是会自动增长的
LinkedList
-
link也就是链表,链表有个很大的特点就是他是通过指针的相连的,改变指针的指向速度效率高,那他插入和删除一个数据就会更快
-
还有下列方法:addFirst(),addLast(),getFirst(),getLast(),removeFirst(),romoveLast().这些方法使得LinkedList可以当作堆栈,队列和双向队列使用。
-
从前到后遍历 遍历慢
ArrayList的扩容机制
-
以无参构造的方法创建ArrayList时,实际上初始化赋值的是一个空数组
-
当真正对数组进行元素操作时,才真正分配容量
-
向数组中分配第一个元素时,数组容量扩为10
Set
不允许重复
HashSet
-
不允许出现重复元素
-
是无序的
-
允许出现一个null的情况
-
不同步
-
以hash表的形式存放元素,插入删除速度快
TreeSet
-
有序的 记住这一点优点
list和Set的比较
-
set检查元素效率低,但插入和删除的效率高,因为他是用hash表的形式存放元素,插入和删除不会引起元素位置的变化
-
list其可以实现动态增长,查找快,插入删除慢,元素位置会发生改变
Map
map是比较常用到的,她有对应的key 和value 键值对的形式,是一种映射关系,key不能重复
HashMap
-
key可以为空,value也可以为空,即可以储存空对象 key是唯一的 如果key为null 只有一个key为null的情况 value随意
-
其迭代子操作时间开销和HashMap的容量成比例,因此不要把HashMap的初始容量设置的过高
-
线程不安全
-
JDK1.8 以后的
HashMap
在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。(后面详细讲)
HashTable
-
线程安全的 stack 栈也线程安全 Vector
-
不允许null的key和null的value值
HashMap的遍历
-
其一般是通过entrySet或是keySet的方式遍历,keySet效率高
Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); where(iter.hasNext()){ Map.Entry entry = (Map.Entry)iter.Next(); Object key = entry.getKey(); Object val = entry.getValue(); }
-
keySet
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}
解决hash冲突的办法
-
开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
-
再哈希法
-
链地址法
-
建立一个公共溢出区
后面数据结构时再详细讲