文章目录零、前言今天是学习 JAVA语言 打卡的第31天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。 一、题目描述题目:生命的复杂性,要找到两只一模一样的宠物是不可能的。但在JAVA中,可以通过比较对象的成员变量来判断对象是否相同。本题会创建3只宠物猫,通过比较他们的名字、年龄、重量和颜色属性来看它们是否相同。 二、解题思路写一个类,名为Cat。 在Cat类中定义4个成员变量,分别是名字、年龄、重量和颜色属性 提供构造方法来设置这些属性值 重写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()方法。
一种简单的计算哈希码的方法:
代码详解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从零到壹》第七讲:面向对象高级特性 |
|