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存储过程:
- 根据hashCode计算保存的位置,如果位置为空,则直接保存,否则执行第二步。
- 执行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存储过程的主要内容,如果未能解决你的问题,请参考以下文章