zoukankan      html  css  js  c++  java
  • java中equals和compareTo的区别---解惑

    大多转载自 百度知道,个人整理以便日后阅读。


    value1.compareTo(value2) == 0
    value1.equals(value2)

    equals的效率高些,compareTo其实就是按照编码的数值求差值,根据差值进行比较,它能确定两个String在字典顺序上的前后性,当你只是想知道是否一致时,用equals也行,效果一样。
    
    另外,equals是Object的方法,要求涉及到比较操作的继承类要自己重写该方法,所以String重写了equals,而compareTo为String的方法。所以:
    value1.compareTo(value2),当value1不为String类型时,会报错。
    而
    value1.equals(value2),都会进行比较。

    实现了Comparable接口的类才有compareTo方法,有了就可以用, 
    
    所有已知实现类: 
    Authenticator.RequestorType, BigDecimal, BigInteger, Boolean, Byte, ByteBuffer, Calendar, Character, CharBuffer, Charset, ClientInfoStatus, CollationKey, Component.BaselineResizeBehavior, CompositeName, CompoundName, Date, Date, Desktop.Action,String .....很多~
    但是Object类 只有.equals(),没compareTo
    Object是根类,它有的方法,其他类都可以继承,使用.所以.equals 基本随时能用.

    /** 
    * 实现Comparable接口,重写compareTo方法,返回值1,0,-1 
    * 覆写compareTo方法就是重建排序规则 
    */ 
    public int compareTo(Object obj) { 
    Person p = (Person) obj; 
    if (p.score > this.score) { 
    return 1; 
    } else if (p.score < this.score) { 
    return -1; 
    } else { 
    // 如果成绩相等则判断年龄 
    if (p.age > this.age) { 
    return 1; 
    } else if (p.age < this.age) { 
    return -1; 
    } else { 
    return 0; 
    } 
    } 
    }

    1. ==    : 基本数据类型都用这个比较,
    Java里面包含8个基本数据类型,分别是:
    boolean、byte、char、short、int、float、double、long
    注意String 可不属于基本数据类型,它是个类...
    
    2..equals() 用于引用数据类型(除了上面的8个,都是引用数据类型,包括封装类,Object子类等),  比较是否指向相同的对象, 
    例如 String str = "abc";
     等效于: char data[] = {'a', 'b', 'c'};  String str = new String(data); 
    就是str 指向了  new String(data) 这个对象. 如果再有其他变量也指向这个对象,他们比较的结果就返回true;
    由于此方法在Object里, 所以它有很多重写, 具体要看说明;
    另外``` equalsIgnoreCase()可以忽略大小写; 
    
    
    Object和String的equals()实现存在区别,所以上面的例子不太友好。有demo在最后
    
    
    3. compareTO可以比较两个字符串并且得到顺序.
    按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。


    String类 equals和compareTo源码分析:

    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;
      }
    
      public int compareTo(String anotherString) {
      int len1 = count;
      int len2 = anotherString.count;
      int n = Math.min(len1, len2);
      char v1[] = value;
      char v2[] = anotherString.value;
      int i = offset;
      int j = anotherString.offset;
    
      if (i == j) {
      int k = i;
      int lim = n + i;
      while (k < lim) {
      char c1 = v1[k];
      char c2 = v2[k];
      if (c1 != c2) {
      return c1 - c2;
      }
      k++;
      }
      } else {
      while (n-- != 0) {
      char c1 = v1[i++];
      char c2 = v2[j++];
      if (c1 != c2) {
      return c1 - c2;
      }
      }
      }
      return len1 - len2;
      }


    object 的默认equals实现:

    public boolean equals( Object o2 )
    {
       this == o2;
    }


  • 相关阅读:
    Best Time to Buy and Sell Stock
    Remove Nth Node From End of List
    Unique Paths
    Swap Nodes in Pairs
    Convert Sorted Array to Binary Search Tree
    Populating Next Right Pointers in Each Node
    Maximum Subarray
    Climbing Stairs
    Unique Binary Search Trees
    Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637153.html
Copyright © 2011-2022 走看看