欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java对象“==”与equals()方法的区别

程序员文章站 2022-07-14 12:06:38
...
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