java中equal和==的区别

在java中常会碰到equal和==的用法。
equal:是用来比较两个对象内部的内容是否相等的,由于所有的类都是继承
      自java.lang.Object类的,所以如果没有对该方法进行覆盖的话,调用
      的仍然是Object类中的方法,而Object中的equal方法返回的却是==
      的判断,因此,如果在没有进行该方法的覆盖后,调用该方法是没有
      任何意义的。
==:是用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的
    是真正意义上的指针操作。

 

一般认为:

==比较的是基础数据的值或者是对象的引用地址

equal()比较的是对象的内容

 

其实:

==和equal()都是比较的引用地址,其实是栈内存中变量(包括基本数据类型的变量和对象变量)的值

equals()方法在object类中定义如下:

public boolean equals(Object obj) {
  return (this == obj);
}

但是在String、Integer、Math、Double......等这些封装类中,覆盖了Object类中的equal()方法,

比如String类中:

复制代码

public boolean equals(Object anObject) {
  if (this == anObject) {
    return true;
}
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
      return false;
    }
    return true;
    }
}
return false;
}

复制代码

很明显,equal()经常重写之后,已经不是地址的比较,而是内容的比较,依次类推Double、Integer、Math......等等这些类都是重写了equal()方法,从而进行的是内容的比较。

注意:hashCode()也存在同样的覆盖重写情况

 

System.out.println(对象)

这样的语句输出的不是对象的地址,虽然它看起来像,其实这条语句相当于:System.out.println(对象.toString());

也就是说如果一个类没有重写Object.toString()方法,那么打印语句得到的都将是:类名+"@"+十六进制表示的对象的哈希值

Object的代码:

public String toString () {
    return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}

我们打印出来的对象的地址其实是一个伪地址,因为不同的对象可能会是同一个hashCode

 

复制代码

import java.util.ArrayList;
import java.util.List;

public class Prove
{
    public static void main(String[] args)
    {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 3000; i++)
        {
            Prove p = new Prove();
            if (!list.contains(p.hashCode()))
                list.add(p.hashCode());
        }
        System.out.println(list.size());
    }
}

复制代码

生成了3000个Prove对象,应该新分配3000个内存地址,最后却只有2998个hashCode

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一多一点。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值