集合4---hashmap

HashMap是Java中常用的集合类,它继承AbstractMap并实现了Map、Cloneable和Serializable接口。HashMap的底层数据结构是数组加链表,或者在JDK8中,当链表过长时转为红黑树。其核心变量包括table(存储元素的Node数组),entrySet(存储Map.Entry的集合),capacity(容量,必须是2的幂次)和size(元素个数)。HashMap使用负载因子(默认0.75f)和阈值来触发扩容,put方法通过特定的hash算法减少冲突。
摘要由CSDN通过智能技术生成

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {

hashmap继承abstractMap,实现map、Cloneable、Serializable

public abstract class AbstractMap<K,V> implements Map<K,V> {

abstractmap实现map

public interface Map<K,V> {

一、table变量

底层数据结构,是hashmap静态内部类Node的变量,node是一种数组加链表的底层数据结构

    static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;

        Node(int hash, K key, V value, Node<K,V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }

数组和链表有各自的优点

数组连续存储,寻址容易,插入删除操作相对困难。

链表离散存储,寻址相对困难,插入删除操作容易

hashmap结合这两种数据结构,在jdk8中,当链表长度(大于等于8的时候)太长,会转化为红黑树。链表时间复杂夫n,红黑树时间复杂的logn

二、entrySet变量

entrySet是EntrySet实体,定义为变量可保证不重复多次创建,是一个Map.Entry的集合,Map.Entry<K,V>是一个接口,Node类实现了该接口,EntrySet中方法操作的数据就是hashmap的Node实体

    transient Set<Map.Entry<K,V>> entrySet;//变量entrySet

    static class Node<K,V> implements Map.Entry<K,V> {//Node类实现了该接口

    public Set<Map.Entry<K,V>> entrySet() {
        Set<Map.Entry<K,V>> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;//保证不可重复多次创建
    }

三、capacity

capacity不是一个成员变量,hashmap会用到这个概念,它的意思是容量

hashmap具有扩容机制,容量的规则是2的幂次,即capaticy是1,2,4,8.....

四、size

size变量记录了map中的key-value对的对数

五、threshold(阀)和loadfactor(负载系数)

threshold为临界值:threshold=capacity*loadfactor,超过临界值,就要扩容。

loadfactor(负载系数):装载因子,默认0.75f。

 

hashmap一些方法

一、put方法流程

hashmap的hash算法:是hashcode值与其hashcode值右移16位然后进行异或运算^得到的。这样使得冲突的概率变小。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值