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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值