分享

【第31题】创造两只完全相同的宠物

 小虚竹 2022-04-21

文章目录

零、前言

今天是学习 JAVA语言 打卡的第31天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述

题目:生命的复杂性,要找到两只一模一样的宠物是不可能的。但在JAVA中,可以通过比较对象的成员变量来判断对象是否相同。本题会创建3只宠物猫,通过比较他们的名字、年龄、重量和颜色属性来看它们是否相同。

二、解题思路

写一个类,名为Cat。

在Cat类中定义4个成员变量,分别是名字、年龄、重量和颜色属性

提供构造方法来设置这些属性值

重写equals()方法和toString()方法。

  • 重写equals方法是为了可以比较两个对象是否相同

  • 重写toString 方法是可以直接 输出对象

Java的类都是Object类的直接或间接子类。Object类中定义了equals方法,用于比较两个对象是否相同。这个方法的默认实现是比较两个对象是否是同一个对象而已。

所以我们在定义类时,建议要重写这个equals方法。

三、代码详解

public class Cat {
    private String name; // 表示猫咪的名字
    private int age; // 表示猫咪的年龄
    private double weight; // 表示猫咪的重量
    private Color color; // 表示猫咪的颜色

    public Cat(String name, int age, double weight, Color color) {// 初始化猫咪的属性
        this.name = name;
        this.age = age;
        this.weight = weight;
        this.color = color;
    }

    @Override
    public boolean equals(Object obj) {// 利用属性来判断猫咪是否相同
        if (this == obj) {// 如果两个猫咪是同一个对象则相同
            return true;
        }
        if (obj == null) {// 如果两个猫咪有一个为null则不同
            return false;
        }
        if (getClass() != obj.getClass()) {// 如果两个猫咪的类型不同则不同
            return false;
        }
        Cat cat = (Cat) obj;
        return name.equals(cat.name) && (age == cat.age)
                && (weight == cat.weight) && (color.equals(cat.color));// 比较猫咪的属性
    }

    @Override
    public String toString() {// 重写toString()方法
        StringBuilder sb = new StringBuilder();
        sb.append("名字:" + name + "\n");
        sb.append("年龄:" + age + "\n");
        sb.append("重量:" + weight + "\n");
        sb.append("颜色:" + color + "\n");
        return sb.toString();
    }}

测试类

public class Test {
    public static void main(String[] args) {
        Cat cat1 = new Cat("Java", 12, 21, Color.BLACK);// 创建猫咪1号
        Cat cat2 = new Cat("C++", 12, 21, Color.WHITE); // 创建猫咪2号
        Cat cat3 = new Cat("Java", 12, 21, Color.BLACK);// 创建猫咪3号
        System.out.println("猫咪1号:" + cat1);// 输出猫咪1号
        System.out.println("猫咪2号:" + cat2);// 输出猫咪2号
        System.out.println("猫咪3号:" + cat3);// 输出猫咪3号
        System.out.println("猫咪1号是否与猫咪2号相同:" + cat1.equals(cat2));// 比较是否相同
        System.out.println("猫咪1号是否与猫咪3号相同:" + cat1.equals(cat3));// 比较是否相同
    }}

如图

解法2: 重写hashCode()方法

解题思路

Java创建的对象是保存在堆中,为了提高查找的速度,使用了散列查找。就是定义一个键来映射对象所在的内存地址。当需要找这个对象时,直接找键。不用遍历堆来找这个对象了。

写一个类,名为Cat2。

在Cat2类中定义4个成员变量,分别是名字、年龄、重量和颜色属性

提供构造方法来设置这些属性值

重写equals()方法和hashCode()方法。

  • 重写equals方法是为了可以比较两个对象是否相同

  • 重写hashCode方法是可以让相同的对象保存在相同的位置。

一种简单的计算哈希码的方法:

  • 重写equals方法时用到的成员变量

  • 把这些成员变量乘以不同的质数然后求和

  • 这样可作为新的哈希码。

代码详解

public class Cat2 {
    private String name; // 表示猫咪的名字
    private int age; // 表示猫咪的年龄
    private double weight; // 表示猫咪的重量
    private Color color; // 表示猫咪的颜色

    public Cat2(String name, int age, double weight, Color color) {// 初始化猫咪的属性
        this.name = name;
        this.age = age;
        this.weight = weight;
        this.color = color;
    }

    @Override
    public boolean equals(Object obj) {// 利用属性来判断猫咪是否相同
        if (this == obj) {// 如果两个猫咪是同一个对象则相同
            return true;
        }
        if (obj == null) {// 如果两个猫咪有一个为null则不同
            return false;
        }
        if (getClass() != obj.getClass()) {// 如果两个猫咪的类型不同则不同
            return false;
        }
        Cat2 cat = (Cat2) obj;
        return name.equals(cat.name) && (age == cat.age)
                && (weight == cat.weight) && (color.equals(cat.color));// 比较猫咪的属性
    }

    @Override
    public int hashCode() {// 重写hashCode()方法
        return 7 * name.hashCode() + 11 * new Integer(age).hashCode() + 13
                * new Double(weight).hashCode() + 17 * color.hashCode();
    }}

测试类:

public class Test2 {
        public static void main(String[] args) {
            Cat2 cat1 = new Cat2("Java", 12, 21, Color.BLACK); // 创建猫咪1号
            Cat2 cat2 = new Cat2("C++", 12, 21, Color.WHITE); // 创建猫咪2号
            Cat2 cat3 = new Cat2("Java", 12, 21, Color.BLACK); // 创建猫咪3号
            System.out.println("猫咪1号的哈希码:" + cat1.hashCode());// 输出猫咪1号的哈希码
            System.out.println("猫咪2号的哈希码:" + cat2.hashCode());// 输出猫咪2号的哈希码
            System.out.println("猫咪3号的哈希码:" + cat3.hashCode());// 输出猫咪3号的哈希码
            System.out.println("猫咪1号是否与猫咪2号相同:" + cat1.equals(cat2));// 比较是否相同
            System.out.println("猫咪1号是否与猫咪3号相同:" + cat1.equals(cat3));// 比较是否相同
        }}

如图

四、推荐专栏

《JAVA从零到壹》

《JAVA从零到壹》第四讲:类与对象基础

《JAVA从零到壹》第七讲:面向对象高级特性

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多