equals和==有什么区别?
序
equals和==有什么区别是面试中经常被问的问题,也是必须要掌握的基础知识,基础知识没有掌握,很难通过面试拿到理想的offer,今天让我们来一起学习一下 equals和有什么区别吧!
基本概念
对于基本数据类型,==比较的是他们的值。基本数据类型没有equal方法;
对于引用数据类型,==比较的是它们的存放地址(是否是同一个对象)。equals()默认比较地址值,重写的话按照重写逻辑去比较。
这里提到提到了基本数据类型和引用数据类型
基本数据类型我们都知道java中的基本类型为 byte、short、int、long、float、double、boolean、char。这些类型的变量比较时,其实就是值的比较,这里要用==来比较 而不能用equals。
引用数据类型,像我们自己创建的类,还有基础类的包装类,String类等等这些类, == 比较的就是他们的地址。而equals()则是比较地址值。
看一下源码中Object类的equals,发现是比较地址值。
public boolean equals(Object obj) {
return (this == obj);
}
像经典的Integer,String类这些,其实equals方法都是被重写了。
Integer比较的时候 要用equals。Integer的equals源码如下,可以看见这里是取地址的值比较了。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
String比较的时候 也要用equals,String的equals源码如下,可以看见这里的逻辑,如果是String类型并且长度相同,则比较数组中的每一位
public boolean equals(Object anObject) {
if (this == anObject) {
return true; //判断是否为同一对象
}
if (anObject instanceof String) {
//若当前传入的对象是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) {
//按照数组value中的每一位进行比较
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
总结
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
equals()不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。
equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。
关于值传递:无论是基本数据类型还是引用数据类型。这是因为 Java 中的所有数据类型都可以分为基本数据类型和引用数据类型,而方法调用时只会将变量的值复制一份传递给方法。值传递使得代码更加简洁、安全,并且能够提高程序的执行效率