首页 > 代码库 > JAVA中equal()和==的区别

JAVA中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