集合还在只用list吗?不如看一下Map集合

java面试题:
java 中 IO 流分为几种? (1)按流划分,可以分为输入流和输出流;

(2)按单位划分,可以分为字节流和字符流;

字节流:inputStream、outputStream;

字符流:reader、writer;

1.Map集合

  • Map集合是一种双列集合,每个元素包含两个数据
  • Map集合的每个元素的格式:key=value(键值对元素)
  • Map集合也被成为键值对集合

特点

  • Map集合的特点都是由键决定的
  • Map集合的键是无序,不重复,无索引
  • Map集合后面重复的键对应的值可以覆盖前面重复键的值
  • Map集合的键值对都可以为null

Map集合实现类特点

  • HashMap:元素按照键是无序,不重复,无索引的
  • LinkedHashMap:元素是键有序,不重复,无索引
  • TreeMap:元素是键排序,不重复,无索引

Map集合基本用法

        //1.创建一个Map集合对象
        Map<String,Integer> map = new HashMap<>();
        // Map<String,Integer> map = new LinkedHashMap<>();
        map.put("java",1);
        map.put("set",25);
        map.put("map",13);
        map.put("java",null);
        System.out.println(map);

        //2.清空集合
        // map.clear();

        //3.判断集合是否为空
        System.out.println(map.isEmpty());

        //4.根据键获取对应值
        System.out.println(map.get("set"));
        //没有sss键,所以获取的值为null
        System.out.println(map.get("sss"));

        //5.删除元素,返回删除key的值
        System.out.println(map.remove("map"));

        //6.判断map是否包含某个键或值
        System.out.println(map.containsKey("java"));
        System.out.println(map.containsValue(25));

        //7.获取所有键或值的集合
        System.out.println(map.keySet());
        System.out.println(map.values());

        //8.合并其他集合
        Map<String,Integer> map1 = new HashMap<>();
        map1.put("mybatis",10);
        map1.put("session",10);
        map1.put("java",1000);
        map.putAll(map1);
        System.out.println(map);

Map集合的遍历

方法一:先获取所有的key值,然后遍历key,取到对应的值

        Map<String,Integer> map = new HashMap<>();
        map.put("张三",18);
        map.put("李四",22);
        map.put("王五",21);
        map.put("赵六",20);

        for (String s : map.keySet()) {
            System.out.println("key:"+s+",value:"+map.get(s));
        }

方法二:将Map集合转换成Set集合后遍历

        //通过entrySet将Map集合转换成Set集合
        //将键值对封装成一个整体对象
        //将Map集合转换成set集合
        Set<Map.Entry<String, Integer>> entries = map.entrySet();

        //foreach遍历
        for (Map.Entry<String, Integer> entry : entries) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println("key:"+key+",value:"+value);
        }

方式三:foreach方式进行遍历
foreach的底层实现还是通过Map.Entry<K, V>去实现的

        map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String key, Integer value) {
                System.out.println("key:"+key+",value:"+value);
            }
        });

方式四:foreach形式还可以用lambda表达式进一步简化

        map.forEach((key,value)->{ System.out.println("key:"+key+",value:"+value);});

2.HashMap

特点

  • HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引
  • HashMap跟HashSet底层原理是一样的,都是哈希表结构,HashMap的每个元素包含两个值

实际中HashSet就是HashMap,只不过HashSet只用了HashMap的键而没有用HashMap的值
在这里插入图片描述
HashSet的实现原理

LinkedHashMap集合特点

  • 由键决定:有序、不重复、无索引
  • 有序是保证存储和取出的元素顺序一致
  • 原理:底层数据结构依然是哈希表,只是每个键值对元素额外多了一个双链表的机制记录存储顺序
    在这里插入图片描述

TreeMap集合特点

  • 由键决定特性:不重复、无索引、可排序
  • 可排序:按照键数据的大小默认升序,只能对键排序
  • 注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序
  • TreeMap跟TreeSet底层原理一样(TreeSet是基于TreeMap实现的)

TreeMap集合自定义排序规则的两种方法

  • 类实现Comparable接口,重写比较规则
  • 集合自定义Comparator比较器,重写比较规则

示例

第一个map集合因为键是Integer,所以TreeMap会自动给我们进行排序。
第二个produce集合中我们定义了排序的规则
第三个produce1集合,根据集合构造器比较器重写降序排序

        Map<Integer,String> map = new TreeMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        map.put(4,"赵六");
        System.out.println(map);

        Map<Produce,String> produce = new TreeMap<>();
        produce.put(new Produce("001","牛奶",5.5),"商品一");
        produce.put(new Produce("002","面包",4.5),"商品二");
        produce.put(new Produce("003","火腿肠",2.3),"商品三");
        produce.put(new Produce("004","泡面",1.5),"商品四");
        System.out.println(produce);
        
        Map<Produce,String> produce1 = new TreeMap<>(new Comparator<Produce>() {
            @Override
            public int compare(Produce o1, Produce o2) {
                //按照价格进行降序
                return Double.compare(o2.getPrice(),o1.getPrice());
            }
        });
        produce1.put(new Produce("001","牛奶",5.5),"商品一");
        produce1.put(new Produce("002","面包",4.5),"商品二");
        produce1.put(new Produce("003","火腿肠",2.3),"商品三");
        produce1.put(new Produce("004","泡面",1.5),"商品四");
        System.out.println(produce1);

		//利用lambda表达式简化开发
        Map<Produce,String> produce1 = new TreeMap<>((o1,  o2)->Double.compare(o2.getPrice(),o1.getPrice()));
    @Override
    public int compareTo(Produce o) {
        //根据价格进行比较
        return this.price - o.price >= 0 ? 1 : -1;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狗头实习生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值