Map接口之HashMap
*Map集合的使用*
这是Map接口的体系结构
特点:存储一对数据(key-value),无序、无下标,键不可以重复,值可以重复。
常用方法:
put(K key, V value)
将指定的值与该映射中的指定键相关联(可选操作)。
get(Object key)
返回到指定键所映射的值,或 null如果此映射包含该键的映射。
keySet()
返回此集合中包含的键的集合。
values()
返回此集合中包含的值的Collection全集。
entrySet()
返回此集合包含的匹配的Set集合。
*HashMap*
小案例
package com.genericlist;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Map接口的使用
* 特点:1.存储键值对 2.键不能重复,值可以重复 3.当键重复的时候能够,值会被替换掉 4.无序
*/
public class MapDemo01 {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<String, String>();
//1.添加元素
hashMap.put("cn","中国");
hashMap.put("uk","英国");
hashMap.put("us","美国");
hashMap.put("Germany","德国");
hashMap.put("cn","china");
System.out.println("元素的个数:"+hashMap.size());
System.out.println(hashMap);
//2.删除
hashMap.remove("Germany");
System.out.println("删除之后元素的个数:"+hashMap.size());
//3.遍历
//3.1使用keyset方法进行遍历
System.out.println("----------使用keyset方法进行遍历----------");
Set<String> keySet = hashMap.keySet();
for (String s : keySet) {
System.out.println(s+"----------"+hashMap.get(s));
}
//3.2使用entryset方法进行遍历 一个entry包含一个键和一个值
System.out.println("----------使用entryset方法进行遍历----------");
Set<Map.Entry<String, String>> entries = hashMap.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+"-------"+entry.getValue());
}
//总结:在实际项目遍历的时候,entrySet的效率要高于keySet,因为keySet先取键再取值,相当于遍历了两次。
//4.判断
System.out.println(hashMap.containsKey("uk"));
System.out.println(hashMap.containsValue("英国"));
}
}
运行结果:
运行结果:
元素的个数:4
{uk=英国, cn=china, us=美国, Germany=德国}
删除之后元素的个数:3
----------使用keyset方法进行遍历----------
uk----------英国
cn----------china
us----------美国
----------使用entryset方法进行遍历----------
uk-------英国
cn-------china
us-------美国
true
true、
*使用实体类作为键*
package com.mappractise;
import java.util.Objects;
/**
* 学生实体类
*/
public class Student {
private String name;
private int stuNo;
public Student() {
}
public Student(String name, int stuNo) {
this.name = name;
this.stuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
//去除重复 重写hashcode方法和equals方法
//重写hashcode方法进行内存地址的判断
@Override
public int hashCode() {
int n1 = this.name.hashCode();
int n2 = this.stuNo;
return n1 + n2;
}
//必须重写equals方法才能判断添加的对象是否重复
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (obj instanceof Student) {
Student person = (Student) obj;
if (this.name.equals(person.getName()) && this.stuNo == person.getStuNo()) {
return true;
}
}
return false;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", stuNo=" + stuNo +
'}';
}
}
package com.mappractise;
import java.util.HashMap;
import java.util.Map;
/**
* HashMap集合的使用
* 存储结构:哈希表(数组+链表+红黑树)
* 怎样去重复:使用key的hashcode和equals方法作为判断重复的依据的
*/
public class HashMapDemo01 {
public static void main(String[] args) {
//创建集合
HashMap<Student, String> hashMap = new HashMap<Student, String>();
//刚创建hashmap的时候table=null size=0
Student stu1 = new Student("孙悟空", 100);
Student stu2 = new Student("猪八戒", 101);
Student stu3 = new Student("沙和尚", 102);
hashMap.put(stu1,"金箍棒");
hashMap.put(stu2,"菜耙子");
hashMap.put(stu3,"降魔杖");
// hashMap.put(stu3,"降魔杖");//不能添加重复的元素
// hashMap.put(stu3,"yyy");//会进行值的替换
//hashMap.put(new Student("孙悟空", 100),"降魔杖");//重写了hashcode方法和equals方法之后就不会重复添加姓名和学号相同的对象了
System.out.println("元素的个数:"+hashMap.size());
System.out.println("集合内容:"+hashMap);
//2.删除
// hashMap.remove(stu1);
// System.out.println("删除之后元素的个数:"+hashMap.size());
// System.out.println("删除之后集合内容:"+hashMap);
//3.集合的遍历
System.out.println("==========keySet==========");
for (Student key : hashMap.keySet()) {
System.out.println(key+"--"+hashMap.get(key));
}
System.out.println("==========entrySet==========");
for (Map.Entry<Student, String> stringEntry : hashMap.entrySet()) {
System.out.println(stringEntry.getKey()+"--"+stringEntry.getValue());
}
//4.判断
System.out.println(hashMap.containsKey(stu1));
System.out.println(hashMap.containsValue("金箍棒"));
}
}
运行结果:
运行结果:
元素的个数:3
集合内容:{Student{name='孙悟空', stuNo=100}=金箍棒, Student{name='猪八戒', stuNo=101}=菜耙子, Student{name='沙和尚', stuNo=102}=降魔杖}
==========keySet==========
Student{name='孙悟空', stuNo=100}--金箍棒
Student{name='猪八戒', stuNo=101}--菜耙子
Student{name='沙和尚', stuNo=102}--降魔杖
==========entrySet==========
Student{name='孙悟空', stuNo=100}--金箍棒
Student{name='猪八戒', stuNo=101}--菜耙子
Student{name='沙和尚', stuNo=102}--降魔杖
true
True