Hashmap Arraylist Hashset Hashtable
Hashmap Arraylist Hashset Hashtable
HashMap:在java集合中,Map是一种特殊的集合,保存的不是单个元素,而是一个个的key-value键值对。
转载链接:https://www.cnblogs.com/skywang12345/p/3310835.html
源码详解:http://baijiahao.baidu.com/s?id=1601416041995350500&wfr=spider&for=pc
- HashMap是基于哈希表的Map接口的实现类,是一个散列表,存储的内容是键值对映射。继承于AbstractMap,实现了Map,Cloneable,java.io.serializable接口。
- HashMap的实现不是同步的,线程是不安全的,它的key,value都可以为null,里面的映射也不是有序的,存入的顺序和遍历的书序可能不一致。要想实现线程安全,那么需要调用collections类的静态方法synchronizeMap()实现
- 两个影响其性能的参数:初始容量和加载因子。
- 底层采用的是Entry数组和链表实现,Entry是Map的一个静态内部类,里面有key,value,next三个属性值。Next表示当前的节点的下一个节点是哪个Entry.
- Java中解决冲突的方法是采用链表解决的
- 是通过拉链法实现的哈希表,包括的成员变量:table,size,threshold,loadFactor,modCount
Table:是一个Entry[]数组类型,单向链表,哈希表的键值对存储在Entry数组中。
Size:HashMap的大小,是HashMap保存的键值对的数量
Threshold:判断是否调整HashMap的容量,阈值=容量*加载因子
loadFactor:加载因子
modCount是用来实现fail-fast机制的。
Arraylist
源码分析:https://www.cnblogs.com/skywang12345/p/3308556.html
1.Arraylist:是一个数组队列,相当于动态数组,容量可以动态增长,继承于AbstractList,实现了List,RandomAccess,Cloneable,
java.io.Serializable这些接口。
2. Arraylist中的操作不是线程安全的,在单线程中可以使用,多线程中使用Vector,或者CopyOnWriteArrayList。
3.遍历ArrayList时,使用随机访问的效率最高,而且迭代器的效率最低。
4. 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 + 1”
Hashset
原理分析:https://my.oschina.net/90888/blog/1625854
1. HashSet是Set接口的典型实现,继承于AbstractSet ,HashSet按照Hash算法来存储集合中的元素。仅存储对象,不存储键值对,存在以下特点:
不能保证元素的顺序,元素是无序的
HashSet不是同步的,需要外部保持线程之间的同步问题
集合元素值允许为null
2. 实现的接口有:Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>
3. HashSet的底层通过HashMap实现的。而HashMap在1.7之前使用的是数组+链表实现,在1.8+使用的数组+链表+红黑树实现。其实也可以这样理解,HashSet的底层实现和HashMap使用的是相同的方式,因为Map是无序的,因此HashSet也无法保证顺序。
Hashtable
源码详解:https://www.cnblogs.com/skywang12345/p/3310887.html
1.一个散列表,存储内容是键值对,继承于Dictionary,实现了Map,Cloneable,java.io.Serializable接口。
2.Hashtable的函数时同步的,是线程安全的,它的key,value都不可以为null,而且它的映射不是有序的。
3.是通过“拉链发”实现的哈希表,包括的成员变量有:
table:Entry[]数组类型,单向链表
count:Hashtable的大小,它是Hashtable保存的键值对的数量
threshold是Hashtable的阈值,用于判断是否需要调整Hashtable的容量。threshold的值="容量*加载因子"
loadFactor就是加载因子。
modCount是用来实现fail-fast机制的
HashMap和HashSet的区别是什么?
HashMap和HashTable的区别是什么?
- HashMap是线程不安全的,HashTable是线程安全的
- HashMap允许key和value是null,但是只允许一个key值为null,且这个元素存放在哈希表0角标位置。HashTable不允许key,value是null
- HashMap内部使用的是hash(object key)扰动函数对key的hashcode进行扰动后作为hash值,hashtable是直接用key的hashcode()的返回值作为hash值
- HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
HashSet & LinkedHashSet 源码分析以及集合常见面试题目
附上链接:https://my.oschina.net/u/2935389/blog/3030368