Java基础复习笔记(三)

泛型中extends和super的

<? extends T> 表示包括T在内的任何T的子类;
<? super T> 表示包括T在内的任何T的父类。
 

JDK1.7到1.8 HashMap底层变化

JDK1.7
底层是数组+链表,链表插入使用的是头插法,并且哈希算法比较复杂,存在右移与异或运算;
JDK1.8
底层是红黑树,提高了了HashMap插入和查询的效率,链表插入用的是尾插法,因为1.8中插入key和value时需要判断链表元素个数,所以需要遍历链表元素个数,1.8中对哈希算法进行了简化,因为哈希算法的目的是提高散列性来提供HashMap的整体效率,红黑树的添加可以适当简化算法,节省CPU资源。
 

HashMap和HashTable区别及HashMap的Put方法

HashMap
HashMap方法中没有synchronized修饰,线程非安全,允许key和value为null
HashTable
线程安全,不允许key和value为null;
底层实现
数组+链表实现
jdk1.7先判断是否需要扩容,如果需要就进行扩容,不需要就生成Entry对象,并用头插法添加到当前位置对应链表中;
jdk1.8开始链表高度到8、数组长度超过64,链表转化为红黑树,元素内部类的Node节点存在:
如果是红黑树Node,则先将key个value封装为一个红黑树节点并添加到红黑树种去,在这个过程中判断红黑树种是否存在当前key,如果存在则更新value;
如果此位置上的Node对象是链表节点,则将key和value封装为一个链表Node并通过尾插法插入到链表的最后位置去,尾插法需要遍历链表,在遍历过程判断是否存在当前key,存在则更新value,遍历完成后将新链表Node插入到链表中,插入后当链表阶段个数到达8,则转换为红黑树;
将key和value插入到链表活红黑树种后,再判断收复进行扩容,需要就扩,不需要就结束Put方法。
 

HashMap的扩容机制原理

1.7
1.先生成新数组;
2.遍历老数组的每个位置上的链表上的每个元素;
3.取每个元素的key,并基于新数组的长度,算出每个元素再新数组中的下标;
4.将所有元素添加到新数组中去;
5.所有的元素转移完了之后,将新数组赋值给HashMap对象的table属性
1.8
1.先生成新数组;
2.遍历老数组的每个位置上的链表或红黑树;
3.如果是链表则直接将链表中的每个元素重新计算下标,并添加到新数组
4.如果是红黑树,则先遍历红黑树,先计算出红黑树种每元素对应在新数组的下标位置;
    a.统计每个详表位置的元素个数;
    b.如果该位置下的元素个数超过8个,则生成一个新的红黑树,并将根节点添加到新数组对应位置;
    c.如果该位置下的元素个数没有超过8,那么生成一个链表,并将链表的头节点添加到新数组的对应位置;
5.所有元素转移完了之后,将新数组赋值给HashMap对象的table属性。

ConcurrentHashMap

concurrentHashMap是一个支持高并发更新与查询的哈希表(基于HashMap)。
在保证安全的前提下,进行检索不需要锁定。与hashtable不同,该类不依赖于synchronization去保证线程操作的安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值