1、equals方法
★★★==(比较运算符)和equals的对比(面试题)
(1)==:
1)既可以判断基本类型,又可以判断引用类型
2)如果判断基本类型,判断的是值是否相等。如果 int i=10;double d=10.0;
3)如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
(2)equals方法
1)equals是Object类中的方法,只能判断引用类型
2)默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。
2、查看equals方法的源码
(1)Object中的equals方法
Object的equals方法默认就是比较对象地址是否相同,也就是判断两个对象是不是同一个对象
//Object类的equals方法源码
public boolean equals(Object anObject){
if(this==anObject){
return true;
}
if(anObject instanceof String){//判断类型
String anotherString=(String)anObject;//向下转型
int n=value.length;
if(n==anotherString.value.length){//如果长度相同
char v1[]=value;
char v2[]=anotherString.value;
int i=0;
while(n--!=v2[i]){//逐个比较字符
if(v1[i]!=v2[i]){
return false;
}
i++;
}
return true;//如果两个字符串的所有字符都相等,则返回true
}
}
return false;//如果比较的不是字符串,则直接返回false
}
(2)String中的equals方法
String类的equals方法把Object的equals方法重写了,变成了比较两个字符串值是否相同
"hello".equals("abc");//查看String的equals方法的源码
(3)Integer中的equals方法
Integer类的equals方法把Object的equals方法重写了,变成了比较两个字符串值是否相同
Integer integer=new Integer(5);//查看Integer的equals方法的源码
package Equals;
public class Equals {
public static void main(String[] args) {
Integer integer1=new Integer(1);
Integer integer2=new Integer(1);
System.out.println(integer1==integer2);//false,因为是两个不同的对象
System.out.println(integer1.equals(integer2));//true,因为是两个相同的值
String str1=new String("hsp");
String str2=new String("hsp");
System.out.println(str1==str2);//false,因为是两个不同的对象
System.out.println(str1.equals(str2));//true,因为是两个相同的字符串
}
}
2、idea如何查看jdk源码
(1)一般来说idea配置好jdk后,jdk的源码也就自动配置好了,把光标放在方法处,快捷键Ctrl+B,即可查看该方法的源码
(2)如果没有:
File--->Project Structure--->SDKs--->Sourcepath--->点击右侧绿色的加号 --->添加两个jdk的源码包即可
3、如何重写equals方法
package Equals;
import PolyArray.Person;
public class equals02 {
public static void main(String[] args) {
Person02 person1=new Person02("jack",18,'男');
Person02 person2=new Person02("jack",18,'男');
/*重写equals方法前
System.out.println(person1.equals(person2));//输出:false
因为Person extends Object,而Object中的equals方法是判断两个对象是否是同一个对象
*/
//重写equals方法后
System.out.println(person1.equals(person2));//输出:true
}
}
class Person02 {
private String name;
private int age;
private char gender;
public boolean equals(Object obj){//obj指的是person2,this指的是person1
if(this==obj){//判断比较的两个对象是否是同一个对象
return true;
}
if(obj instanceof Person02){//都是Person类才比较,如果不同类比较没有意义
Person02 p=(Person02)obj;//向下转型,p指的是person2
return this.name.equals(p.name)&&this.age==p.age&&this.gender==p.gender;
}
return false;
}
public Person02(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;
}
}
4、练习题
(1)
package Equals;
public class EqualsExercise {
public static void main(String[] args) {
Person p1=new Person();
p1.name="hsp";
Person p2=new Person();
p2.name="hspdu";
System.out.println(p1==p2);//false,比较两个对象的地址
System.out.println(p1.name.equals(p2.name));//false,String的equals方法比较的是字符串的值
System.out.println(p1.equals(p2));//false,Person是Object的子类,比较的是地址
String s1=new String("asdf");
String s2=new String("asdf");
System.out.println(s1.equals(s2));//true,值相同
System.out.println(s1==s2);//false,不是同一个对象
}
}
class Person{
public String name;
}
(2)
package Equals;
import java.sql.*;
public class EqualsExercise03 {
public static void main(String[] args) {
int it=65;
float f1=65.0f;
System.out.println("65和65.0f是否相等?"+(it==f1));//true,比较的是基本数据类型的值
char ch1='A';
char ch2=12;
System.out.println("65和'A'是否相等?"+(it==ch1));//true,字符‘A’的ASCII码等于65
System.out.println("12和ch2是否相等?"+(12==ch2));//true
String str1=new String("hello");
String str2=new String("hello");
System.out.println("str1和str2是否相等?"+(str1==str2));//false,两个不同的对象
System.out.println("str1是否equals str2?"+(str1.equals(str2)));
//true,String重写Object类中的equals方法,比较的是值
System.out.println("hello"==new java.sql.Date());
//等号左边是字符串,右边是Date,类型不相同,无法比较,编译器报错
}
}