• 理解equals,==,hashcode,


    1.equals与==区别

    ==
    对于基本类型==就是比较值是否相等。
    对于引用类型就是比较是否指向同一个引用地址
    例题:

    package tree; 
    /** 
     * @author wangpei 
     * @version 
     *创建时间:2017年3月13日 下午2:33:56 
     * 类说明 
     */
    public class exercis {
    
        public static void main(String[] args) {
            int a=2;
            int b=2;
            String a1="1";//指向常量池中的一个常量值
            String b1="1";//指向常量池中的一个常量值
            String b2=new String("1");
            String b3=new String("1");
    
            System.out.println(a==b);
            System.out.println(a1==b1);
            System.out.println(a1==b2);//不同的引用值
            System.out.println(a1==b3);
        }
    
    }
    

    结果:

    true
    true
    false
    false

    equals

    equals是Object类的一个方法,返回的是该对象的引用值是否相等:

     public boolean equals(Object obj) {
            return (this == obj);
        }

    String 类对equals方法进行了覆盖(重写):

      public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }

    解释:当传入的对象anObject 与 要比较的对象指向同一个引用,返回true,不等时,判断anObject与比较的对象所存的值相等返回true,否则,返回false.
    也就是说,String对象对Object的equlas进行了重写,使其可以判断对象所存的值相等时,返回true
    例子:

    package tree; 
    /** 
     * @author wangpei 
     * @version 
     *创建时间:2017年3月13日 下午2:33:56 
     * 类说明 
     */
    public class exercis {
    
        public static void main(String[] args) {
    
            String a1="1";//指向常量池中的一个常量值
            String b1="1";
            String b2=new String("1");
            String b3=new String("1");
    
    
            System.out.println(a1==b3);
            System.out.println(b2==b3);
    
            System.out.println(a1.equals(b3));
            System.out.println(b2.equals(b3));
    
        }
    
    
    }
    

    结果:

    false
    false
    true
    true

    java对重写equals方法进行了一写规则限制:
    自反性(reflexive)
    对称性(symmetric)
    传递性(transitive)
    一致性(consistent)

    2.equals与hashcode区别
    hashcode,Object类的一个本地方法

    public native int hashCode();

    应用hashcode主要是解决对集合操作时的一些问题。
    例如对于HashSet,其元素不能出现重复值,每次添加新元素时,必须先查找是否元素已存在,如果这样挨个equals比较,当数据量大时,根本不实际。所以用到了hashcode,就是用来提高速度。
    java集合具体咋应用hashcode的

    1),判断两个对象的hashCode是否相等
    如果不相等,认为两个对象也不相等,完毕
    如果相等,转入2)
    (这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。)
    2),判断两个对象用equals运算是否相等
    如果不相等,认为两个对象也不相等
    如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
    注意:**equals比较为true的两个对象,hashcode一定相等。
    hashcde比较为true的两个对象,equals不一定相等**。

  • 相关阅读:
    NFS4.1规范研究:session
    散列冲突与作为特征值的散列
    使用Select的3个注意事项
    3个学习Socket编程的简单例子:TCP Server/Client, Select
    Gdb调试多进程程序
    Usage of pmake
    诡异的bug: tcsh陷入死循环
    【转】PowerDesigner 物理数据模型(PDM) 说明
    大批量文件处理的7条建议
    OLE DB、ODBC 和 Oracle 连接池 (ADO.NET)
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551225.html
Copyright © 2020-2023  润新知