关于Map数据类型的理解

本文详细介绍了Map数据类型,包括HashMap、LinkedHashMap和TreeMap的实现原理和操作方法。HashMap基于哈希表,提供快速的查找;LinkedHashMap保持插入顺序或访问频率,适合实现LRU缓存;TreeMap利用红黑树实现,提供有序的遍历。此外,文章还涵盖了Map的主要操作和遍历方式。

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

1、什么是map数据类型?

        map是K-V类型的数据,map是一个该种数据类型的顶级接口。

2、map的实现类和组成以及扩充规则

        map有多种实现类,其中日常开发中主要使用的有hashmap,linkedhashmap,treemap等。map实际就是是由一个一个entry对象组成,entry对象中包含key、value、next以及hash值。其中key和value就是我们设置的key和value,next是指向下一个entry对象,hash值是根据key的值经过一系列计算而得到的hash值。map中数据占位超过长度*负载因子后,将发生扩容。所以创建map时要大概预估要存放多少数据,从而设置合适的长度,避免频繁扩容从而影响效率。

3、map的主要方法

        map包含多种操作方法,其中有:put(往map中添加数据)、get(根据key获取value值)、size(map长度)、remove(清除一个k-v)、clear(清空map)、isEmpty( 判断是否为空),putifabsent(添加一个k-v,已经存在则不添加)等等

4、map的遍历方法

        1、keySet()方法

        for(String key:map.keySet()){

                system.out.println(key+":"+map.get(key))

        }

        2、values()方法

        for(String vaule:map.values()){

                system.out.println("vaule:"+value)

        }

        3、entrySet()方法

        for(Entry en:map.entrySet()){

                system.out.println(en.getKey()+":"+en.getValue())

        }

        4、Iterator()方法

        Iterator<Entry<String, Object>> it = map.entrySet().iterator();
           while(it.hasNext()){
                Entry<String, Object> entry = it.next();
                System.out.println("key:"+entry.getKey()+"  key:"+entry.getValue());
          }

5、hashmap

        hashmap的底层是由数组和链表实现,存放数据时,通过key值经过一系列运算得到hash值,然后根据hash值在数组中找到对应的位置,如果对应的位置已经存在相关entry对象,则以链表形式存放在该对象后面。链表长度大于8并且hashmap长度大于64则会将链表转换为红黑树,以提高效率。

        hashmap构建方法:

        1、无参数构造方法:hashmap()

                这种构造方法默认map长度为16,负载因子为0.75

        2、一个参数构造方法:hashmap(int initialCapacity)

                 这种构造方法默认负载因子为0.75,map长度为指定

        3、两个参数构造方法:hashmap(int initialCapacity, float loadFactor)        

                这种构造方法默认map长度和负载因子都为指定

  6、linkedhashmap

        linkedhashmap底层是由双向链表实现,它继承自hashmap,它与hashmap不同的是,它默认的取出数据顺序是存入顺序,而hashmap默认的取出顺序为hash值计算的顺序,而且它不仅支持存入数据,还支持通过使用频率来取数据 ,使用这个特性,可以用linkedhashmap来实现LRU缓存。          

        linkedhashmap构建方法:

        1、无参数构造方法:linkedhashmap()

                这种构造方法默认map长度为16,负载因子为0.75,此种输出顺序为存入顺序

        2、一个参数构造方法:linkedhashmap(int initialCapacity)

                 这种构造方法默认负载因子为0.75,map长度为指定,此种输出顺序为存入顺序

        3、两个参数构造方法:linkedhashmap(int initialCapacity, float loadFactor)        

                这种构造方法默认map长度和负载因子都为指定,此种输出顺序为存入顺序

        4、两个参数构造方法:linkedhashmap(int initialCapacity, float loadFactor,true)        

                这种构造方法默认map长度和负载因子都为指定,此种输出顺序为使用频率,频率高的放后面

        linkedhashmap实现LRU缓存:

        要实现LRU缓存,需自己定义liankedhashmap子类:

        定义自定义缓存map
        public class LRUMap<K,V> extends LinkedHashMap<K,V>{
                //缓存里面保存几条数据
                private int maxSize;
                public LRUMap(int maxSize){
                        super(16,0.75f,true);
                        this.maxSize=maxSize;
                }
                @Override
            protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
                return size()>this.maxSize;
            }
        }
        使用:
        Map LRU = new LRUMap(3);
        LRU.put("x1",1);
        LRU.put("x2",2);
        LRU.put("x3",3);
        LRU.put("x4",4);
        LRU.put("x5",5);
        System.out.println(LRU);
        //输出为{x3=3,x4=4,x5=5}
        LRU.get("x1");
        System.out.println(LRU);
        //输出为{x4=4,x5=5,x1=1}

7、treemap

        TreeMap的实现是红黑树算法的实现。其输出数据默认为升序输出,当然也支持降序输出和自定义输出,降序和自定义输出需要自定义Comparator比较器     

treemap构建方法:

        1、无参数构造方法:treemap()

                这种构造方法默认map长度为16,负载因子为0.75,此种输出顺序为正序顺序

        2、一个参数构造方法:treemap(int initialCapacity)

                 这种构造方法默认负载因子为0.75,map长度为指定,此种输出顺序为正序顺序

        3、两个参数构造方法:treemap(int initialCapacity, float loadFactor)        

                这种构造方法默认map长度和负载因子都为指定,此种输出顺序为正序顺序

        4、两个参数构造方法:treemap(new Comparator<String>(){
                            public int compara(String a,String b){
                                //return a.comparaTo(b); 正序
                                return b.comparaTo(a); 倒序
                            }
                        })        

               这种构造方法默认map长度为16,负载因子为0.75,此种输出顺序为倒序顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值