java集合类是java.util 包中的重要内容。java集合框架包含了大量集合接口以及这些接口的实现类和操做他们的算法。java
java集合框架图
主要提供的数据结构
- List
又称有序的Collection。它按照对象的进入顺序保存对象,能够对列表中的每一个元素的出入和删除元素位置进行精确的控制。同时,它能够保存重复的对象。 LinkedList、ArrayList、Vector都实现了List接口。算法
- Set
Set 是数学意义上的集合。集合中元素不可重复。所以存入set的每一个元素都必须经过equals()方法来肯定对象的惟一性。 Set 接口有两实现类,HashSet和TreeSet其中<u>TreeSet 实现了SrotedSet接口</u>因此TreeSet是有序的。数组
- Map
Map 提供一个从键映射到值得数据结构。它用于保存键值对,其中值能够重复,可是键必定惟一,不能重复。Java类库中有多个实现该接口的类:HashMap、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap。安全
- 调用Key的hashCode()方法生成一个hash值h1。 >> + 若是这个h1在HashMap中不存在,那么直接将<key,value>添加到HashMap中。 >> + 若是这个h1已经存在了那么找出HashMap中全部Hash值为h1的key。
- 分别调用equals()方法判断当前添加的key是否与已经存在的key值相同 >> 若是相同,说明当前的Key已经存在。HashMap会使用新的value覆盖原有的value。 >> 若是没有相同,说明当前的Key不存在。HashMap会建立新的映射关系。
- Hash冲突的解决。(当新增的key的Hash值在HashMap中存在时,就会产生冲突。通常有开放地址法、再Hash法、链地址法等解决Hash冲突问题。 HashMap使用的是链地址法来解决冲突的
- 调用hashCode()方法获取Key的Hash值h,肯定键为Key的全部值存储的首地址。
- 若是Key的值有多个,程序会遍历全部结果,并经过调用key的equals()方法来判断key的内容是否相等。只有当equals()方法的返回值为true时,对应的value才是正确值。
继承的父类不一样:HashTable继承自Dictionary类,而HashMap继承自Abstract Map类可是都二者实现了Map接口数据结构
线程安全性不一样:HashTable 的方法是线程安全的,其中的每一个方法都加入了Synchronized同步。框架
提供的方法不一样:HashMap和HashTable类似度很高,可是也有区别,在HashMap中将contain方法去掉了,改为了containsValue和containsKey。(contains容易形成误解)spa
key和value是否能够为空值(null):在HashMap中容许且只容许一个key值为null,容许多个value值为null。HashTable中Key和value都不容许为null。线程
遍历方式实现不一样:HashTable和HashMap都是用了迭代器Iterator ^迭代器Iterator。
HashTable中还使用了Enumeration方式。3d
Hash值不一样:HashTable直接将对象的HashCode做为Hash值。HashMap则从新计算key的Hash值。code
数组的初始化不一样:HashTable默认为11,扩容为(old*2+1),HashMap 默认为16,扩容为(old*2)
同步意味着,在同一时刻中只有一个线程能够修改Hash表,任何线程在执行HashTable的更新操做前都要获取对象锁,其余线程则等待线程锁的释放。
HashMap以使用
Map m = Collections.synchronizedMap(new HashMap());
来达到同步的效果。