集合进阶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中,即可确保不会存在重复的元素。

目录
相关文章
|
6月前
框架集合之Map集合
框架集合之Map集合
56 0
|
17天前
|
存储 Java 索引
集合进阶Collection集合
这篇文档介绍了Java中的Collection集合和其子类List与Set的基本概念和特性。
23 3
|
7月前
|
存储 安全
集合框架系列(三)之 map双列集合
集合框架系列(三)之 map双列集合
|
7月前
|
存储 缓存 安全
【JavaSE专栏51】Java集合类HashSet解析,基于哈希表无序非重元素集合
【JavaSE专栏51】Java集合类HashSet解析,基于哈希表无序非重元素集合
|
7月前
集合架构-Map集合及工具类
集合架构-Map集合及工具类
63 0
|
7月前
|
存储 安全 算法
集合面试题(下)
三、Hashmap HashMap是使用频率最高的用于映射(键值对)处理的数据类型。Java为数据结构中的映射定义了一个java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、 LinkedHashMap和TreeMap,类继承关系如下图所示:
41 0
|
7月前
|
存储 安全 Java
集合面试题(上)
集合和数组的区别 数组是固定长度的;集合可变长度的。数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。数据结构:就是容器中存储数据的方式。
21 0
|
存储 NoSQL Java
Java开发——25.Map双列集合
集合分类两大类:Collection和Map,前者为单列集合,后者为双列集合,注意他们都是接口。
Java开发——25.Map双列集合
|
存储 Java 索引
Java开发——22.Collection单列集合+迭代器+增强for循环
集合,是Java提供的一种容器,可以用来存储多个数据,并且可以存储任意类型
Java开发——22.Collection单列集合+迭代器+增强for循环
|
安全 Java
Java集合超详解一文带你玩转集合(二)
即泛指任意类型,又叫参数化类型(ParameterizedType)对具体类型的使用起到辅助作用,类似于方法的参数。