集合进阶Map集合

简介: 集合进阶Map集合

一、Map集合概述

前面我们学的Collection接口下的集合,元素都是单个存储的,称为单列集合。
现实生活中,很多数据是成对存在的,比如: IP地址与主机名,身份证号与个人,学生与学号等。
这种一一对应的关系,叫做映射。 java中提供了Map集合 ,用于保存具有映射关系的数据,称为双列集合

二、特点

1.双列集合,存取无序、不重复、无索引

2.Map集合是一种键值对集合,每一个元素都有包含一个键对象(key)和一个值对象(vaule)。

3.Map集合中,键是不能重复的,值可以重复

4.键和值是对应的,通过键就可以找到所对应的值


三、常用方法

1.添加数据  put(key , value),输入想要添加的数据键和值

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("景天" , "雪见");
        map.put("郭靖" , "黄蓉");
        System.out.println(map);
    }
}


2.删除数据  remove(key)根据键来删除整个元素

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
        map.remove("韦小宝");
        System.out.println(map);
    }
}


3.获取数据 get(key) 根据键获取数据

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
        String s = map.get("郭靖");
        System.out.println(s);
    }
}


4.判断集合中是否包含指定的键 containsKey(key)

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
        boolean wei = map.containsKey("韦小宝");
        System.out.println(wei);//true
    }
}


5.判断集合中是否包含指定的值containsValue(v)

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
       boolean xiao = map.containsValue("小龙女");
       System.out.println(xiao);//true
    }
}


6.获取集合所有的键 keySet()

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
       Set<String> strings = map.keySet();
        System.out.println(strings);//[杨过, 韦小宝, 郭靖]
    }
}


7.获取所有的值values()


public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
       //获取Map集合全部值
        Collection<String> values = map.values();
        System.out.println(values);//[小龙女, 雪见, 黄蓉]
    }
}


8.判断集合是否为空 isEmpty()

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
      //判断集合是否为空
        boolean empty = map.isEmpty();
        System.out.println(empty);//false
    }
}


9.获取集合大小 size()

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
      //获取集合大小
        int i = map.size();
        System.out.println(i);
    }
}


10.清除集合里面所有的元素 clear()

public class Demo01 {
    public static void main(String[] args) {
        Map<String , String> map = new HashMap<>();
        map.put("杨过" , "小龙女");
        map.put("郭靖", "刘亦菲");
        map.put("韦小宝" , "雪见");
        map.put("郭靖" , "黄蓉");
       map.clear();
       System.out.println(map);
    }
}

四、Map集合的遍历方法

1.第一种方法用keySet() 和 get()方法

1.先用keySet()方法获取所有的键 map.keySet()

2.再用增强for循环遍历集合,在通过get方法()用键获取对应的值

3.再把键和值输出

//1.遍历集合,并将序号与对应人名打印。
        // Set<Integer> se = map.keySet();
        // for (Integer key : se) {
        //     String Value = map.get(key);
        //     System.out.println(key + "----------------" + Value);
        // }


2.第二种方法获取键值对集合 entrySet();

1.通过map.entrySet()方法获取所有的键值对

2.然后遍历集合,再调用getKey()方法和getValue()方法获取所有的键和值

3.把键和值全部输出

//1.遍历集合,并将序号与对应人名打印。
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        for (Map.Entry<Integer, String> entry : entries) {
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "----------" + value);
        }


3.第三种方法使用forEach方法遍历集合

1.集合调用forEach方法,map.forEach 实现BiConsumer接口

//1.遍历集合,并将序号与对应人名打印。
        map.forEach(new BiConsumer<Integer, String>() {
            @Override
            public void accept(Integer key, String value) {
                System.out.println(key + "---------" + value);
            }
        });


五、HashMap

1.特点:

无序,不重复,无索引

2.底层结构

在Jdk1.8之前是数组 + 链表(哈希表)

