Java进阶之旅第二天

Java进阶之旅第二天

HashMap

特点

  • 1.HashMap是Map的一个实现类
  • 2.直接使用Map里面的方法即可
  • 3.特点都是由键决定的: 无序,不重复,无索引
  • 4.底层和HashSet一样都是哈希表结构
  • 5.核心点
    • HashMap的键位置如果存储的是自定义对象,需要重写hashCode和equals方法
    • 目的: 自定义对象就像自己定义的某个类,由于类中有许多的属性.再加之hashMap的底层是哈希表结构,所以需要重写equals和hashCode方法实现集合中键唯一性

案例:

  • 创建一个HaspMap集合,键是学生对象(Student),值是籍贯
  • 要求: 存储三个键值对元素,并遍历
  • 要求: 同姓名,同年龄认为是一个学生(需要重写函数)
  • 代码
        HashMap<Student, String> map = new HashMap<>();
        Student s1 = new Student("小明", 17);
        map.put(s1,"广东");
        Student s2 = new Student("小成", 20);
        map.put(s2,"广东");
        Student s3 = new Student("小下", 17);
        map.put(s3,"广东");
        Student s4 = new Student("小下", 17);
        map.put(s4,"北京");
        //遍历
        Set<Map.Entry<Student, String>> entries = map.entrySet();
        for (Map.Entry<Student, String> entry : entries) {
            System.out.println(entry.getKey()+" = "+entry.getValue());
        }
        
        //在类中重写的函数
//重写equal和hashCode(快捷键Alt+insert
@Override
public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
        }

@Override
public int hashCode() {
        return Objects.hash(name, age);
        }
  • 结果
Student{name = 小成, age = 20} = 广东
Student{name = 小下, age = 17} = 北京
Student{name = 小明, age = 17} = 广东
  • 分析: 可以看出s3对象被s4对象覆盖了,原因是s3和s4的键值对元素是一致的
  • 不重写函数的结果
Student{name = 小成, age = 20} = 广东
Student{name = 小下, age = 17} = 北京
Student{name = 小明, age = 17} = 广东
Student{name = 小下, age = 17} = 广东
  • 分析: 没有实现题目要求

LinkedHashMap

特点

  • 1.由键决定: 有序,不重复,无索引
  • 2.这里有序的是保证存储和取出的元素顺序是一致的
  • 3.原理: 底层数据结构式哈希表,在基础上添加一个双向链表记录存储的顺序
  • 4.直接使用Map里面的方法即可

代码:

        LinkedHashMap<Integer, Integer> lmap = new LinkedHashMap<>();
        lmap.put(1,1);
        lmap.put(1,9);
        lmap.put(2,1);
        lmap.put(3,1);
        lmap.put(4,1);
        System.out.println(lmap);
  • 结果
{1=9, 2=1, 3=1, 4=1}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不吃牛肉!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值