map接口存储的是键与值之间的映射关系,简单理解就是一存就会存一组(Key与Value两个对象)。比如学号与姓名: Map<0002,张三>
键是具有唯一性的,如果集合中已经存在0002学号,那么再次存入一个0002键,它的值会被存入并且覆盖掉旧值,该集合中的0002键始终只会指向一个值,不会指向多个。不过多个键的值相同是有可能的。
map中的方法相对还是较少的,增删改查等等基本方法。
3.1 增,改: put(K key, V value) (K,V为泛型,任何对象均可添加)
3.2 删: remove(Object key) 根据Key删除一条映射关系,clear( ) 删除所有
3.3 查:containsKey(Object key),containsValue(Object value) 判断集合中是否含有该键或者值,返回为booleanMap接口有两个常用实现类,TreeMap和HashMap,顾名思义,一个为存储方式为二叉树,另一个为哈希表 。
取出map集合中的元素,有两种方法,entrySet( ) 和 keySet( ),用代码解释。enrtySet( )较为复杂点,返回的是一个Map.Entry关系类,它包含了map集合中的映射关系,提供了getKey( )和getValue( )方法,可以很方便的获取到键和值。
import java.util.*;
class HashMapDemo2 {
public static void main(String[] args) {
Map<Student,String> map = new HashMap<Student,String>();
map.put(new Student("zhangsan",18),"Hangzhou");
map.put(new Student("lisi",20),"Wuhan");
map.put(new Student("lisi",22),"Beijing");
map.put(new Student("wangwu",25),"Nanjing");
map.put(new Student("zhaoliu",30),"Shanghai");
map.put(new Student("zhaoliu",30),"Shanghai");
// 1. Map集合的keySet()方法,返回为Set,存储了Map中的所有键,此处为Student
Set<Student> set = map.keySet();
Iterator<Student> i2 = set.iterator();
while (i2.hasNext()) {
Student stu = i2.next();
String addr = map.get(stu);
System.out.println(stu + "..." + addr);
}
// 2. Map集合的entrySet()方法,返回也是Set
// 但是存储的是一个特殊的泛型Map.Entry<K,V>
// 这是Map中的一个内部类,用来描述Map中键,值之间映射关系.
Set<Map.Entry<Student, String>> m = map.entrySet();
Iterator<Map.Entry<Student,String>> i = m.iterator();
while (i.hasNext()) {
Map.Entry<Student, String> me = i.next();
System.out.println(me.getKey().getName() + " " + me.getKey().getAge() + " " + me.getValue());
}
}
}
class Student implements Comparable<Student>{
private String name;
private int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int hashCode() {
return name.hashCode() + age * 19;
}
public boolean equals(Object obj) {
if (!(obj instanceof Student)) {
return false;
} else {
Student s = (Student) obj;
return this.name.equals(s.name) && this.age == s.age;
}
}
public int compareTo (Student s) {
int num = this.age - s.age;
if (num == 0) {
return this.name.compareTo(s.name);
}
return num;
}
public String toString() {
return name + "---" + age;
}
}