java equals和==的区别_java equals和==的区别

大概说equals和==都比较的是什么:

1. boolean tem = a == b;

首先==比较的肯定是地址(和hashcade没有关系,hashcade不同说明不是一个对象,但是两个不一样的对象hashcode也有可能相同。比如两个内容相同的String对象),从堆栈的角度说也就是说==比较的是栈上面的内容。因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用int a = 1;这种形式来定义的变量)。如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较。而自动变量既不是类的实例也不是类的引用所以不能用equals()方法。

2.boolean tem = a.equals("b");

equals()方法一般用于比较的是对象的内容但是也有的情况下也会去比较两个对象的地址。

接下来

写一个测试程序

package com;

import java.util.Date;

public class test {

public static voidmain(String[] args) {

Integer integer1 =new Integer(1);

Integer integer2 =new Integer(1);

String str1 =new String("123");

String str2 =new String("123");

String str3= "abc";

String str4 = "abc";

Date date1 =new Date();

Date date2 =new Date();

Double double1 =new Double("1.0");

Double double2 =new Double("1.0");

Boolean tem1 =new Boolean(true);

Boolean tem2 =new Boolean(true);

Object object1 =new Object();

Object object2 =new Object();

System.out.println("----Object------");

System.out.println(object1.equals(object2));

System.out.println(object1 == object2);

System.out.println(object1.equals(object1));

System.out.println(object1 == object1);

System.out.println("----Boolean------");

System.out.println(tem1.equals(tem2));

System.out.println(tem1 == tem2);

System.out.println("----Double------");

System.out.println(double1.equals(double2));

System.out.println(double1 == double2);

System.out.println("----Integer------");

System.out.println(integer1.equals(integer2));

System.out.println(integer1 == integer2);

System.out.println("----String------");

System.out.println(str1.equals(str2));

System.out.println(str1 == str2);

System.out.println(str1.equals(str2)); System.out.println(str1 == str2)System.out.println(str3.equals(str4));

System.out.println(str3 == str4);System.out.println("----Date------");

System.out.println(date1.equals(date2));

System.out.println(date1 == date2);

}

}

结果:

----Object------

false

false

true

true

----Boolean------

true

false

----Double------

true

false

----Integer------

true

false

----String------

true

false

true

true

----Date------

true

false

首先对Object的比较,当比较的两个对象一样时,==和equals()的结果都是true,当两个对象不一样时返回的都是false。所以在==和equals用于比较对象时,他们比较的都是对象的地址,其实本质是一样的。下面是Object类中equals()方法的代码:

public booleanequals(Object obj) {return (this ==obj);

}

在这里string需要特殊说明一下,我们知道String是被final修饰的是不可变的,这时候我们可能会想== 不是用来比较引用吗,那为什么str3 == str4还能等于true呢?注意“==”的确用来比较对象的引用,但是你能够确定String str3 = "abc";和String str4 = "abc";重新生成对象了吗?原来java在String这块也做了特殊处理,在这块有个叫做字符缓冲池的东西,当用new的方法创建一个string对象时会先在字符串缓冲池中找有没有和新创建的字符串内容相等的对象,如果没有的话就会在缓冲池新创建一个字符串对象然后再在堆中创建字符串对象,如果缓冲池中已经有了和新创建的字符串内容相等的对象就会直接在堆上新创建对象。如果不用new的方式也是先会看缓冲池中有没有创建过这个对象,如果没有创建就在里边创建一个,如果已经创建了那新声明的引用(例子中的str4)就会直接指向这个对象。所以在本例中str3 == str4 是等于true。关于string的知识需要注意的不只有这些,想要了解的同学再留言讨论吧。这里我们主要说equals和==的区别。

而对于Boolean,Double(Float同理),Interger(Shot,Long同理),String,Date我也找了他们的源码,下面我依次贴出来在Boolean,Double,Interger,String,Date这些类中equals()方法的源码,这时候equals()方法就被重写了,因为这些类都是继承于Object类的嘛。

Boolean:

public booleanequals(Object obj) {if (obj instanceofBoolean) {return value ==((Boolean)obj).booleanValue();

}return false;

}

Double:

public booleanequals(Object obj) {return (obj instanceofDouble)&& (doubleToLongBits(((Double)obj).value) ==doubleToLongBits(value));

}

Interger:

public booleanequals(Object obj) {if (obj instanceofInteger) {return value ==((Integer)obj).intValue();

}return false;

}

String:

public booleanequals(Object anObject) {if (this ==anObject) {return true;

}if (anObject instanceofString) {

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) {if (v1[i] !=v2[i])return false;

i++;

}return true;

}

}return false;

}

Date:

public booleanequals(Object obj) {return obj instanceof Date && getTime() ==((Date) obj).getTime();

}

也就是说在这些时候重写了Object类的equals()方法用于比较两个对象实际的内容而不再是地址了,当然肯定不只是这些,这里只是举出了几个比较常见的java原生类重写Object类的equals()方法的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值