map、hashMap(2021.10.25)

Map接口

在这里插入图片描述

package cn.tedu.map;
/*本类用于测试Map接口*/

import java.util.*;

/**
 * @author z
 * @create 2021-10-25-14:08
 */
public class MapDemo {
    public static void main(String[] args) {
        //1.创建map对象
        /*Map中的数据要符合映射规则,需要同时指定K与V的数据类型
        * 至于K和V具体指定成什么类型,取决于业务的具体要求*/
        Map<Integer,String> map = new HashMap<>();
        //2.向map集合存入数据,注意方法是put
        map.put(8848,"白骨精");
        map.put(8849,"黑熊精");
        map.put(8850,"鲤鱼精");
        map.put(8851,"黄毛怪");
        map.put(8852,"黑熊精");
        map.put(8848,"女儿国国王");
        System.out.println(map);
        /*1.map中存放着的都是无序的数据
        * 2.map中的value可以重复--比如我们可以存两个黑熊精
        * 3.map中的key不允许重复,如果重复,新value会把旧value覆盖掉
        * 比如女儿国国王和白骨精的key都是8848,白骨精被覆盖掉*/

        //3.进行方法测试
//        map.clear();
//        System.out.println(map);
        System.out.println(map.equals("黄毛怪"));//
        System.out.println(map.isEmpty());
        System.out.println(map.size());//5,获取map集合中键值对的个数

        //判断map集合是否包含指定的key-键
        System.out.println(map.containsKey(8848));
        //判断map集合是否包含指定的value-值
        System.out.println(map.containsValue("白骨精"));

        //将map集合中所有的value值取出,放入Collection集合中
        //Collection<Type>中Type的类型,取决于map中value的类型
        Collection<String> values = map.values();
        System.out.println(values);

        //4.map集合的迭代方式一
        /*我们想要遍历map中的数据,但是map集合本身没有自己的迭代器
        * 所以需要先将map集合转为Set集合后,再使用set的迭代器进行迭代
        * 代码:Set<Key> = map.keySet();
        * 作用:将map中所有的key值取出,存入set集合中,此处set的泛型是Integer*/

        Set<Integer> set = map.keySet();//将map集合转为set集合,set中存的是map的key
        Iterator<Integer> it = set.iterator();
        while (it.hasNext()){
            Integer key = it.next();
            String value = map.get(key);
            System.out.println("{"+key+"="+value+"}");
        }

        //5.map的迭代方式二
        /*遍历map集合,需要把map集合转换为set集合
        * 本方案是把一对键值对看成是一个Entry
        * 代码:Map.Entry<Key,Value> = map.entrySet();
        * Map.Entry<K,V>,这里是Map.Entry<Integer,String>*/
        //将map集合转换成只存entry的set集合
        Set<Map.Entry<Integer, String>> set2 = map.entrySet();
        //获取set集合的迭代器,泛型就是集合的类型entry
        Iterator<Map.Entry<Integer, String>> it2 = set2.iterator();
        while (it2.hasNext()){//判断是否有下一个元素可迭代
            //System.out.println(it2.next());//方式1:可以直接打印
            //方式2:接一下本轮循环获取的entry
            Map.Entry<Integer, String> entry = it2.next();
            Integer key = entry.getKey();//根据entry获取对应的key
            String value = entry.getValue();//根据entry获取对应的value
            System.out.println("*"+key+"-"+value+"*");//拼接打印
        }
    }
}

HashMap

在这里插入图片描述

1.HashMap的存储过程:

1.HashMap的结构是数组+链表 或者 数组+红黑树 的形式
2.HashMap底层的Entry[ ]数组,初始容量为16,加载因子是0.75f,扩容按约为2倍扩容
3.当存放数据时,会根据hash(key)%n算法来计算数据的存放位置,n就是数组的长度,其实也就是集合的容量
4.当计算到的位置之前没有存过数据的时候,会直接存放数据
5.当计算的位置,有数据时,会发生hash冲突/hash碰撞
解决的办法就是采用链表的结构,在数组中指定位置处以后元素之后插入新的元素
也就是说数组中的元素都是最早加入的节点
6.如果链表的长度>8时且entry数组长度大于64,,链表会转为红黑树,当链表的长度<6时,会重新恢复成链表

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值