Java的 == 和 equals
1、基本数据类型比较用 ==
public class CompareTest {
public static void main(String[] args) {
int i = 999;
int i2 = 999;
int i3 = 9999;
compare(i, i2);//相等
compare(i, i3);//不相等
}
private static void compare(int a,int b){
if (a==b){
System.out.println("相等");
}else if(a!=b){
System.out.println("不相等");
}
}
}
2、引用数据类型比较用==和equals的区别
引用数据类型用 == 比较的是对象的地址。如果是比较值,建议用equals,包括基本数据类型包装类的值的比较
2.1、基本数据类型的包装类的比较
2.1.1、直接用==比较(比较的是对象的地址)
public class CompareTest {
public static void main(String[] args) {
Integer i1 = -128;
Integer i2 = -128;
Integer i3 = 127;
Integer i4 = 127;
compare(i1, i2);//==
compare(i3, i4);//==
compare(i1, i3);//!=
//基本数据类型的包装类的值在[-128,127]之间时,是享元模式。所以在值相等的时候,地址也相等。
//但是比较的依然是包装类对象的地址。
Integer i5 = -129;
Integer i6 = -129;
Integer i7 = 128;
Integer i8 = 128;
compare(i5, i6);//!=
compare(i7, i8);//!=
compare(i5, i7);//!=
}
private static void compare(Integer a,Integer b){
if (a==b){
System.out.println("==");
}else {
System.out.println("!=");
}
}
}
2.1.2、取出基本数据类型包装类的值再用 == 比较
public class CompareTest {
public static void main(String[] args) {
Long a = 9999999999999999L;
Long b = 9999999999999999L;
Long c = 1L;
Long d = 1L;
Long e = a;
compare(a, b);//==
compare(a, c);//!=
compare(null, c);//!=
//基本数据类型包装类的值在[-128,127]范围内时,享元模式。值相等时地址也相等
compare(c, d);//Pointer ==
//地址相等
compare(a, e);//Pointer ==
compare(null, null);//Pointer ==
}
private static void compare(Long a,Long b){
if (a==b){//a和b地址相等的时候,包括a和b都为null的时候。
System.out.println("Pointer ==");
return;
}
if (a!=null && b!=null && a.longValue()==b.longValue()){
System.out.println("==");
}else {
System.out.println("!=");//a和b都有值但是不相等,或者a和b之间有且仅有一个为null。
}
}
}
2.1.3、用equals比较
public class CompareTest {
public static void main(String[] args) {
Long a = 9999999999999999L;
Long b = 9999999999999999L;
Long c = 1L;
Long d = 1L;
Long e = a;
compare(a, b);//equals
compare(a, c);//not equals
compare(null, c);//not equals
compare(a, null);//not equals
compare(c, d);//equals
compare(a, e);//equals
compare(null, null);//a=b=null
}
private static void compare(Long a,Long b){
if (a==null && b==null){
System.out.println("a=b=null");
return;
}
if (a!=null && a.equals(b)){
System.out.println("equals");
}else {
System.out.println("not equals");
}
}
}
包装类equals源码举例(覆写了Object类的equals方法)
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
Object类的equals方法(用的是 ==,比较的是地址)
public boolean equals(Object obj) {
return (this == obj);
}
2.2、常见的对象的比较
随意准备一个类,覆写equals方法
public class User {
private long id;
private String name;
private String password;
//提供无参、有参构造方法,setter和getter方法,覆写toString方法。
//覆写equals方法
@Override
public boolean equals(Object o) {
//地址相等,一定相等
if (this == o) return true;
//当前对象不为null而比较对象weinull,或者类型不同,一定不等
if (o == null || getClass() != o.getClass()) return false;
//类型相同,从Object类型强制转化到当前类型
User user = (User) o;
//比较需要比较的属性值
return Objects.equals(name, user.name) &&
Objects.equals(password, user.password);
}
}
比较对象用equals
public class CompareTest {
public static void main(String[] args) {
User user = new User(1L,"zs","123456");
User user1 = new User(2L,"zs","123456");
User user2 = user1;
User user3 = new User(3L,"ls","123456");
compare(user, user1);//equals
compare(user2, user3);//not equals
compare(user1, user2);//==
compare(null, null);//==
compare(user, null);//not equals
compare(null, user);//not equals
compare(user, "12345");//type not equals
}
private static void compare(Object obj1,Object obj2){
if (obj1==obj2){
System.out.println("==");
return;
}
if (obj1!=null && obj2!=null && obj1.getClass()!=obj2.getClass()){
System.out.println("type not equals");
return;
}
if (obj1!=null && obj1.equals(obj2)){
System.out.println("equals");
}else {
System.out.println("not equals");
}
}
}