Java集合中HashMap、Hashtable、LinkedHashMap详解(2022.5.28)

Map接口

  • Map接口它是以键值对(key=value)的方式进行一对一对的存储数据,在存储的过程中key的值不能重复,但是value的值可以重复。
  • 特点:
  • key无序,唯一,value可以重复
  • 底层是哈希表结构(数组+链表的实现),如:这个HashMap中放入了一个自定义的引用类型(类),就必须重写 hashCode() 和equals()方法,要不然就会存入重复的元素,破坏了 HashMap 的规则。

[1] HashMap实现类
HashMap集合的方法使用:

    package zhai.map;
    
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    /*
        Map集合(接口):key(键):不能重复     value(值):可以重复
     */
    public class MapDemo1 {
        public static void main(String[] args) {
            // 创建一个
            Map<String, String> map = new HashMap<>();
            map.put("zhangsan","12");
            map.put("zhangsan","13");   // 怎么输出的是第二个zhangsan?
            map.put("wangwu","14");
            map.put("zhaoliu","25");
            map.put("zhai","19");
            map.put("liu","20");
            map.put("li","20");
            map.remove("li");
    //        map.clear();  清空集合中的所有数据
            System.out.println(map.isEmpty());  // 判断集合是否为空 返回 boolean 值
            System.out.println(map.containsKey("zhai"));  // 查看集合中是否包含zhai这个键
            System.out.println(map.containsValue("12"));  // 查看集合中是否包含12这个值
            System.out.println(map.containsValue("13"));
            System.out.println(map.get("zhai"));    // get:通过zhai这个键(键)找到相对应的值(value)
            System.out.print(map.size()+":");
            System.out.println(map);
            Map<String, String> map1 = new HashMap<>();
            map1.put("zhangsan","12");
            map1.put("zhangsan","13");   // 怎么输出的是第二个zhangsan?
            map1.put("wangwu","14");
            map1.put("zhaoliu","25");
            map1.put("zhai","19");
            map1.put("liu","20");
            map1.put("li","20");
            map1.remove("li");
            System.out.println(map == map1);  // == :比较的是new的内存地址,一定不相等
            System.out.println(map.equals(map1)); // equals:比较的是集合中具体的内容,只要内容相等绝对相等
    
            System.out.println("------------");
            // 获取集合中所有的 key
            Set<String> set1 = map1.keySet();
            for (String s1: set1) {
                System.out.println(set1);
            }
            System.out.println("------------");
            // 获取集合中所有的 value
            Collection<String> coll = map1.values();
            for (String s2:coll ) {
                System.out.println(s2);
            }
            System.out.println("------------");
            // 通过 keySet 和 get 方法获取集合中的 value
            Set<String> set2 = map1.keySet();
            for (String s3: set2) {
                System.out.println(map1.get(s3));
            }
            System.out.println("------------");
            // 通过 entrySet 方法获取 key 和 value
            Set<Map.Entry<String, String>> entries1 = map1.entrySet();
            for (Map.Entry<String, String> sss: entries1) {
                System.out.println(sss.getKey()+"--->"+sss.getValue());
            }
            System.out.println("------------");
            Set<Map.Entry<String, String>> entries = map1.entrySet();
            entries.forEach(System.out::println);   // forEach() 的新写法
        }
    }
    输出:
            false
            true
            false
            true
            19
    //这里解释下为什么会输出第二个张三,这个在存储的过程中,当先存储一个张三的时候就把它的键和值都存入集合中,但是看见第二个张三的时候发现这对值中的key都是张三,就会把value值覆盖到第一个张三的value上,所以就会输出第二个张三的value值啦...
            5{zhaoliu=25, zhangsan=13, liu=20, wangwu=14, zhai=19}
            false
            true
            ------------
            zhaoliu
            zhangsan
            liu
            wangwu
            zhai
            ------------
            25
            13
            20
            14
            19
            ------------
            25
            13
            20
            14
            19
            ------------
            zhaoliu--->25
            zhangsan--->13
            liu--->20
            wangwu--->14
            zhai--->19
            ------------
            zhaoliu=25
            zhangsan=13
            liu=20
            wangwu=14
            zhai=19

[2] Hashtable实现类

它和HashMap最大区别就是:

  • Hashtable:是从 JDK 1.0 开始的,底层的方法都是用了synchronized关键字进行修饰的,线程安全,效率低,其中Hashtable集合中的 key 不能存入 null
  • HashMap:是从 JDK 1.2 开始的,它是线程不安全,效率高,key 可以存入 null 但是只能存入一个key为null因为HashMap中的key是唯一的不可重复的。
    package zhai.map;
    
    import java.util.Hashtable;
    
    public class HashTableDemo {
        public static void main(String[] args) {
            Hashtable<String, Integer> ht = new Hashtable<>();
           // ht.put(null,14);   // 会报错 以为底层线程安全,key 不能存入 null 数据
            ht.put("zhang",12);
            System.out.println(ht.size());
            System.out.println(ht);
        }
    }
    输出:
        1
        {zhang=12}

[3] LinkedHashMap
Map集合中的 key 是无序且唯一的,它的 value 跟着 key 存储,但是 LinkedHashMap 会以我们添加元素的顺序进行输出。

    package zhai.map;
    
    import java.util.LinkedHashMap;
    
    public class LinkedHashMapDemo {
        public static void main(String[] args) {
            LinkedHashMap<String, Integer> lm = new LinkedHashMap<>();
            lm.put("zhang",12);
            lm.put("li",18);
            lm.put("zhao",40);
            lm.put("wang",35);
            lm.put("zhai",19);
            lm.put("zhang",13);
            System.out.println(lm.size());
            System.out.println(lm);
        }
    }
    输出:
        5
        {zhang=13, li=18, zhao=40, wang=35, zhai=19}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值