在Jdk1.8之后是数组 + 链表 + 红黑树(哈希表)

3.保证数据不重复

1.HashMap保证键是唯一不重复是依赖hashCode 和  equals 方法

2.如果是自定义类的话,想要保证键是唯一就必须要在类里面重写hashCode和equals方法

注意:如果存储的数据里面有两个数据的键是相同,值不相同的话,那么键是不会变得,但是值是会覆盖的

例如:现在集合里面添加的数据有两个数据的键是重复的,那么第一个张同学的值会被后面的张同学的值所覆盖掉,而最后输出集合的里面的数据只有两个:

("张同学" , "广东湛江") ,("李同学", "广东云浮")

public class StudentTest {
    public static void main(String[] args) {
        Map<Student ,String> map = new HashMap<>();
        map.put(new Student("张同学"),"广东广州");
        map.put(new Student("李同学"),"广东云浮");
        map.put(new Student("张同学"),"广东湛江");
        map.forEach(new BiConsumer<Student, String>() {
            @Override
            public void accept(Student student, String s) {
                System.out.println(student + "------" + s);
            }
        });
    }


六、LinkHashMap

1.特点

存储有序,不重复,无索引

2.保证数据不重复

1.LinkHashMap保证键是唯一不重复是依赖hashCode 和  equals 方法

2.如果是自定义类的话,想要保证键是唯一就必须要在类里面重写hashCode和equals方法

3.底层结构

在Jdk1.8之前是数组 + 链表 +双链表(哈希表)

在Jdk1.8之后是数组 + 链表 + 红黑树 + 双链表(哈希表)

七、TreeMap

1. 特点

可以排序,不重复,无索引(TreeSet底层就是使用TreeMap实现存储的)

2. TreeMap的排序

1.使用无参构造器创建TreeMap集合,存入集合的键要实现Comparable接口<T>接口

2.使用有参构造器创建TreeMap集合,要实现Comparator<T>接口,并且指定排序规则

3. TreeMap底层结构

TreeMap的底层就是红黑树结构,可以对元素的键进行排序

4. TreeMap去重

在TreeMap中,每个键必须是唯一的,因此如果尝试向TreeMap中添加一个已经存在的键,则新的值会覆盖旧的值。这种特性使得TreeMap可以很方便地用来去重,因为只需将需要去重的元素作为键添加到TreeMap中,即可确保不会存在重复的元素。

目录
相关文章
|
4月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
4月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
5月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
5月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
5月前
|
算法 Java 索引
【Java集合类面试四】、 描述一下Map put的过程
这篇文章详细描述了HashMap中put操作的过程,包括首次扩容、计算索引、插入数据以及链表转红黑树和可能的再次扩容。
【Java集合类面试四】、 描述一下Map put的过程
|
5月前
|
存储
|
5月前
|
安全 Java
【Java集合类面试五】、 如何得到一个线程安全的Map?
如何得到一个线程安全的Map的方法包括:使用Collections工具类将Map包装为线程安全,使用java.util.concurrent包下的ConcurrentHashMap,以及不推荐使用性能较差的Hashtable。
|
5月前
|
安全 Java
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。
|
6月前
|
存储 安全 Java
Java基础之集合Map
【7月更文挑战第8天】Java中的Map集合以键值对方式存储数据,如`Map&lt;&quot;name&quot;, &quot;张三&quot;&gt;`。Map接口定义了存取、判断、移除等操作,包括`put`、`get`、`containsKey`等方法。HashMap是最常用的实现,基于哈希表,允许null键值,但不保证顺序。其他实现包括同步的Hashtable、处理属性文件的Properties、保持插入顺序的LinkedHashMap、基于红黑树的TreeMap、弱引用的WeakHashMap、并发安全的ConcurrentHashMap和针对枚举优化的EnumMap。
50 4
|
6月前
|
存储 Go 索引
GO 集合 map 使用总结
GO 集合 map 使用总结
44 0