常见子类:
1.Hashtable: 数据结构:哈希表。 同步的。不允许null 作键或值(现在基本被HashMap 替代)
优秀子类:Properties 键和值都是字符串,而且可以结合流进行键和值的操作
2.HashMap:数据结构:哈希表。是同步的,允null
LinkedHashMap: 基于李安表+哈希表,可以保证Map 有序(存入和取出有序)
3.TreeMap:数据结构:二叉树 。可以对Map 中的数据进行排序,自然排序或者比较器排序
HashMap: 哈希表,同步
需求:学生(姓名 年龄)与地区相对应
package Collection;
import java.util.*;
//演示Map 的常用子类
//HashMap LinkedHashMap TreeMap
//存入学生和地区的对应关系
public class HashMapDemo_Map {
public static void main(String[] args){
//创建集合
Map<Student,String> map = new HashMap<Student,String>();//无序
// Map<Student,String> map = new LinkedHashMap<Student,String>();//有序
//添加元素
map.put(new Student("Lisi",25),"上海");
map.put(new Student("Wangwu",18),"广州");
map.put(new Student("Zaholiu",20),"苏州");
map.put(new Student("Zhangsan",19),"南京");
//map.put(new Student("Zhangsan",19),"北京");
//获取键和值 getSet()
Set<Student> set = map.keySet();
for(Student st :set){
System.out.println(st+" "+map.get(st));
}
}
}
注意:
1.在这段代码中,Map 集合要保证键的惟一性,根据的是 hashCode 和 equals
map.put(new Student("Zhangsan",19),"南京");
map.put(new Student("Zhangsan",19),"北京");
这两行代码运行时,结果为:Zhangsan 19 北京
因为在Student 这个类中重写了 hashCode 和equals 这两个方法,建立的判断依据是:同名同姓为同一个人
2.在之前讲集合HashSet 判断元素是否相同,也是根据的 hashCode 和equals 这其实是因为,HashSet 的底层为HashMap 在存键的那一列,存入一个常量对象,就是单列的了
需求二:按照年龄从大到小排序 //要排序就要使用 TreeMap
1.自然排序:必须实现Comparable 接口 重写 compareTo 方法
public int compareTo(Student o) {
//实现Comparable 接口 重写 compareTo 方法
//按照年龄排序的自然排序
int temp = this.age-o.age;
return temp==0?this.name.compareTo(o.name):temp;
}
Map<Student,String> map2 = new TreeMap<Student,String>();
map2.put(new Student("Lisi",25),"上海");
map2.put(new Student("Wangwu",18),"广州");
map2.put(new Student("Zaholiu",20),"苏州");
map2.put(new Student("Zhangsan",19),"南京");
//获取元素 entrySet
for(Iterator<Map.Entry<Student,String>> it = map2.entrySet().iterator();it.hasNext();){
Map.Entry<Student,String> entry = it.next();
Student stu =entry.getKey();
String s=entry.getValue();
System.out.println(stu+" "+s);
}
2.使用构造器:按照名字比较排序
package Collection;
import java.util.Comparator;
//TreeMap 的按照名字比较排序的构造器
public class StudentByName_TreeMap implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
int temp = o1.getName().compareTo(o2.getName());
return temp==0?o1.getAge()-o2.getAge():temp;
}
}
Map<Student,String> map2 = new TreeMap<Student,String>(new StudentByName_TreeMap());
运行结果:
Lisi 25 上海
Wangwu 18 广州
Zaholiu 20 苏州
Zhangsan 19 南京