Java集合框架 Map接口实现类--HashMap的介绍及使用 & HashMap存储过程

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合框架 Map接口实现类--HashMap的介绍及使用 & HashMap存储过程相关的知识,希望对你有一定的参考价值。

Map接口:

map接口实现类:


1.HashMap的介绍

JDK1.2版本,线程不安全,运行效率快;允许用null作为key或是value。

api文档

构造方法:

api文档方法摘要:


2. HashMap的使用

示例代码:

package map;

import java.util.HashMap;
import java.util.Map;

/**
 * HashMap的使用
 * 存储结构:哈希表(数组+链表+红黑树)
 */
public class Demo2 {
    public static void main(String[] args) {
        HashMap<Student, String> hashMap = new HashMap<Student, String>();
        Student s1 = new Student("小明", 36);
        Student s2 = new Student("小周", 101);
        Student s3 = new Student("小王", 10);
        //1.添加元素
        hashMap.put(s1, "成都");
        hashMap.put(s2, "杭州");
        hashMap.put(s3, "重庆");
        //添加失败,但会更新值(value)
        hashMap.put(s3, "上海");
        System.out.println("hashMap的内容为: " + hashMap.toString() + "\\n");
        //2.删除元素
        hashMap.remove(s3);
        System.out.println("删除了s3后hashMap的内容为: " + hashMap.toString() + "\\n");
        //3.遍历
        //3.1 使用keySet()遍历
        System.out.println("---------------------使用keySet()遍历---------------------");
        for (Student key : hashMap.keySet()) {
            System.out.print("{" + key + " , " + hashMap.get(key) + "}\\n");
        }
        System.out.println();
        //3.2 使用entrySet()遍历
        System.out.println("---------------------使用entrySet()遍历---------------------");
        for (Map.Entry<Student, String> entry : hashMap.entrySet()) {
            System.out.print("{" + entry.getKey() + " , " + entry.getValue() + "}\\n");
        }
        System.out.println();
        //4.判断
        System.out.println("haspMap的key是否包含了s1: " + hashMap.containsKey(s1));
        System.out.println("haspMap的value是否包含了成都: " + hashMap.containsValue("成都"));
    }
}


/**
 * 学生类
 */
class Student {
    private String name;
    private int stuId;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + stuId + "]";
    }
}

运行结果:


3. 思考

观察下面的代码:

    public static void main(String[] args) {
        HashMap<Student, String> hashMap = new HashMap<Student, String>();
        Student s1 = new Student("小明", 36);
        Student s2 = new Student("小周", 101);
        Student s3 = new Student("小王", 10);
        //1.添加元素
        hashMap.put(s1, "成都");
        hashMap.put(s2, "杭州");
        hashMap.put(s3, "重庆");
        //假如相同属性便认为是同一个对象,怎么修改?
        hashMap.put(new Student("小周", 101), "云阳");
        System.out.println("hashMap的内容为: \\n" + hashMap.toString() + "\\n");
        //2.删除元素
        hashMap.remove(new Student("小王", 10));
        System.out.println("删除了s3后hashMap的内容为: \\n" + hashMap.toString() + "\\n");
    }

运行结果:

问题发现:

map是不允许存放相同的key,但是我们new一个匿名的对象,他的属性值与s3相同,这时仍然可以加入到map中。还有我们在删除小王的时候,发现使用匿名对象也无法删除,这是为什么呢?

HashMap存储过程:

  1. 根据hashCode计算保存的位置,如果位置为空,则直接保存,否则执行第二步。
  2. 执行equals方法,如果方法返回true,则认为是重复,拒绝存储,否则形成链表。

如何解决问题?

  • 我们要想使用匿名的对象操作map。HashMap的重复依据是hashCode和equals方法,重写这2个方法即可

现在的学生类:

/**
 * 学生类
 */
class Student {
    private String name;
    private int stuId;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + stuId + "]";
    }

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

    @Override
    public int hashCode() {
        return Objects.hash(name, stuId);
    }
}

如果对为什么重写这2个方法比较懵的话, 可以参考:
Java集合框架 Set接口实现类–HashSet存储结构 & HashSet拓展

运行刚刚的测试代码:



以上是关于Java集合框架 Map接口实现类--HashMap的介绍及使用 & HashMap存储过程的主要内容,如果未能解决你的问题,请参考以下文章

java的集合类(MapList与Set比较)

Map接口框架图

java集合框架综述

Java集合框架详解

Java知识33 集合框架 List接口 Map 和set多测师

简单比较HashMap和TreeMap