“==”和equals 最大的区别是
- “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
- equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值
一、==
基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址
通俗理解:其实==比较的不管是基本数据类型,还是引用数据类型的变量,比较的都是值,只是引用类型变量存的值是对象的地址
二、equals()
equals是Object的方法,用来比较两个对象的地址值是否相等。
注意:
equals 方法不能用于比较基本数据类型,如果没有对 equals 方法进行重写,则相当于“==”,比较的是引用类型的变量所指向的对象的地址值。
一般情况下,类会重写equals方法用来比较两个对象的内容是否相等。比如String类中的equals()是被重写了,比较的是对象的值。
运行速度不同
1、equals():没有==运行速度快。
2、==:运行速度比equals()快,因为==只是比较引用
public class Test {
public static void main(String[] args) {
//基本数据类型的比较
int a=10;
int b=10;
System.out.println(a==b); //true
//引用数据类型的比较
//String类(重写了equals方法) 中==与equals的比较
String a1="hello";
String a2="hello";
System.out.println(a1==a2); //true 比较的是地址值 :内容相同 常量池中有内容"hello",对象其实是同一个对象, 地址值相同
System.out.println(a1.equals(a2));//true
System.out.println("========================");
String st1= new String("tyu");
String st2= new String("tyu");
System.out.println(st1==st2);//false 比较地址值:在堆内存中的地址值不同
}
}
其实st1与st2相等的原因是用到了内存中的常量池,当运行到st1创建对象时,如果常量池中没有,就在常量池中创建一个对象"tyu",第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。