✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】

【 == 和 equals的对比】
举个栗子
package com.dingjiaxiong.object_;
import com.dingjiaxiong.extend_.improve_.Pupil;
/**
* ClassName: Equals01
* date: 2022/9/3 13:08
*
* @author DingJiaxiong
*/
public class Equals01 {
public static void main(String[] args) {
A a = new A();
A b = a;
A c = b;
System.out.println(a == c); //true
System.out.println(b == c); //true
B oObj = a;
System.out.println(oObj == c); //true
int num1 = 10;
double num2 = 10.0;
System.out.println(num1 == num2); // 基本数据类型,判断值是否相等
}
}
class B{}
class A extends B{
}
运行结果

这是 == 。
查看equals源码
光标放在方法上,Ctrl + b

最原始的equals方法

默认比较是否是同一个对象(地址是否相等)。
【而String或者Integer的equals方法都被重写为判断两个值是否相等】
举个栗子
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);
System.out.println(integer1.equals(integer2));
integer1和integer2都是对象,当使用 == 进行比较时,判断是否是同一个对象,很明显不是
使用equals进行比较时,因为Integer类中重写了equals方法,变为了判断值是否相等
运行结果

String 类同理
判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false
package com.dingjiaxiong.object_;
/**
* ClassName: EqualsExercise01
* date: 2022/9/3 13:42
*
* @author DingJiaxiong
*/
public class EqualsExercise01 {
public static void main(String[] args) {
Person person1 = new Person("jack",10,'男');
Person person2 = new Person("jack",10,'男');
System.out.println(person1.equals(person2));
}
}
class Person{
private String name;
private int age;
private char gender;
//重写
public boolean equals(Object obj){
if (this == obj){
return true;
}
//类型判断
if (obj instanceof Person){ //是Person,才进行比较
Person p = (Person) obj; //向下转型
return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
}
return false;
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
运行结果

其实并不是同一个对象,因为我们重写了equals方法。

韩老师的小结:
举个栗子
package com.dingjiaxiong.object_;
/**
* ClassName: HashCode_
* date: 2022/9/3 13:50
*
* @author DingJiaxiong
*/
public class HashCode_ {
public static void main(String[] args) {
AA aa = new AA();
AA aa2 = new AA();
AA aa3 = aa;
System.out.println("aa.hashCode() = " + aa.hashCode());
System.out.println("aa2.hashCode() = " + aa2.hashCode());
System.out.println("aa3.hashCode() = " + aa3.hashCode());
}
}
class AA{}
运行结果

【基本介绍】

默认返回:全类名+@+哈希值的十六进制
子类往往重写toString方法,用于返回对象的属性信息。
重写toString方法,打印对象或拼接对象时,都会自动调用该对象的toString形式。
当直接输出一个对象时,toString方法会被默认的调用。
举个栗子
package com.dingjiaxiong.object_;
/**
* ClassName: ToString_
* date: 2022/9/3 13:54
*
* @author DingJiaxiong
*/
public class ToString_ {
public static void main(String[] args) {
Monster monster = new Monster("小妖怪","巡山",1000);
System.out.println(monster.toString() + " hashCode = " + monster.hashCode());
System.out.println("==当直接输出一个对象时,toString 方法会被默认的调用==");
System.out.println(monster);
}
}
class Monster{
private String name;
private String job;
private double sal;
public Monster(String name, String job, double sal) {
this.name = name;
this.job = job;
this.sal = sal;
}
@Override
public String toString() {
return "Monster{" +
"name='" + name + '\'' +
", job='" + job + '\'' +
", sal=" + sal +
'}';
}
}
运行结果

举个栗子

但是现在新版JDK中,这个方法已经弃用了,
