• Java中的Object类


            Object 类是 Java 中所有类的始祖, 在 Java 中每个类都是由它扩展而来的,所以可以使用 Object 类型的变量引用任何类型的对象。

    1、equals方法

    • == 和 equals()的区别:

      • 对于基本数据类型,==比较的是值是否相等,对于因引用数据而言,则比较的是引用的地址

      • Object中的equals()方法比较的是引用数据类型变量所指的地址是否相等,且无法用于比较基本数据类型(因为equals是对象的方法,基本数据类型不是对象)

      • 但是,equals()的方法在比较String类型时,因为String类型的字符串存储在字符串常量池中,当其字符串相同时,在字符串常量池中的位置地址也相同,所以会返回true,其实是String当中的equals()重写了Object()方法当中的equals(),String当中的equals()会先比较变量比较的地址是否相等,若相等则结束,否则就会直接逐个比较字符串的值

        1. public class Person {
        2. public int age;
        3. public Person(int age) {
        4. this.age = age;
        5. }
        6. }
        7. public class Test{
        8. public static void main(String[] args) {
        9. int a = 18;
        10. int b = 18;
        11. System.out.println(a=b); //返回true,因为此时比较的是数值
        12. Person p1 = new Person(18);
        13. Person p2 = new Person(18);
        14. System.out.println(p1 == p2); //返回false,此时比较的是地址
        15. System.out.println(p1.equals(p2)); //返回false,因为两个对象地址不同
        16. String a = new String("123");
        17. String b = new String("123");
        18. System.out.println(a.equals(b)); //返回true,因为String重写了equals方法
        19. }
        20. }

        2、HashSet hashCode

      • HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。

        • 它会将传进去的对象转换为一个int类型的数值,如果如果转换完之后,有其他数值与其相等,则抛弃,这样就达到了去重,而将对象转换为哈希值(int类型)就是hashCode来实现的

          1. HashSet hashSet = new HashSet();
          2. hashSet.add(1);
          3. hashSet.add(1);
          4. sout(hashSet); //只会输出一个1

                     

    • HashSet 允许有 null 值。

    • HashSet 是无序的,即不会记录插入的顺序。

    • hashCode是一个本地方法,用C++来实现的,HashSet的最后就是通过hashCode来完成的,它既可以实现对引用数据类型的判断,亦可以实现对基本数据类型的判断

    • 3、为什么重写equals后,必须重写hashCode方法?

    • 在不重写equals时,使用equals进行比较时,若地址不同(不是相同的对象)则返回false,然后我们同时调用hashCode,因为hashCode会将不同类型的变量(包括对象)转换为int类型的数据,所以hashCode也会返回false,但是,我们重写equals方法,用一个例子来表示:

      1. //先定义一个Person类
      2. public class Person {
      3. public int age;
      4. public Person(int age) {
      5. this.age = age;
      6. }
      7. //重写equals方法,比较对象中的属性值
      8. public boolean equals(Person anP){
      9. if(this.age == anP.age){
      10. return true;
      11. }
      12. return false;
      13. }
      14. }
      15. public class Test {
      16. public static void main(String[] args) {
      17. Person p1 = new Person(18);
      18. Person p2 = new Person(18);
      19. System.out.println(p1.equals(p2)); //true
      20. HashSet hashSet = new HashSet();
      21. hashSet.add(p1);
      22. hashSet.add(p2);
      23. System.out.println(hashSet); //两个内容,说明对象不同
      24. }
      25. }

      我们来看,我们重写了equals方法,使其比较的是对象中的具体值,例子中返回true是完全正确的,即使他们不是同一个对象,但是我们再用HashSet来存放两个对象时,很显然会出现两个内容,这也是完全正确的,但是,我们觉得没问题是因为我们知道程序对equals进行了重写,所以不同对象返回的也是true,但是使用者可不一定知道,当不知情的人看到调用equals返回的是true时,他们会觉得这两个对象相同,然后放到HashSet中之后却有两个元素,这就会产生矛盾,弄不清楚了。所以,重写equals方法时必须一并重写hashCode方法

  • 相关阅读:
    到底有几个鸿蒙OS? 谈谈我眼里的鸿蒙操作系统
    分布式机器学习---数据与模型划分
    【大体思路】rv1126 跑通 yolov5
    LVS实战笔记-DR单网段
    【535. TinyURL 的加密与解密】
    MT8735/MTK8735安卓核心板规格参数介绍
    利用Openssl写一个简陋的https劫持
    基于Python爬虫和K-means算法的校园微博热点话题发现系统
    【附源码】计算机毕业设计JAVA政府采购线上招投标平台
    【Java 8的新特性】
  • 原文地址:https://blog.csdn.net/qq_51321722/article/details/138187123