• Java中== equals hashcode浅析[转]


    1. '=='是用来比较两个变量(基本类型和对象类型)的值是否相等的, 如果两个变量是基本类型的,那很容易,直接比较值就可以了。如果两个变量是对象类型的,那么它还是比较值,只是它比较的是这两个对象在栈中的引用(即地址)。 
    对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。 
    2. Object类中的equals方法就是用'=='来比较的,所以如果没有重写equals方法,equals和==是等价的。 
    通常我们会重写equals方法,让equals比较两个对象的内容,而不是比较对象的引用(地址)因为往往我们觉得比较对象的内容是否相同比比较对象的引用(地址)更有意义。 
    3. Object类中的hashCode是返回对象在内存中地址转换成的一个int值(可以就当做地址看)。所以如果没有重写hashCode方法,任何对象的hashCode都是不相等的。通常在集合类的时候需要重写hashCode方法和equals方法,因为如果需要给集合类(比如:HashSet)添加对象,那么在添加之前需要查看给集合里是否已经有了该对象,比较好的方式就是用hashCode。 
    4. 注意的是String、Integer、Boolean、Double等这些类都重写了equals和hashCode方法,这两个方法是根据对象的内容来比较和计算hashCode的。(详细可以查看jdk下的String.java源代码),所以只要对象的基本类型值相同,那么hashcode就一定相同。 
    5. equals()相等的两个对象,hashcode()一般是相等的,最好在重写equals()方法时,重写hashcode()方法; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。 反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在object类中,hashcode()方法是本地方法,返回的是对象的引用(地址值),而object类中的equals()方法比较的也是两个对象的引用(地址值),如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了。 
    以下是测试代码。

     1  public class Equals_HashCode {
     2     public static void main(String[] args) {        
     3          String a = new String("str");
     4          String b = new String("str");
     5          System.out.println(a==b);
     6          System.out.println(a.equals(b));
     7          System.out.println(a.hashCode());
     8          System.out.println(b.hashCode());
     9          // 输出 false true 114225 114225
    10          class A{
    11              String str;
    12              int i;
    13              public A(String str, int i) {
    14                  super();
    15                  this.str = str;
    16                  this.i = i;
    17              }
    18          }
    19          A aA = new A("str",1);
    20          A bA = new A("str",1);
    21          System.out.println(aA==bA);
    22          System.out.println(aA.equals(bA));
    23          System.out.println(aA.hashCode());
    24          System.out.println(bA.hashCode());
    25          // 输出 false false 6413875 21174459
    26          class B{
    27              String str;
    28              public B(String str){
    29                  this.str = str;
    30              }
    31          }
    32          B aB = new B("str");
    33          B bB = new B("str");
    34          System.out.println(aB==bB);
    35          System.out.println(aB.equals(bB));
    36          System.out.println(aB.hashCode());
    37          System.out.println(bB.hashCode());
    38          // 输出 false false 827574 17510567
    39          class C{
    40              int i;
    41              public C(int i){
    42                  this.i = i;
    43              }
    44          }
    45          C aC = new C(1);
    46          C bC = new C(1);
    47          System.out.println(aC==bC);
    48          System.out.println(aC.equals(bC));
    49          System.out.println(aC.hashCode());
    50          System.out.println(bC.hashCode());
    51          //输出 false false 27744459  28737396
    52     }
    53  
    54 }
    55  
  • 相关阅读:
    UNIX网络编程——处理服务器中大量的TIME_WAIT
    UNIX网络编程——套接字选项(心跳检测、绑定地址复用)
    UNIX网络编程——TCP 滑动窗口协议
    [Training Video
    [Training Video
    [Training Video
    [Training Video
    [Training Video
    Use formatter to format your JAVA code
    右键菜单没有新建文本文件了,怎么办?
  • 原文地址:https://www.cnblogs.com/yqskj/p/2925296.html
Copyright © 2020-2023  润新知