zoukankan      html  css  js  c++  java
  • 比较运算符compareTo()、equals()、==之间的区别

     

    前言

    首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类):

    equals:是否同一个对象实例。注意,是“实例”。比如String s = new String("test");  s.equals(s), 这就是同一个对象实例的比较;

    等号(==):对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例;又可以说是判断对象实例是否物理相等;

    Hashcode:我觉得可以这样理解:并不是对象的内存地址,而是利用hash算法,对对象实例的一种描述符(或者说对象存储位置的hash算法映射)——对象实例的哈希码。

     

    按照约定,equals要满足以下规则:
    自反性:  x.equals(x) 一定是true

    对null:  x.equals(null) 一定是false

    对称性:  x.equals(y)  和  y.equals(x)结果一致

    传递性:  a 和 b equals , b 和 c  equals,那么 a 和 c也一定equals。

    一致性:  在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。

    一、== 和 equals的区别:

     ==主要是两个变量值的比较,返回值为true 或者是false。对于普通变量,如:int a=10; int  b= 10; a==b,返回为 true。

    而对于下面情况:

    String  a=new String("abc");

    String  b=new String("abc");

    String  c=a

    String d="abc";

    String f="abc";

    a==b; 返回的则是一个false。这是因为,对于对象的比较是对对象引用的比较,对于a和b ,他们在内存中对应的地址是不一样的

    c==a 返回的值是一个true,c引用了a,内存地址一样的

    d==f  返回的值是一个ture,因为 d,f 在编译期放进了字符串常量池中,d,f都引用了字符串池的“abc”

    a==f 返回的值是一个false,a和f引用的内存地址不一样

    ==操作符并不涉及对象内容的比较。若要对对象内容进行比较,则用equals. 如果 在本例中,a.equals(b)则返回是一个true值。

    总而言之:==是对对象地址的比较,而equals是对对象内容的比较。对于基本数据类型,一般用==,而对于字符串的比较,一般用equals

    二、对于compareTo(), 在API中,Java.lang包下面的基本数据类型的封装类都提供了该方法,如 Integer,Float,Byte,Short,Character 等

      compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序)
    1、如果字符串相等返回值0
    2、如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值前字符串的值小于后字符串,正值前字符串大于后字符串)
    3、如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度. 
    例: 
    String s1 = "abc"; 
    String s2 = "abcd"; 
    String s3 = "abcdfg"; 
    String s4 = "1bcdfg"; 
    String s5 = "cdfg"; 
    System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1) 
    System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3) 
    System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48) 
    System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)

  • 相关阅读:
    20个设计精致的用户界面 PSD 源文件免费下载
    Mergely – 免费的在线文档对比和合并工具
    你应该知道的10个奇特的 HTML5 单页网站
    One Page Scroll – 实现苹果风格的单页滚动效果
    学习如何制作 404 错误页面的15个最佳案例
    Rainyday.js – 傻眼了!竟然有如此逼真的雨滴效果
    Lo-Dash – 替代 Underscore 的优秀 JS 工具库
    30个实用的 Photoshop 动作《免费下载》
    Wrangle – 响应式的,触摸友好的多选插件
    经典案例:那些让人赞不绝口的创新 HTML5 网站
  • 原文地址:https://www.cnblogs.com/hqlong/p/6722138.html
Copyright © 2011-2022 走看看