现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
HashMap 是无序的,即不会记录插入的顺序。
HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
创建HashMap对象
// 泛型约束HashMap的键值的数据类型
Map<String,String> hashMap = new HashMap<>();
添加元素
public V put(K key, V value)
添加指定键值到HashMap中
hashMap.put("张三","20011024");
hashMap.put("李四","20011096");
hashMap.put("王五","20011164");
hashMap.put("赵六","20011096");
获取元素
public V get(Object key)
根据指定的key去HashMap中获取值。
hashMap.get("张三");
删除元素
public V remove(Object key)
根据指定的key去HashMap删除对应的键值default boolean remove(Object key, Object value)
根据k,v去HashMap中删除符合的键值
hashMap.remove("李四");
hashMap.remove("赵六","20011096");
替换元素
default V replace(K key, V value)
根据指定的key去HashMap中替换对应的值default boolean replace(K key, V oldValue, V newValue)
根据指定的key,value去替换符合的键值的value
hashMap.replace("张三","10011024");
hashMap.replace("张三","10011024","10012048");
获取Map中的所有key的集合
public Set<K> keySet()
获取当前HashMap的所有的值为一个Set集合
Set<String> keySet = hashMap.keySet();
for (String keyItem :keySet) {
System.out.println(keyItem);
}
获取Map中的所有的kv对象的集合
public Set<Map.Entry<K,V>> entrySet()
获取HashMap中所有的键值对对象的集合
Set<Map.Entry<String, String>> entries = hashMap.entrySet();
System.out.println(entries);
HashMap的遍历
以下是三种方式的遍历:
- forEach()lambda表达式遍历
- keySet()利用Map集合的特性,k->v一一映射,根据对应的key去获取value进行遍历
- entrySet()
- Map中的k->v键值对对象,也称为一个Entry项。
- Entry将键值对的对应关系封装成了对象,并且提供了获取对应键和对应值的方法。
- public K getKey():获取Entry对象中的键
- public V getValue():获取Entry对象中的值。
// hashMap 使用lambda表达式遍历简直了哈哈哈
hashMap.forEach((k,v)->{
System.out.println(k + "=>" + v);
});
// foreach 利用keySet() 来遍历,k->v 一一映射
for (String mapKey : hashMap.keySet()){
System.out.println(mapKey + "=>" + hashMap.get(mapKey));
}
// 利用entrySet来遍历
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey()+"=>"+entry.getValue());
}
tips:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。
HashMap存储自定义类型的键值
每个人都有自己基本信息和住址信息,将人和住址信息作为kv存入到HashMap中。
People类
package com.robin._collections.my;
import java.util.Objects;
public class People {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public People() {
}
public People(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
People people = (People) o;
return age == people.age && Objects.equals(name, people.name) && Objects.equals(sex, people.sex);
}
@Override
public int hashCode() {
return Objects.hash(name, sex, age);
}
}
测试方法:
HashMap<People,String> peopleStringHashMap = new HashMap<>();
People p1 = new People("知更鸟","男",23);
People p2 = new People("日落西山","男",71);
People p3 = new People("一叶知秋","男",21);
peopleStringHashMap.put(p1,"呼和浩特");
peopleStringHashMap.put(p2,"北京");
peopleStringHashMap.put(p3,"西安");
peopleStringHashMap.forEach((people, s) -> {
System.out.println(people + "=====address" + s);
});