Map哈哈

本文详细介绍了Java中的Map数据结构,包括HashMap的底层原理、put操作(添加与覆盖)、contains方法,以及TreeMap的排序特性。同时讨论了何时选择HashMap、TreeMap和LinkedHashMap,并指出键值重复的处理方式。
摘要由CSDN通过智能技术生成

**

1.Map

**
V put(K key,V value)

Map<Integer,Integer> map = new HashMap<>();
        map.put(1,2);
        map.put(2,3);
        map.put(3,6);
        Integer f=  map.put(3,5);
        System.out.println(f);//6
        System.out.println(map);

put操作可以执行添加和覆盖操作。
如果添加的键值不存在,则将键值对加入,返回null
如果存在,则返回被覆盖的value。

判断是否包含

bool containsValue(V value)
bool containsKey(K key)
Map<Integer,Integer> map = new HashMap<>();
        map.put(1,2);
        map.put(2,3);
        map.put(3,6);

        Set<Integer> set = map.keySet();
        for(Integer a:set){
            System.out.println(map.get(a));
        }

        Iterator<Integer> it = set.iterator();
        while(it.hasNext()){
            int a = it.next();
            System.out.println(map.get(a));
        }

        set.forEach(a-> System.out.println(map.get(a)));

        for(Map.Entry<Integer,Integer> entry : map.entrySet()){
            System.out.println(entry.getKey()+"="+entry.getValue());
        }

        Iterator<Map.Entry<Integer,Integer>> it2 = map.entrySet().iterator();
        while(it2.hasNext()){
            Map.Entry<Integer,Integer> temp = it2.next();
            System.out.println(temp.getKey()+"="+temp.getValue());
        }

        map.entrySet().forEach(entry->System.out.println(entry.getKey()+"="+entry.getValue()));

        map.forEach(new BiConsumer<Integer, Integer>() {
            @Override
            public void accept(Integer integer, Integer integer2) {
                System.out.println(integer+"="+integer2);
            }
        });

        map.forEach((Integer integer, Integer integer2)->System.out.println(integer+"="+integer2));

**

HashMap

**
底层原理
(1)创建一个默认长度为16,默认加载因子为0.75的数组(当数组中元素大于16*0.75时,数组长度变为原来两倍)
(2)根据Key的哈希值和数组长度计算出应存入的位置index
index = (数组长度-1)&哈希值
(3)判断当前位置是否为null,null则直接存入
(4)如果不为null,则调用equals方法比较Key
(5)如果链表上存在Key相同,用当前待插入的value替代与这个Key相同的键值对的value;否则,存入对应index位置的链表或者红黑树中。新元素挂在老元素下面,如果链表长度大于8且数组长度大于等于64,自动转换为红黑树。
PS:当集合存储的是自定义对象,必须要重写hashCode和equals方法。因为如果不重写,hashCode和equals默认计算和比较地址值,而大多数情况我们需要根据属性值来计算和比较。

**

TreeMap

**
和TreeSet差不多,按照Key进行排序,当然自己也可以重写。
TreeMap添加元素的时候,键是否需要重写hashCode和equals方法?
不用,根本没有用到key
HashMap是哈希表结构,JDK8开始由数组,链表,红黑树组成。既然有红黑树,HashMap的键值是否需要实现Comparable接口或者传递比较器对象呢?
不用,系统默认用hash值进行比较
TreeMap和HashMap谁的效率更高?
不一定,一般来说HashMap效率高,极端情况下TreeMap好一点
Map集合中,java会提供一个键值重复,不会覆盖的put方法吗?
会。
三种双列集合该如何选择?
默认HashMap,如果要求存取有序就用LinkedHashMap,如果要求有序就TreeMap。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值