文章目录
- 浅谈“==”
- 特点
- 比较基本类型
- 比较引用类型
- 浅谈“equals”
- 背景和使用
- 重写equals
- 自定义类为什么需要重写equals方法
- 总结
- 附录代码及文章推荐
前言:
1、8大基本数据类型,它们的值直接代表了某种数据,不是对象的实例,不能使用new来为基本数据类型创建对象
2、引用地址相同,值一定相同;值相同,引用地址不一定相同。即相同内容的对象地址不一定相同,但是相同地址的对象内容一定相同
本文主要以Person类为例,完整的类代码放在了文章末尾【附录代码】处了
浅谈“==”
特点
- == 为运算符,比较的是两个对象的引用,如果一致,返回为true
- == 可以比较基本类型(基本类型指向的是其值本身),比较的是值,但是需要注意float和double的比较
比较基本类型
- int、short、long、double、float的比较
// 比较的如果是基本类型,指向的都是地址为300的堆 // 在Java中,300和300.0是等价的。这是因为Java支持自动类型转换,包括从整数类型到浮点类型的转换。 // 当整数300被赋值给一个浮点类型的变量时,Java会自动将其转换为浮点数300.0。 int a = 300; short b = 300; long c = 300L; double d = 300.00d; // System.out.println(aa):300.0 float f = 300.0f; // System.out.println(bb):300.0 System.out.println(a==b); // true System.out.println(a==c); // true System.out.println(b==c); // true System.out.println(d==f); // true System.out.println(a==d); // double与long类型比较:true// 对于double和float类型来说,小数点后有数值,其实他们的精度是不同的,所以虽然数值显示一样,但其实是不一样的 double aaa = 300.01d; // System.out.println(aaa):300.01 double bbb = 300.01f; // System.out.println(bbb):300.010009765625 System.out.println(aaa==bbb); // false
- 如果是基本类型的包装类使用,要注意戳这里 → java的128陷阱
比较引用类型
- 比较的是两个对象的地址。即使是值相等,但是引用地址不同,同样返回false
// Person类内容可以看文章最后的【附录代码】部分
Person person1 =new Person("abc",12,"181");
Person person2 = new Person("abc",12,"181");
Person person3 = person1;
System.out.println(person1==person2); // false
System.out.println(person1==person3); // true
1、person1 和person2都是在堆中新建的对象,即使内容一样,但是他们地址不同;
2、person3的引用跟person1的引用是同一个,所以地址相同,内容自然也想通
3、如果我们想要让person1和person2相等,那么这时候需要的是equals了~~
浅谈“equals”
背景和使用
- 在Java中,equals方法是Object类的一个方法,用于比较两个对象是否相等。源码如下
- 由上边可以看到Object类使用的equals功能同**==**。在java中,想正确使用equals方法,需要对该方法覆盖重写。
- 所以我们想要实现person1和person2一样需要重写Person类中的equals方法
重写equals
-
重写equals的注意事项
1、自反性原则。对于任何非空引用A,A.equals(A)应该返回true。
2、对称性原则:如果A.equals(B)返回true,那么B.equals(A)也应该返回true。即equals方法的比较应该是双向的
3、传递性原则:如果A.equals(B)和B.equals©返回true,那么A.equals©也应该返回true。
4、一致性原则:对于任何非空引用A,只要对象的不变属性没有改变,多次调用A.equals(B)应该始终返回相同的值。
5、非空性原则:对于任何非null的引用值A,A.equals(null)应该返回false
6、HashCode的重写:建议重写equals方法的类同时也重写Object类的GetHashCode方法。这是因为如果两个对象根据equals方法是相等的,那么它们的哈希码(HashCode)也应该相同。 -
java中已经重写equals的类
String类、Integer类
-
自定义类重写equals
- 未重写equals前(以Person类为例)
public static void main(String[] args) {Person person1 =new Person("abc",12,"181");Person person2 = new Person("abc",12,"181");Person person3 = person1;System.out.println(person1.equals(person2)); // falseSystem.out.println(person1.equals(person3)); // true }
- 对Person类重写equals()方法
// 以Person类为例,完整的Person类代码可参看文章最后的【附录代码】 @Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Person)) return false;Person person = (Person) o;return Objects.equals(getName(), person.getName()) && Objects.equals(getAge(), person.getAge()) && Objects.equals(getPhone(), person.getPhone());}
- 重写equals后
public static void main(String[] args) {Person person1 =new Person("abc",12,"181");Person person2 = new Person("abc",12,"181");Person person3 = person1;System.out.println(person1.equals(person2)); // trueSystem.out.println(person1.equals(person3)); // true }
- 未重写equals前(以Person类为例)
自定义类为什么需要重写equals方法
通过上边Person类的演示,我们可以看到重写equals()方法前后的区别。
一般我们比较对象的时候,不会去比较引用地址,都是直观的来比较对象的值。
总结
- == 为运算符;equals为引用类型的比较方法,继承自Object类,未重写前功能同 ==;
- == 可以比较基本类型和引用类型,equals只能比较引用类型
- 比较值相等时,建议使用equals,但是需要注意自定义类需要重写equals方法
- == 比 equals 运行速度快,因为 == 比较的是引用地址而不是值。
附录代码及文章推荐
- Person类
import java.util.Comparator; import java.util.Objects;public class Person{String name; // 姓名Integer age; // 年龄String phone; // 性别// get()和set()方法public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String sex) {this.phone = phone;}// 构造方法public Person() {}public Person(String name, Integer age, String phone) {this.name = name;this.age = age;this.phone = phone;}@Override// 重写equals()方法public boolean equals(Object o) {// 引用地址相等,直接返回trueif (this == o) return true;// Object o类型不是Person,直接返回false;if (!(o instanceof Person)) return false;Person person = (Person) o;// 依次判断属性的值是否相等。String为引用类型,使用equals;int为基本类型,使用 == return Objects.equals(getName(), person.getName()) && Objects.equals(getAge(), person.getAge()) && Objects.equals(getPhone(), person.getPhone());}// 重写hashCode()方法@Overridepublic int hashCode() {return Objects.hash(getName(), getAge(), getPhone());}@Override// 重写toString()方法,方便打印public String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", phone='" + phone + '\'' +'}';} }
- 文章推荐:
Java中的equals方法详解:比较方法