Java集合 Map List 相关问题

一、HashMap中如果hash冲突怎么办

        hash值冲突是发生在put()时,从源码可以看出,hash值是通过hash(key.hashCode())来获取的,当put的元素越来越多时,难免或出现不同的key产生相同的hash值问题,也即是hash冲突,当拿到一个hash值,通过indexFor(hash, table.length)获取数组下标,先查询是否存在该hash值,若不存在,则直接以Entry<V,V>的方式存放在数组中,若存在,则再对比key是否相同,若hash值和key都相同,则替换value,若hash值相同,key不相同,则形成一个单链表,将hash值相同,key不同的元素以Entry<V,V>的方式存放在链表中,这样就解决了hash冲突,这种方法叫做分离链表法,与之类似的方法还有一种叫做 开放定址法,开放定址法师采用线性探测(从相同hash值开始,继续寻找下一个可用的槽位)hashMap是数组,长度虽然可以扩大,但用线性探测法去查询槽位查不到时怎么办?因此hashMap采用了分离链表法。

      map在get()的时候,如果一个key对应的hash值只有一个,那么直接获取就OK,如果出现hash冲突,即一个key对应的hash值找到多个value,那么就遍历hash的Entry链表,知道找到对应的value为止。

二、集合详解

1、List接口

List是有序的的,可以重复的,允许null的,除了Collection必备的iterator(),还提供了ListIterator()方法,允许添加,删除,设定元素,还能向前和向后遍历。List包括LinkedList,ArrayList,Vector和Stack。

ArrayList是数组存储结构,是随机存取,动态扩容,没有同步的,运行null元素。所谓的随机存取指的是实现了RandomAccess()接口,因此查询速度比较快,但是插入和删除速度比较慢,因为需要移动插入或删除元素后面的元素。动态扩容是指初始化容量是10,如果元素大于10,那么就动态扩容为原来的1.5倍,如果新增后超过这个容量,则容量为新增后所需的最小容量(比如集合容量为5,一次性新增15个元素,这是超过初始量10个,因此新增0.5倍,变为15个,但是由于这里需要20个,因此15个不够,最后集合容量为所需最小容量20)。

LinkedList是双向链表存储结构,允许null元素,是非同步的。提供了额外的addFirst(),addLast(),getFirst(),getLast()等方法用于集合的首尾部操作。常被用作堆栈,队列或双向队列。由于是链表存储,因此查询数据较慢,但是插入或删除速度比较快,具体原因是只需要移动相邻节点的指针即可。

Vector和ArrayList类似,只是Vector是同步的,当一个 Iterator 被创建而且正在被使用,另一个线程改变了 Vector 的状态(例如,添加或删除了一些元素),这时调用 Iterator 的方法时将抛出 ConcurrentModificationException ,因此必须捕获该异常。

2、Set接口

Set具有和Collection完全一样的接口。Set是无序的,元素也是不能重复的,最多只能存在一个null元素。

HashSet,为方便快速查找,存入HashSet的对象必须定义hashCode(),不可重复,无序。

LinkedHashSet,具有HashSet的查询速度,且内部使用链表维护元素的顺序,于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

TreeSet底层为数结构,可以存入一个有序的序列,按照自然顺序排序。

3、Map接口

Map没有继承Collection接口,Map提供了Key和Value的键值映射,Map中不能包含相同的key,包括HashMap,TreeMap,LinkedHashMap等。

HashMap继承了Map,由于Map中搜索键是非常慢的,因此HashMap使用了一个特殊的值,成为“散列码”,每一个对象都有一个唯一的散列码,HashMap通过使用对象的hashCode显著提高了查询速度,但是有可能出现hash冲突的情况。HashMap是非同步的,键值允许null,是无序的。

HashTable同样继承了Map,和HashMap类似,只是HashTable是同步的,键值不允许null,是无序的。

LinkedHashMap和HashMap类似,只是链表结构保证了该map是有序的。

TreeMap是基于红黑树数据结构的,其中的元素是经过排序的,是自然排序。

三、集合和数组的区别

1、集合可以存储多钟类型的数据,数组只能存储一种类型的数据。

2、集合只能存储引用类型的数据,不能存储基本类型数据,数组可以存储基本类型的数据。

3、集合的长度是可拓展的,数组长度是不可变的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值