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

  1. HashMap是基于哈希表的Map接口的实现类,是一个散列表,存储的内容是键值对映射。继承于AbstractMap,实现了Map,Cloneable,java.io.serializable接口。
  2. HashMap的实现不是同步的,线程是不安全的,它的key,value都可以为null,里面的映射也不是有序的,存入的顺序和遍历的书序可能不一致。要想实现线程安全,那么需要调用collections类的静态方法synchronizeMap()实现
  3. 两个影响其性能的参数:初始容量和加载因子。
  4. 底层采用的是Entry数组和链表实现,Entry是Map的一个静态内部类,里面有key,value,next三个属性值。Next表示当前的节点的下一个节点是哪个Entry.
  5. Java中解决冲突的方法是采用链表解决的
  6. 是通过拉链法实现的哈希表,包括的成员变量: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实现的。而HashMap1.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机制的

HashMapHashSet的区别是什么?

HashMapHashTable的区别是什么?

  1. HashMap是线程不安全的,HashTable是线程安全的
  2. HashMap允许key和value是null,但是只允许一个key值为null,且这个元素存放在哈希表0角标位置。HashTable不允许key,value是null
  3. HashMap内部使用的是hash(object key)扰动函数对key的hashcode进行扰动后作为hash值,hashtable是直接用key的hashcode()的返回值作为hash值
  4. HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
    HashSet & LinkedHashSet 源码分析以及集合常见面试题目 
    附上链接:https://my.oschina.net/u/2935389/blog/3030368
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值