java中==和equals区别(java==和eques)
导语:java中==和equal的区别
==号和equals()方法都是比较是否相等的方法,那它们究竟有什么区别和联系呢?
1、用==号比较两个对象时比较的是两个对象的地址值,请看如下代码:
package test;public class DemoTest1 {public static void main(String[] args) {byte b1 = Byte.MIN_VALUE;byte b2 = Byte.MIN_VALUE;int do1 = 12;int do2 = 12;String str1 = "123";String str2 = "123";String strObj1 = new String("123");String strObj2 = new String("123");System.out.println(b1 == b2); // 基本数据类型输出trueSystem.out.println(do1 == do2); // 基本数据类型输出trueSystem.out.println(str1 == str2); // 引用同一个对象引用输出trueSystem.out.println(strObj1 == strObj2); // 不同对象引用输出false}}
以String str1="123";形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"123"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"123",下一次如果有String str1 = "123";又会将str1指向"123"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象,而b1、do1也是在常量池中,同样也是会在常量池中查找是否有相同值的对象,因此便于记忆,我们可以这样总结:
基本数据类型及以String str1="123"这种形式的字符串,使用“==”比较时,只要他们的值相等,则都会返回true。
而strObj1 创建了两次对象,一次是在常量池中创建了对象"abc",一次是在堆内存中创建了对象strObj1 ,所以strObj1 和strObj12的地址值不相等
2、 equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
equals方法最初是在所有类的基类Object中进行定义的,源码是
public boolean equals(Object obj) { return (this == obj); }
由equals的源码可以看出这里定义的equals与==是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String、Integer等类)对equals进行了重写,但是没有对equals进行重写的类(比如我们自己写的类)就只能从Object类中继承equals方法,其equals方法与==就也是等效的,除非我们在此类中重写equals。
对equals重新需要注意五点:
1 自反性:对任意引用值X,x.equals(x)的返回值一定为true;
2 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ;
4 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变;
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 。
本文内容由快快网络小余创作整理编辑!