java学习日记19,集合之Map接口

Map接口

与Collection存储单列数据不同,Map存储的是key-value形式的双列数据。其中,key值不可重复,value值可重复,也就是多个key可能有相同的value值,但一个key只有一个value值。
Map接口框架如下:
在这里插入图片描述
HashMap是Map接口的主要实现类,线程不安全,效率高。
LinkedHashMap是HashMap的子类,与HashMap相比多了before和after两个属性,在遍历元素时,可以按照元素的添加顺序进行遍历,对频繁的遍历操作效率比HashMap更高。
TreeMap保证照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序。
HashTable是早期的实现类,线程安全的,效率低。其子类Properties:常用来处理配置文件。key和value都是String类型。

存储结构

在Map中,key值不可重复,value值可重复,也就是多个key-value中可能有相同的value值,但不会有相同的key。
key值使用Set存储,在HashMap中,key所在的类必须重写其equals()方法和hashCode()方法。
value值用Colletion存储,value所在的类必须重写equals()方法。
Map中还有entry/node,一对key-value构成了一个Entry/Node对象,用Set存储。

jdk7中HashMap中添加的实现原理:

首先,在HashMap实例化以后,会创建一个长度为16的一位维组Entry[] table;
当对该对象添加元素(key,value)时,调用key所在类的hashCode方法计算出key的哈希值,然后用某种算法计算得到其在Entry数组中的存放位置:
①如果该位置上数据为空,那么key-value添加成功。
②如果该位置上数据不为空,那么比较key与该位置上存在的一个或多个元素的哈希值:
|–如果key的哈希值与已经存在的数据的哈希值都不相同,那么key-value添加成功;
|–如果key的哈希值与已存在的数据的哈希值相同,那么调用key所在类的equals()方法,与相同的数据进行比较:
①如果返回false,那么key-value添加成功。
②如果返回true,使用value替换原本的value值。

jdk8中实现原理的不同:

1.在第一次调用put方法时创建长度为16的数组Node[],而非实例化时创建
1.1jdk8中创建的数组为Node[],而非Entry[]。
2.jdk7中底层结构只有数组+链表,而在8中为数组加+链表+红黑树。
2.1形成链表时,jdk7中,新的元素会取代旧元素的位置,指向旧的元素,jdk8中是旧的元素指向新的元素。
2.2当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 ,且当前数组的长度 > 64时,此时此索引位置上的所数据改为使用红黑树存储。

HashMap底层典型属性的属性的说明:
DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,16
DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
threshold:扩容的临界值,=容量*填充因子:16 * 0.75 => 12
TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树:8
MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量:64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值