一、equals:比较两个实例值是否相等
“==” 与 equals 的区别
== | xxx.equals(xxx) |
---|---|
可以在基本数据类型变量和引用数据类型变量中使用 | 只能在引用型数据类型变量中使用 |
基本数据类型比较数值是否相同 | 在Object类中的equals方法与==相同 |
引用数据类型比较地址值是否相同 |
Object 中定义的equals()
public boolean equals(Object obj){
return(this == obj);
}
不难看出,根父类Object中的equals与的判断相同,所以当我们需要特定功能的比较的equals函数时,我们就应该在自定义类中重写该方法。
且类似于String、Date、File、包装类等都重写了equals方法
Objects中定义的equals
进行了非空判断,更安全
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
String 中重写的equals()
官方在进行字符串比较时,没有对象自己的equals方法,而是选择Objects的equals方法来比较两个对象
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}
Date 中重写的equals()
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
重写的equals()的步骤以String为例
public boolean equals(Object anObject) {
// 1、首先使用==判断,如果可以判断,直接返回true
if (this == anObject) {
return true;
}
//2、第一步无法判断,进一步使用instanceOf判断anObject是否为String的一个实例
if (anObject instanceof String) {
//anObject是String的一个实例 则发生向下转型
String aString = (String)anObject;
//返回各个属性的对比结果
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
//anObject不是String的实例则直接返回false
return false;
}
eclipse中重写的equals()的快捷键 菜单栏Source->Generate hashCode() and equals()
二、toString
当输出一个类对象时,实际上是调用当前对象的toString方法
Object 中定义的equals()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
类似于equals,当我们需要特定功能的比较的toString函数时,我们就应该在自定义类中重写该方法。
且类似于String、Date、File、包装类等都重写了toString方法
String中重写的toString方法
public String toString() {
return this;
}
在自定义类中重写的toString方法
public class Car {
//成员变量
private String carNo;
private String carName;
private String color;
private double price;
//有参构造函数
Car(String carNo,String carName,String color,double price){
this.carNo=carNo;
this.carName=carName;
this.color=color;
this.price=price;
}
//get set方法
public String getCarNo(){
return carNo;
}
public void setCarNo(String carNo){
this.carNo=carNo;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
//重写toString();
public String toString(){
return "这个汽车名叫 "+carName+",型号是 "+carNo+",汽车颜色 "+color+",价格 "+price;
}
public static void main(String[] args){
//创建一个Car的对象
Car myCar=new Car("苏A 4995","长安汽车","灰蓝色",70000.00); //类名开头字母大写
System.out.println(myCar.toString());
}
}
eclipse中重写的toString()的快捷键 菜单栏Source->Generate toString()…
小技巧:要看根父类提供了哪些可以重写的基础函数时可以直接new一个跟父类的实例 ,再调用方法 ctrl+点击对应的方法名。