HashMap学习总结

HashMap是一个基于哈希表的数据结构,用于存储键值对,使用哈希算法快速定位元素。它在JDK1.7及之前使用数组+链表,1.8后引入红黑树以优化长链表的查找效率。HashMap非线程安全,适合单线程环境,若需线程安全应使用ConcurrentHashMap。注意初始化容量和负载因子以避免频繁扩容,且自定义对象作为键时需重写hashCode和equals方法。
摘要由CSDN通过智能技术生成

目录

1,什么是hashmap、怎么用、hashmap底层数据结构

2,使用hashmap注意事项

3,为什么要用数组+链表,数组和链表的区别是什么

 4.map和hashmap有什么区别,如何实现。

map

HashMap


1,什么是hashmap、怎么用、hashmap底层数据结构

      HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干,数组每一个元素的初始值都是Null。   

     hashmap是map接口的主要实现类;HashMap可以使用哈希算法对集合进行操作、查找,效率高,无序。

    hashmap通过取余操作,将key用特定的哈希算法算出一个数,然后取余,按照数组长度-1取余,得到的数永远比数组小,永远不会越界。

JDK1.7之前hashmap的底层是数组+链表  JDK1.8之后引入红黑树

当链表长度大于8时,遍历查找效率较慢,故引入红黑树

并不是只需要链表长度大于8,同时需要满足条件数组长度大于64的时候变成红黑树 还有如果红黑树的节点个数小于6的时候,红黑树还会变成链表

hashmap为什么一开始不就使用红黑树?

这是因为红黑树相对于链表维护成本大,红黑树在插入新数据之后,可能会通过左旋、右旋、变色来保持平衡,造成维护成本过高,故链路较短时,不适合用红黑树。

2,使用hashmap注意事项

   HashMap的容量,默认是16 HashMap的加载因子,默认是0.75

当HashMap中元素数超过容量 * 加载因子时,HashMap会进行扩容。

所以要注意,如果要往HashMap中放1000个元素,又不想让HashMap不停的扩容,最好一开始就把容量设为2048,设为1024不行,因为元素添加到七百多的时候还是会扩容。

如果已知向hashmap中只存放2个元素,那么就要注明初始化容量为2,否则初始化为默认的16

HashMap<Integer,Integer> map = new HashMap<>(2);

map.put(1,1);

map.put(2,2);

这种的hashmap存入的是个对象,则需要查看这个对象中的所有变量是否都需要hash,如果不是都需要则需重写hashCode和equals(HashMapvalue的查找是通过keyhashCode来查找,所以对自己的对象必须重写hashCode方法通过hashCode找到对象地址后会用equals比较你传入的对象和HashMap中的key对象是否相同,因此还要重写equlas.)

HashMap<User,Integer> map = new HashMap<>();

HashMap的方法不是线程安全的。HashMap在并发执行put操作时发生扩容,可能会导致节点丢失,产生环形链表等情况。 节点丢失,会导致数据不准 生成环形链表,会导致get()方法死循环。

HashMap的设计初衷就不是在并发情况下使用,如果有并发的场景,推荐使用ConcurrentHashMap

3,为什么要用数组+链表,数组和链表的区别是什么

    数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以将数组和链表结合在一起,发挥两者各自的优势,使用一种叫链地址法的方式可以解决哈希冲突。

 4.map和hashmap有什么区别,如何实现。

HashMap<Integer,Integer> map = new HashMap<>();

Map<Integer,Integer> maps = new HashMap<>();

这两种写法的区别:map可以使用HashMap对象中的所有方法,而maps只能使用map接口中的方法

Hashmap的key值,无论传什么类型:Integet、String、对象、List集合等最终都会按照哈希方法取余

map

        Map是一个接口。

        Map一次会储存两个对象,一个key键的对象,一个value值的对象。

HashMap

        HashMap是继承AbstractMap接口和实现了Map接口的类;

        HashMap可以使用哈希算法对集合进行操作:查找,效率高,无序。

        HashMap是Map接口的主要实现类。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值