• 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;
    }


  • 相关阅读:
    update语句更新多条记录, 标记下
    点击超链接从VSTF、SVN及文件共享服务器上下载文件
    批量插入数据, 将DataTable里的数据批量写入数据库的方法
    SqlServer规范, 标记下
    学习笔记Mysql操作总结
    今拾到了个联合查询, 琢磨了好几个小时, 标记一下
    【读书笔记】 拜读潘加宇的《软件方法》一书的摘抄(上)
    关于引用类型的 ref 传参操作
    sed 正则表达式处理日志
    各省市个税计算器
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637153.html
Copyright © 2020-2023  润新知