建议回答时包括:
多个对比项有什么相同、相似之处
多个对比项的区别
在应用中应该如何选取(重要)
可能的话,加入一些扩展(对相关知识点的理解)
一.==与equals的区别
首先我们应明确几个问题
1.变量与对象是2个不同的概念
Object a =new Object();
以上代码中a就是变量,在内存中实际存在的数据就是对象
2.所有引用类型的变量值都是引用地址
假设某对象在内存中的地址是0*6528,则变量的值就是0*6528
有了相关的概念之后开始比较
- ==与equals()的相同/相似之处
这俩者都是用于比较2个变量是否“相同”的
- ==与equals()的区别
- ==是基本运算符,适用于所有类型的变量与变量的对比
- equals()是Object类定义的方法,由于Object是java的基类(所有类的父类),所以,任何对象都可以调用equals()方法实现对比,但是,基本数据类型并不是对象,无法调用该方法实现对比
==对比的是变量的值
如果是基本数据类型对比的是字面值
如果是引用数据类型,对比的是引用地址
public static void main(String[] args) {
int a =100;
int b =100;
int c =200;
System.out.println(a==b);//true
System.out.println(a==c);//false
}
因为是new出来的,我们假设地址,对比的也是地址
Object a1 =new Object();
Object b1 =new Object();
System.out.println(a1==b1);//false
赋值符号就是在栈内存进行值的赋值(引用地址)
Object a =new Object();
Object b=a;
System.out.println(a==b);//true
equals():
equals只是一个方法,到底返回true或false取决于方法的实现
默认情况下(根据Object)的定义,它与==的结果是相同的
Object a =new Object();
Object b=new Object();
System.out.println(a==b);//false
System.out.println(a.equals(b));//fasle
Object a =new Object();
Object b=a;
System.out.println(a==b);//true
System.out.println(a.equals(b));//true
方法可以被重写没在java中,许多类都重写里equals()方法,例如:String.包装类,日期等
尽管是不同的对象,但是equals()的结果可能是true
String a = new String("Tedu");
String b = new String("Tedu");
System.out.println(a == b);//false,==比的就是内存的地址
System.out.println(a.equals(b));//true,他取决去String这个类对equals方法的重写
下面是String类对equals重写的源代码
- 特殊情况:
由于java对常量池的特殊处理,还有些特殊情况:
直接声明的字符串使用==对比也是成立的
String c ="abc";
String d ="abc";
/*c d都是指向常量池的“abc”*/
System.out.println(c==d);//true
使用[-128,127]区间值对整型包装类对象使用==对比也是成立的(-128到127之间包装类直接用==对比,只要字面值相同一定相同,当然还是推荐用equals来对比)
Integer a=-129;
Integer b=-129;
System.out.println(a==b);//false
a=-128;
b=-128;
System.out.println(a==b);//true
a=127;
b=127;
System.out.println(a==b);//true
a=128;
b=128;
System.out.println(a==b);//false
总结:
相同之处:
都是对比2个数据是否相同
不同之处:
==符号可以对比所有数据,而equals()只能被对象调用;==符号对比变量的值是否相同,所以基本类型的变量只要字面值相同即返回true,引用类型的变量仅当引用地址相同时才返回true;equals()方法是Object定义的,默认使用==实现对比,所以,当该方法没有被重写时,执行效果与==相同没如果被重写则取决于重写的代码,以String对象为例,在执行equals()将琢一对比字符串的每个字符,所以,只要2个String对象的字符完全相同,2个String对象使用equals()对比将返回true;
- 补充说明:
由于java会在编译期处理常量并且,常量池中的每个常量都是唯一的,所以,没当使用字符串常量直接对变量赋值,或使用【-128,127】区间值对Byte/Short/Integer/Long 类型的对象赋值时没使用==对比的结果也是true
- 实际应用原则:
在实际编写代码时,对于基本数据类型的变量,必须使用==进行对比,因为基本数据类型的变量不可以调用equals()方法;对于引用数据类型的变量,推荐(必须)使用equals()进行对比,并且,在有必要的情况下,如果这个类使我们声明的,我们应该重写equals()方法,使之返回结果的规则符合当前编写代码的需求,在重写时,至少保证同一个对象的对比结果为true(说白了即:如果==对比为true时,则equals()对比返回true)