Java 集合21 Map 的常见子类(存储自定义类)

常见子类:
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 南京

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值