案例1:equals和==应用
package com.lian.pojo.f;
import java.util.Objects;
/**
* 1、== 用于基本类型来说,byte、short、int、long、float、double等,笔记的是两个基本数据的值是否相等
* 2、== 用于引用类型来说,比较的是两个对象的引用地址是否相等
* 3、equals 只能用于比较引用类型,比较的是 两个对象的值 是否相等
* 4、hashcode 两个对象equals比较如果相等,则两个对象的hashcode值一定相等
* 两个对象的hashcode值如果相等,但两个对象equals不一定相等
* 就好比 两个商品如果一模一样,那么它的价格是相等的,但是两个相同的价钱可以有不同的商品
* 5、== 两个对象的引用地址如果相同,说明它们指向同一个对象,类似一个屋子(对象)里的两把钥匙(引用地址),这两个对象equals一定相同
*/
public class A {
public static void main(String[] args) {
Person p1 = new Person("pi", 2);
Person p2 = new Person("pi", 2);
System.out.println("value: "+p1.equals(p2));
int h1 = p1.hashCode();
int h2 = p2.hashCode();
System.out.println(h1);
System.out.println(h2);
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
案例2:源码探究
package com.lian.pojo.f;
public class B {
public static void main(String[] args) {
/**
* String类重写了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-- != 0) {
* if (v1[i] != v2[i])
* return false;
* i++;
* }
* return true;
* }
* }
* return false;
* }
*/
String s1 = new String();
String s2 = new String();
boolean b = s1.equals(s2);
System.out.println("b: "+b); //true
/**
* Object对象只比较了两个对象的引用地址是否相等
* public boolean equals(Object obj) {
* return (this == obj);
* }
*/
Object o1 = new Object();
Object o2 = new Object();
boolean o = o1.equals(o2);
System.out.println("o: "+o); //false
}
}