java bEqual_java equals和==的区别详解

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

1. boolean tem = a == b;

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

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

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

接下来

写一个测试程序

package com;

import java.util.Date;

public class test {

public static void main(String[] args) {

Integer integer1 = new Integer(1);

Integer integer2 = new Integer(1);

String str1 = new String("123");

String str2 = new String("123");

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("----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

----Date------

true

false

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

public boolean equals(Object obj) {

return (this == obj);

}

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

Boolean:

public boolean equals(Object obj) {

if (obj instanceof Boolean) {

return value == ((Boolean)obj).booleanValue();

}

return false;

}

Double:

public boolean equals(Object obj) {

return (obj instanceof Double)

&& (doubleToLongBits(((Double)obj).value) ==

doubleToLongBits(value));

}

Interger:

public boolean equals(Object obj) {

if (obj instanceof Integer) {

return value == ((Integer)obj).intValue();

}

return false;

}

String:

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof 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) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

Date:

public boolean equals(Object obj) {

return obj instanceof Date && getTime() == ((Date) obj).getTime();

}

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值