首页 > 其他分享 >Day07集合-HashMap

Day07集合-HashMap

时间:2022-08-26 19:34:12浏览次数:64  
标签:HashMap Day07 链表 static key 集合 final hashmap

HashMap

特点:

  • jdk1.2,运行效率快,线程不安全,允许null作为key或者value

使用:

  • 存储结构:哈希表(数组+链表+红黑树)
  • 使用key的hashcode和equals判重
//创建
HashMap<student,String> hashmap =new HashMap<>();

//添加
hashmap.put(s1,"string1");
hashmap.put(s2,"string2");
hashmap.put(s3,"string3");

//删除
hashmap.remove(s1);

//遍历
for (Teacher t:hashMap.keySet() ) {
       System.out.println(t + "-------->" + hashMap.get(t));
}

for (Map.Entry<Teacher,String> entry: hashMap.entrySet()) {
       System.out.println(entry);
}

//判断
System.out.println(hashMap.isEmpty());
System.out.println(hashMap.containsKey(t4));

源码分析:

  • 初始容量
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
  • 最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
  • 加载因子(数据数大于当前哈希表容量的0.75倍时进行扩容)
static final float DEFAULT_LOAD_FACTOR = 0.75f;
  • 链表变红黑树的节点(当链表的长度大于8,数组长度大于64时,链表向红黑树转换)
static final int TREEIFY_THRESHOLD = 8;
static final int MIN_TREEIFY_CAPACITY = 64;
  • 红黑树变为链表的节点(当链表长度小于6,红黑树调整为链表)
static final int UNTREEIFY_THRESHOLD = 6;
  • 哈希表中的数组(哈希桶)
transient Node<K,V>[] table;
  • 无参构造
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
  • put方法
public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}
  • 总结
    • HashMap刚创建时,table的容量为0,为了节省内存空间,当插入第一个元素后table容量调整为16。
    • 当元素个数大于阈值(table当前容量*加载因子)时,进行扩容,每次扩容为原容量的两倍,目的为减少调整元素个数。
    • 当链表的长度大于8,数组长度大于64时,链表调整为红黑树,目的为提高执行效率。
    • 当链表长度小于6,红黑树调整为链表。
    • jdk1.8以前插入元素使用头插法,jdk1.8以后使用尾插法。
  • tips:HashMap和HashSet

​ HashSet底层使用的为HashMap结构,使用HashMap的key来插入删除。

标签:HashMap,Day07,链表,static,key,集合,final,hashmap
From: https://www.cnblogs.com/workplace-blog/p/16628960.html

相关文章

  • Day07集合-Map父接口
    MapMap父接口存储一对数据(key—Value),无序,无下标,建不可以重复,值可以重复。方法方法摘要voidclear()从此映射中移除所有映射关系(可选操作)。bo......
  • Day05集合-Collection
    集合1.集合的概念对象的容器,实现了对对象的常用操作,类似数组功能位置:java.util.*2.集合和数组的区别集合长度不固定,数组长度固定集合只能存储引用数据类型,数组可......
  • C#集合:ICollection和IList接口
    虽然枚举接口IEnumerable提供了一种向前迭代集合的协议,但是它们并没有提供确定集合大小、根据索引访问成员、搜索以及修改集合的机制。为了实现这些功能,.NETCore定义了ICo......
  • 集合集成关系
    collection集合继承实现关系(单列集合)Collection有个重要子接口List和Set,他们的实现子类都是单列集合===========================================================......
  • 列表、元素、字典和集合
    Pythonlist`list`可存储任意类型,支持`list()`。list方法增删查appendpopindexextendremovecountinsertclear子串是Python序列操作的一......
  • 集合.Collection体系集合
    Collection父接口特点:代表一组任意类型的对象,无序,无下标,不能重复方法:booleanadd(Objectobj);添加一个对象booleanaddAll(Collectionc);将一个集合中的所有对象......
  • ArrayList集合存储基本数据类型
    ArrayList集合存储基本数据类型 如果希望向集合ArrayList当中存储基本类型数据,必须使用基本类型对应的“包装类”基本类型包装类byteByteshor......
  • ArrayList集合概述和基本使用和常用方法和遍历
    ArrayList集合概述和基本使用数组的长度不可以发生改变但是ArrayList集合的长度是可以随意变化的对于ArrayList来说,有一个尖括号<E>代表泛型泛型:也就是转正集合当中的......
  • Java-Java集合
    一、List,Set,Map三者的区别二、Arraylist与LinkedList区别三、ArrayList与Vector区别呢?为什么要⽤Arraylist取代Vector呢四、HashMap和Hashtable的区别五......
  • Java-Java集合排序
    一、ListMap排序修订记录版本是否发布2020-01-25v1.0是一、ListMap排序Java中list里面存放map,根据map中的某一个或多个字段进行排序importjava.u......