Java-Map 及其实现类

本文详细介绍了Java中的Map接口以及HashMap的实现原理,包括对象hashCode的作用、HashMap的内部结构、JDK1.8的链表转红黑树优化以及负载因子的概念。此外,还展示了HashMap的使用示例。最后,提到了JDK9引入的新特性,如固定长度集合的便捷创建方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


之前我们用两篇博文一起学习了 单值存储结构,接下来我们将开启 双值存储结构的大门:Map.本文主要以HashMap为例展示代码,其他实现类 方法 与HashMap方法一样,可自行尝试!

Map

补充:Object.hashCode

  • 返回对象的哈希码值,支持此方法的有点事散列表,例如 HashMap 提供的散列表
  • 由 对象数组 + 链表 组成;对象数组 默认长度是16
  • hash算法讲解:通过计算hash值 % 16 产生余数; 该对象存放的位置就是 该余数显示的大小;当某个位置有多个元素存放的时候, 该位置存放的是链表,依次往后放
    • JDK1.8的优化:当数组的某个位置的链表长度 (哈系统中的数据量) >8时,链表自动转化成红黑树
    • 当 哈希桶中的数据量 减少到 6 时,从红黑树 转化成链表
  • 初始桶的数量 16 ; 散列因子 0.75 (当有75% 的桶有数据了,则对数组进行扩容,变为原长度的2倍)
HashMap
  • 负载因子:存储数据的长度/创建hashmap的长度

  • size超过了 总容量 * 负载因子,则会扩容。默认情况下,16 * 0.75 = 12个

  • 1.初始的容量小,但是存储的数据很多 会频繁散列(往链表中添加数据)

  • 2.负载因子过小的话 会占用大量的内存空间(举例:0.5 和 0.75 都有100个长度的数组,但是0.5的话,只能有 50个位置能使用,浪费空间;如果0.75的话,可以有75个位置存放。)

  • 为什么 负载因子 不是1,看上去都用了不好嘛?可参照:https://mp.weixin.qq.com/s/_zbOHbQa2zDVosXUlYUrSQ

/**
 * Map集合存储的是一个个 键值对数据
 * 键不可重复
 * set集合只是使用map集合的键
 * Map 的任何实现类都可以实现下列操作
 *
 * Map
 * HashMap(线程不安全)/ Hashtable(线程安全)/ConcurrentHashMap(分段锁机制)
 * TreeMap
 * LinkedHashMap
 */
public class TextMap {
    public static void main(String[] args){
        HashMap <String,String> data = new HashMap<>() ;
        data.put("key1","锄禾日当午");
        data.put("key2","汗滴禾下土");
        String value = data.get("key1");
        System.out.println(value);
        value = data.get("key2");
        System.out.println(value);

        Set<String> set = data.keySet(); // 得到key的单值集合
        for (String key:set) {
            System.out.println(key+" : "+data.get(key));
        }

        System.out.println("_________________");
        Collection <String> values = data.values();
        for(String myvalue: values){
            System.out.println(myvalue);
        }
    }

HashMap


JDK 9 提供的新特性

  • 提供了几个固定长度 的集合 的 更便捷方法

    	public static void main(String[] args) {
            List<String> list = List.of("锄禾日当午","汗滴禾下土");
           // list.add("谁知盘中餐");//不能使用
    
            for(String s:list){
                System.out.println(s);
            }
            Set <String> set = Set.of("1111","22222222");
            for(String se:set){
                System.out.println(se);
            }
            Map<String,String> map = Map.of("key1","1111","key2","222");
            Set<String> keySet = map.keySet();
            for(String key:keySet){
                System.out.println(key +":"+map.get(key));
            }
        }s
    

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小白小小白小白鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值