zoukankan      html  css  js  c++  java
  • "==" 与 "euqals()"的区别

    1、“==”

      “==” 用于匹配内存单元上的内容,其实就是一个数字。在 Java 语言中,“==” 其实就是对比连个内存单元的内容是否一样。如果是8大原始类型(byte、short、int、long、float、double、char、boolean),就是直接比较他们的值。

      如果是引用,比较的就是引用的值,即是对象的地址。两个引用用 “==” 判断,比较的是两个对象的地址值是否一致。关于对象的引用,举一个例子如下:

    1         String a = "a" + "b" + "c";
    2         String b = "abc";
    3         String c = new String("abc");
    4         System.out.println(a == b); // true
    5         System.out.println(a == c); // false
    6         System.out.println(b == c); // false    
    对象引用 “==”

    2、equals()

      equals() 方法是在Object 类中被定义的,它的源码中是使用 “==” 方法来判断的。如下所示:

    1     public boolean equals(Object obj) {
    2         return (this == obj);
    3     }
    Object 类中的equals源码

      从中可看出,如果不去重写 equals() 方法,并且对应的类的父类中都没有重写equals()方法,那么默认的操作就是对比对象的地址。equals()方法之所以存在,是希望子类去重写这个方法,实现对比值的功能。

      那么再来看看String 类中的equals() 方法:(先对比地址,再对比长度)

     1      /** The value is used for character storage. */
     2       private final char value[]; // String类中用于存储的char 数组
     3   
     4       public boolean equals(Object anObject) {
     5           if (this == anObject) { // 先对比对象的地址
     6               return true;
     7           }
     8           if (anObject instanceof String) {
     9               String anotherString = (String)anObject;
    10              int n = value.length;
    11              if (n == anotherString.value.length) { //char数组长度一样再进行判断
    12                  char v1[] = value;
    13                  char v2[] = anotherString.value;
    14                  int i = 0;
    15                  while (n-- != 0) {
    16                      if (v1[i] != v2[i])
    17                          return false;
    18                      i++;
    19                  }
    20                  return true;
    21              }
    22          }
    23 23         return false;
    24 24     }
    String类中的equals() 方法

      之所以要自己去实现equals() 方法,是因为两个对象需要根据具体业务的关键属性值来进行对比,以此来确定它们是否是“一致的货相似的”。两个对象的值是否相同时根据自己的业务决定的,而不是Java语言来决定的

  • 相关阅读:
    深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)
    ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline Part I
    IIS Server Variables(IIS 服务器变量)
    .Net源码之Page类(二)
    博客改变生活
    目录、路径、虚拟路径
    Windows 7 Beta 1 7000
    《Visual Studio Hacks 》读书笔记 (十二)
    新建XML文件
    另一个分页函数
  • 原文地址:https://www.cnblogs.com/Eric-F/p/10021126.html
Copyright © 2011-2022 走看看