一、==运算符
1、既可以判断基本类型,也可以判断引用类型
2、当判断基本类型时,判断的是值是否相等。
3、当判断引用类型时,判断的是地址是否相等,即判定是不是同一对象。
package com.javase.object_;
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 obj = a;
System.out.println(obj == c);//true
int n1 = 10;
double n2 = 10.0;
//基本数据类型,判断值是否相等
System.out.println(n1 == n2);//true
}
}
class A extends B {}
class B {}
二、equals方法
1、equals是Object方法,只能判断引用类型。
2、默认判断地址是否相等,子类中往往重写该方法,用于判断内容是否相等
string类的equals方法源码:
public boolean equals(Object anObject) {
if (this == anObject) {//如果是同一个对象
return true;//返回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-- != 0) {//然后一个一个的比较字符
if (v1[i] != v2[i])
return false;
i++;
}
return true;//如果两个字符串的字符都相等就返回true
}
}
return false;//如果比较的不是字符串,则直接返回false
}
Object类的equals源码
//默认比较对象地址是否相同即判断是否是同一对象
public boolean equals(Object obj) {
return (this == obj);
}
Integer integer1 = new Integer(1000);
Integer integer2 = new Integer(1000);
System.out.println(integer1 == integer2);//false 因为创建了两个对象,地址不同,所以为假
System.out.println(integer1.equals(integer2));//true 方法重写 判断值是否相等
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true
三、入门练习
1、判断两个Person对象的内容是否相等,如果两个Person对象的各个属性值都一样就返回true,反之返回false。
package com.javase.object_;
public class EqualsExercise01 {
public static void main(String[] args) {
Person p1 = new Person("张三", 20, '男');
Person p2 = new Person("张三", 20, '男');
System.out.println(p1.equals(p2));
}
}
class Person {
private String name;
private int age;
private char gender;
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方法
public boolean equals(Object obj) {
//判断两个对象是否是同一个对象
if (this == obj) {
return true;
}
if (obj instanceof Person) {//判断是Person才比较
Person p = (Person) obj;//向下装修,为了得到Persob的属性
return this.name == p.name && this.age == p.age && this.gender == p.gender;
}
return false;
}
}