文章目录
零、前言
今天是学习 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;
}
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));// 比较猫咪的属性
}
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;
}
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));// 比较猫咪的属性
}
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));// 比较是否相同
}
}
五、示例源码下载
关注下面的公众号,回复筑基+题目号
筑基31