一、equals()方法
(1)equals()方法解析
- java.lang.Object类中equals()方法定义:
public boolean equals(Object obj) { return (this == obj);//直接比较两个对象的引用地址是否相等 }
- 像String、Date、File、包装类等重写了Object类中的equals()方法,比较两个对象中的实体内容是否相等。
- 对于自定义的类来说,如果没有重写Object类中的equals()方法,调用的equals()时,仍然是比较两个对象的引用地址是否相同。
- 一般情况下,在开发中一旦调用了自定义类中的equals(),通常是重写之后的equals()方法。而一般重写的equals()方法是判断两个对象的属性是否相等。
例子:
public class CustomerTest {
public static void main(String[] args) {
String str1 = new String("Tom");
String str2 = new String("Tom");
//==是判断两个对象的引用地址是否相等
System.out.println(str1 == str2);//false
//String类中重写了equals()方法,判断两个字符串的值是否相
System.out.println(str1.equals(str2));//true
}
}
public class Customer {
private String name;
private int age;
public Customer(){
}
public Customer(String name,int age){
this.name = name;
this.age = age;
}
//手动从重写equals()方法
@Override
public boolean equals(Object obj) {
if (this == obj)return true;//如果这是一个对象就不用继续判断
if (obj instanceof Customer){
Customer customer = (Customer) obj;
return this.name.equals(customer.name)&& this.age == customer.age;
}
return false;
}
}
(2)面试题:== 和 equals() 区别?
==:
- 使用范围:可以操作基本数据类型 和引用数据类型
- 如操作的是基本数据类型:比较两个基本数据类型的变量对应的值是否相等。
- 如果操作的是引用数据类型,比较两个引用的地址是否相等。
- == 符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错。
例:
public class CustomerTest {
public static void main(String[] args) {
// == 对于基本类型值比较对应的值是否相等。
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2);//true,
//== 两边的数据没有要求一样,只要可以自动提升就可以了
double d1 = 10.0;
System.out.println(num1 == d1);//true
char c2 = 'A';
int num = 65;
System.out.println(c2 == num);//true
}
}
相关知识:基本数据类型的自动转换和提升和字符串缓冲池
equals()方法:
- 使用范围:只适用于引用数据类型。
- 具体的使用:见上面的1-4
小练习:
二、toString()方法
(1)toString()方法解析
- java.lang.Object类中toString()方法定义:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } //返回:全类名+@+引用地址的十六进制字符串:cn.edu.dgut.base.Per@1b6d3586
- 当我们打印一个对象的引用时,会自动调用其toString(),
- 像String、Date、File、包装类等重写了Object类中的toString(),返回其代表的具体内容。
- 在进行String与其它数据类型连接操作时,会自动调用toString()方法
(2)面试题:
1.区分println(char[])和println(object)
答案:
abc
[I@4554617c
[D@4554617c
println方法解析:
- 参数是char[]时调用的时println(char[])遍历字符数组。
- 参数是byte[] 、short[] 、int[] 、float[]、 double[]的对象时调用的是println(Object),而且实际上会自动调用println(Object.toString()),其中toString()方法没有重写。
- 参数是String 、File 、Date时调用的是println(Object),其背后也是调用println(Object.toString()),但这些类中的toString()方法都重写了,输出的是具体内容。
2.String与其他数据类型拼接时会调用toString()方法。
答案:
abc
ch[C@1b6d3586
System.out.println(“ch=”+ch)背后实现原理: