• 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

  • 相关阅读:
    记一次手工端假设之旅
    宝塔面板相关笔记
    linux ubuntu centos 相关笔记
    问题解决笔记,Restarting network (via systemctl):: Job for network.service failed. ...
    Ubuntu中使用yum
    小说爬取 python + urllib + lxml
    wsgiref错误解决笔记 "write() argument must be a bytes instance"
    个人作品导航:
    django基础一
    前端小知识(5)--响应式页面实现
  • 原文地址:https://www.cnblogs.com/jingyunyb/p/3797652.html
Copyright © 2020-2023  润新知