java对象“==”与equals()方法的区别
private Deque<Integer> data;
private Deque<Integer> helper;
...
if(helper.peek()==data.peek()){
...
}
在一次编程中发现两个栈的栈顶元素打印是相等的,但是却进入不了if语句。后来发现是因为java中自动装箱自动拆箱在基本类型int和对象类型Integer之间转换,在helper.peek()==data.peek()
语句中两边都是Integer类型,而==对于对象类型比较的是内存地址。值相同的时候内存地址不一定相同。如下源码所示:
public final class Integer extends Number implements Comparable<Integer> {
...
/**
* The value of the {@code Integer}.
*
* @serial
*/
private final int value;
/**
* Constructs a newly allocated {@code Integer} object that
* represents the specified {@code int} value.
*
* @param value the value to be represented by the
* {@code Integer} object.
*/
public Integer(int value) {
this.value = value;
}
...
}
例如下面代码:
import java.util.ArrayDeque;
import java.util.Deque;
public class MainTest {
public static void main(String[] args) {
Deque<Integer> a=new ArrayDeque<Integer>();
Deque<Integer> b=new ArrayDeque<Integer>();
a.push(new Integer(1));
b.push(new Integer(1));
System.out.println(a.pop()==b.pop());
}
}
执行结果就是false
.
将代码中System.out.println(a.pop()==b.pop());
修改为System.out.println(a.pop().intValue()==b.pop().intValue());
结果为true
,这是因为完成了手动拆箱。
可以看到intValue()
的源码:
/**
* Returns the value of this {@code Integer} as an
* {@code int}.
*/
public int intValue() {
return value;
}
可以看出此时是将基本类型int相比较。
将代码中System.out.println(a.pop()==b.pop());
修改为System.out.println(a.pop().equals(b.pop()));
结果为true
,可以看到Integer里equals()
方法的源码如下
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Object是所有类的父类,它的源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看出Integer类重写了equal()
方法,即拆箱之后进行比较,比较数值而不是内存地址。
综上,对象的 ==
比较的是对象内存地址,而equal()
方法要看该对象对equal()
方法的重写,如果没有重写,则和==
的结果是一样的。
Integer 源码地址:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/Integer.java
上一篇: Java按指定字符切割字符串
下一篇: java字符串切割小记