• hashCode() 和 equals() 方法比较和重写


    先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同

      然而hashCode()和equal()一样都是基本类Object里的方法,而和equal()一样,Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同,所以这显然不是我们想要的,所以我们必须重写我们类的hashCode()方法,即一个类,在hashCode()里面返回唯一的一个hash值

     1 package com;
     2 
     3 public class Student {
     4     private String name;
     5     private int age;
     6     
     7     public Student() {
     8         super();
     9         // TODO Auto-generated constructor stub
    10     }
    11 
    12     public String getName() {
    13         return name;
    14     }
    15 
    16     public void setName(String name) {
    17         this.name = name;
    18     }
    19 
    20     public int getAge() {
    21         return age;
    22     }
    23 
    24     public void setAge(int age) {
    25         this.age = age;
    26     }
    27 
    28     public Student(String name, int age) {
    29         super();
    30         this.name = name;
    31         this.age = age;
    32     }
    33 
    34     @Override
    35     public String toString() {
    36         return "Student [name=" + name + ", age=" + age + "]";
    37     }
    38 
    39     @Override
    40     public int hashCode() {
    41         final int prime = 31;
    42         int result = 1;
    43         result = prime * result + age;
    44         result = prime * result + ((name == null) ? 0 : name.hashCode());
    45         return result;
    46     }
    47 
    48     @Override
    49     public boolean equals(Object obj) {
    50         if (this == obj)
    51             return true;
    52         if (obj == null)
    53             return false;
    54         if (getClass() != obj.getClass())
    55             return false;
    56         Student other = (Student) obj;
    57         if (age != other.age)
    58             return false;
    59         if (name == null) {
    60             if (other.name != null)
    61                 return false;
    62         } else if (!name.equals(other.name))
    63             return false;
    64         return true;
    65     }
    66     
    67     
    68 
    69     
    70     
    71 }
    Student
     1 package com;
     2 
     3 public class StudentDemo {
     4     public static void main(String[] args) {
     5         Student s =  new Student("tom",10);
     6         //对象的hash值和String的转换
     7         //toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、标记符@和此对象的无符号十六进制组成
     8         String string = s.toString();//返回该对象的字符串表示
     9         //如果不重写得到的是com.Student@7852e922,重写后得到重写后的字符串
    10         System.out.println(string);//com.Student@7852e922
    11         
    12         int hashCode = s.hashCode();//返回该对象的哈希值
    13         //如果不重写hashCode得到的是地址值,重写后得到的是该对象里面值的hash值
    14         System.out.println(hashCode);//2018699554
    15         String hexString = Integer.toHexString(hashCode);
    16         System.out.println(hexString);//7852e922
    17         
    18         //getClass()返回值  此对象运行时类的Class对象
    19         String name =  s.getClass().getName();
    20         System.out.println(name);//com.Student
    21         //打印方法默认调用toString方法
    22         System.out.println(s);//com.Student@7852e922
    23         
    24         Student s1 = new Student("tom",10);
    25         Student s2 = new Student("tom",10);
    26         //equals()方法比较  要重写  不重写的话得到是地址值的比较
    27         boolean b = s1.equals(s2);
    28         System.out.println(b);
    29         
    30         
    31     }
    32 }
    StudentTest

    toString()  hashCode()  equals()  方法重写

  • 相关阅读:
    装黑苹果遇到的术语
    关于Android方法数量限制的问题
    使用LeakCanary遇到的问题 就是不弹出来
    Android内存泄露自动检测神器LeakCanary
    Android开发常见的Activity中内存泄漏及解决办法
    LeakCanary 中文使用说明
    LeakCanary: 让内存泄露无所遁形
    LeakCanary——直白的展现Android中的内存泄露
    【腾讯Bugly干货分享】Android内存优化总结&实践
    Java基础--定时任务Timer
  • 原文地址:https://www.cnblogs.com/star521/p/8874352.html
Copyright © 2020-2023  润新知