• 理解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不一定相等**。

  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551225.html
Copyright © 2020-2023  润新知