1、Object类的 equals方法
equals方法源码
public boolean equals(Object obj){
return (this == obj)
}
参数:obj 可以是任意对象, == 比较运算符。返回true false, 默认比较的是地址值
this 是谁?this 是哪个对象调用的方法,方法红的this就是哪个对象。p1.equals(p2), p1调用的方法,this 就是p1
2、重写object类的equals方法
package equalsDemo;
import java.util.Objects;
/**
* created by apple on 2020/6/7
* Object 类的equals方法,默认比较的是对象的地址值,没有意义,重写,比较对象的属性(name ,age)
* 问题: 多态
* 多态的弊端:无法使用子类特有的内容:属性和方法
* Object obj = p2 = new Person("t",19);
* 解决弊端:可以使用向下转型,强转 ,把Object类型, instanceof Person转化为person
*/
public class Person {
String name;
int age;
//这个重写可以直接由快捷键生成,右键 equals生成
@Override
public boolean equals(Object o) {
if (this == o) return true;
//getClass() != o.getClass() 反射的方法,判断o是否是Person类型,等效于obj instanceof Person
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
/* @Override
public boolean equals(Object obj) {
//增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序效率
if (obj == this){
return true;
}
//增加一个判断,如果传递的参数是obj是null,直接返回false,提高程序的效率
if (obj == null){
return false;
}
//增加一个判断 防止类型转换异常 clascastException
if (obj instanceof Person){
//使用向下转型 把Obj 转换为person类型
Person p = (Person) obj;
//比较两个对象的属性 一个是this(p1),一个是p(p2)
boolean b = this.name.equals(p.name)&&this.age==p.age;
return b;
}
//不是person类型,直接返回false
return false;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
*/
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 Person(String name, int age) {
this.name = name;
this.age = age;
}
}
package equalsDemo;
import java.util.ArrayList;
/**
* created by apple on 2020/6/7
*/
public class DemoPerson {
public static void main(String[] args) {
Person p1 = new Person("s",19);
Person p2 = new Person("s",19);
Person p3 = new Person("t",19);
System.out.println(p1);
System.out.println(p2);
ArrayList<String> list = new ArrayList<>();
boolean b = p1.equals(list); //list是obj .所以能比较
boolean c = p1.equals(p1);
System.out.println(b);
System.out.println(c);
System.out.println(p1.equals(p2));
}
}
结果:
equalsDemo.Person@11c1
equalsDemo.Person@11c1
false
true
true
3、Objects 类的equals 方法可以防止空指针
image.pngObjects 类的equals 源码
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
package equalsDemo;
import java.util.Objects;
/**
* created by apple on 2020/6/7
*/
public class ObjectsDemo {
public static void main(String[] args) {
String s1 = null;
String s2 = "s";
String s3 = "s";
// boolean b = s1.equals(s2); //会报空指针异常, null是不能调用方法的,就会抛出空指针异常
// Objects类的equals方法, 对两个对象进行比较, 防止空指针异常
boolean b2 = Objects.equals(s1, s2);
boolean b3 = Objects.equals(s2, s3);
// System.out.println("b:" + b);
System.out.println("b2:" + b2);
System.out.println("b3:" + b3);
}
}
输出:
b2:false
b3:true
4、为什么重写toString()方法
不得不说,有很多java初学者写java实体类的时候,并没有真正理解重写toString() 方法,可能是口头知道也可能是跟风随带添加toString() 方法,并没有真正理解其意义,如果真要被问起来未必有十足把握回答上 中枪了咩,这篇文章旨在帮助初学者正确解读实体类重写toString() 方法。
解读一:java默认的toString方法来自Object 类
在Java中每个类都直接或者间接继承Object 类,toString() 方法同样来自于Object 类。
其实这不难理解,在没有重写tostring的前提下,每次执行System.out.println() 这个方法默认就会调用一个继承自Object 类型对象的toString 方法,这点是非常重要的基础前提!
解读二:重写toString()方法的意义所在
简单一句话就是重写toString() 可以理解为是对对象在打印输出时候的一种格式化。这样做符合业务逻辑,显示结果人性化。
object类里的toString只是把字符串的直接打印,数字的要转化成字符再打印,而对象,则直接打印该对象的hash码(类似@15db9742 这样的东东),它的值大概就是等于getClass().getName()+’@’+Integer.toHexString(hashCode())
上代码
a——编写一个叫Person的实体类以及测试类
package it.xinyecom.enhance.domain;
/**
* @author 杜艳艳
* @version 1.0
* @date 2020/12/30 20:25
*/
public class Person {
private String name;
private int age;
public String a;
protected String b;
String c;
private String d;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(){
}
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;
}
/* @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}*/
public static void main(String[] args) {
Person person = new Person();
person.setAge(12);
person.setName("语音");
System.out.println(person);
}
}
如上,注释了toString()方法的测试效果:
it.xinyecom.enhance.domain.Person@677327b6
Process finished with exit code 0
重写toString()方法的测试效果:
Person{name='语音', age=12}
Process finished with exit code 0
总结
1、没有重写tostring ,每执行System.out.println() 会默认调用Object 的toString 方法,情况如下:
2、重写tostring,每执行System.out.println() 会调用重写的toString 方法,情况则会根据重写的方法打印输出成自己想得到的格式。
3、为了养成良好习惯,建议每次编写实现类都重写一下tostring() 方法!!
网友评论