概述
Collection中的集合,元素是孤立存在的。向集合中存储元素采用一个个元素的方式存储。
Map中的集合,元素是成对存在的。每个元素由键和值两个部分组成,通过键可以找到对应的值。Map中的集合不能包含重复的键,值可以重复;每个键可以对应一个值。
Map集合中常用的子类
HashMap: 存储结构采用的哈希表结构,元素的存取顺序不能保持一致。由于要保证键的唯一,不重复,需要重写键的hashCode方法和equals方法。
LinkedHashMap: HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构和链表结构。通过链表可以保证元素的存取顺序一致;通过哈希表结构可以保证键的唯一,不重复,需要重写键的hashCode方法和equals方法。
Map集合中常用的方法
public V put(K key,V value):把指定的键和值添加到集合中
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集合)。
Map集合的遍历
package com.review;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("胡歌","霍建华");
map.put("郭德纲","于谦");
map.put("薛之谦","大张伟");
Set<String> keys=map.keySet();
for (String key:keys){
System.out.println("键:"+key+"..."+"值:"+map.get(key));
}
for (Map.Entry<String,String> entry:map.entrySet()){
System.out.println("键:"+entry.getKey()+"..."+"值:"+entry.getValue());
}
}
}
HashMap存储自定义类型键值
如果存储的键相同,后面的会覆盖掉前面的。
package com.review;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class HashMapDemo {
public static void main(String[] args) {
Map<Person,String> map=new HashMap<>();
map.put(new Person("方英杰",25),"南京");
map.put(new Person("张栋",25),"郑州");
map.put(new Person("吴许东",25),"南通");
map.put(new Person("吴许东",25),"如皋");
/*
* Person{name='方英杰', age=25}...南京
Person{name='张栋', age=25}...郑州
Person{name='吴许东', age=25}...如皋
*
* */
for (Map.Entry<Person,String> m:map.entrySet()){
System.out.println(m.getKey().toString()+"..."+m.getValue());
}
}
}
/*
* 存储自定义类型需要重写hashCode方法和equals
* */
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name,age);
}
@Override
public boolean equals(Object obj) {
Person person=(Person)obj;
if (this==obj){
return true;
}
if (obj==null||getClass()!=person.getClass()){
return false;
}
return this.age==person.age&&Objects.equals(this.name,person.name);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
LinkedHashMap
LinkedHashMap是链表和哈希表组合的一个数据存储结构。保证元素的存取有顺序。