Java高级重点知识点-16-Map、JDK9新特性

文章目录

Map(java.util)

  1. Collection集合与Map集合的区别
  • Collection 中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储。 Map 中的集合,元素是成对存在的。
  • Collection 中的集合称为单列集合, Map 中的集合称为双列集合。
  1. Map接口中的常用方法
    public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
    public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的
    值。
    public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
    public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
    public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。

代码示例:

java 复制代码
public class MapDemo {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("xiaohu",18);
        map.put("xiaoming",19);
        map.put("xiaofang",21);
        map.put("xiaohua",45);
        System.out.println(map.get("xiaohu"));
        Set<String> set = map.keySet();
        for (String key : set) {
            System.out.println(key + ":" + map.get(key));
        }
        System.out.println("-------------------------------------");
        map.remove("xiaohua");

        Set<Map.Entry<String, Integer>> set1 = map.entrySet();
        for (Map.Entry<String, Integer> entry : set1) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }
}

这里我们通过 **put(K key, V value)**方法存入了四个数值(HashMap),通过 **map.get("xiaohu")**来获取到键为"xiaohu"的值(18),通过 Set keySet() 来获取到所有的键的Set集合。通过增强for循环进行循环遍历, 这里我们发现遍历的结果和我们存储元素的顺序并不一致(可以通过LinkedHashMap来保证存取顺序一致) ,然后我们使用了 remove(Object key) 删除了一个键为"xiaohua"的值。最后我们通过 entrySet() 来获取一个Set集合,最后通过该集合进行遍历,通过 getKey()方法来获取键,通过 entry.getValue()方法来获取值。

注意:
当我们存储自定义类型键值时,我们必须要注意的一个点就是我们自定义类型必须要重写equals()方法以及hashCode()方法

  • 当没有重写这俩个方法时:
java 复制代码
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public static void main(String[] args) {
        Map<Student, String> map = new HashMap<>();
        map.put(new Student("xiaohu",18),"001");
        map.put(new Student("xiaoming",19),"002");
        map.put(new Student("xiaofang",20),"003");
        map.put(new Student("xiaohua",21) ,"004");
        map.put(new Student("xiaohua",21) ,"005");
        Set<Student> set = map.keySet();
        for (Student key : set) {
            System.out.println(key + ":" + map.get(key));
        }
    }
}

这里我们存入了俩个姓名为xiaohua,年龄为21的学生数据。

  • 当我们重写了这俩个方法时:
java 复制代码
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public static void main(String[] args) {
        Map<Student, String> map = new HashMap<>();
        map.put(new Student("xiaohu",18),"001");
        map.put(new Student("xiaoming",19),"002");
        map.put(new Student("xiaofang",20),"003");
        map.put(new Student("xiaohua",21) ,"004");
        map.put(new Student("xiaohua",21) ,"005");
        Set<Student> set = map.keySet();
        for (Student key : set) {
            System.out.println(key + ":" + map.get(key));
        }
    }
}

此时我们的map集合中不存在相同的学生数据了。

使用LinkedHashMap集合来存储这些数据,保证我们存和取的顺序是一致的。

java 复制代码
import java.util.*;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public static void main(String[] args) {
        Map<Student, String> map = new LinkedHashMap<>();
        map.put(new Student("xiaohu",18),"001");
        map.put(new Student("xiaoming",19),"002");
        map.put(new Student("xiaofang",20),"003");
        map.put(new Student("xiaohua",21) ,"004");
        map.put(new Student("xiaohua",21) ,"005");
        Set<Student> set = map.keySet();
        for (Student key : set) {
            System.out.println(key + ":" + map.get(key));
        }
    }
}

JDK9优化集合

新的List、Set、Map的静态工厂方法可以更方便地创建集合的 不可变实例

java 复制代码
public class HelloJDK9 {
	public static void main(String[] args) {
		Set<String> str1=Set.of("a","b","c");
		//str1.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合
		System.out.println(str1);
		Map<String,Integer> str2=Map.of("a",1,"b",2);
		System.out.println(str2);
		List<String> str3=List.of("a","b");
		System.out.println(str3);
	}
}
  • of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如
    HashSet,ArrayList等;
  • 返回的集合是不可变的;

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

相关推荐
Kisorge15 分钟前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
路在脚下@1 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
森屿Serien1 小时前
Spring Boot常用注解
java·spring boot·后端
轻口味1 小时前
命名空间与模块化概述
开发语言·前端·javascript
苹果醋32 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
晓纪同学2 小时前
QT-简单视觉框架代码
开发语言·qt
威桑2 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
Hello.Reader2 小时前
深入解析 Apache APISIX
java·apache
飞飞-躺着更舒服2 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb