美文网首页Android 面试面试题
1.Java中==和equals和hashCode的关联和区别

1.Java中==和equals和hashCode的关联和区别

作者: perry_Fan | 来源:发表于2019-02-13 22:33 被阅读81次

    较好的回答版本:
    https://blog.csdn.net/justloveyou_/article/details/52464440

    基本数据类型,== 比较的是值
    请解释字符串比较之中“==”和equals()的区别?

    ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;

    equals():比较的是两个字符串的内容,属于内容比较。

    public class StringDemo {
         public static void main(String args[]) {
             String str1 = "Hello";
             String str2 = new String("Hello");
             String str3 = str2; // 引用传递
             System.out.println(str1 == str2); // false
             System.out.println(str1 == str3); // false
             System.out.println(str2 == str3); // true
             System.out.println(str1.equals(str2)); // true
             System.out.println(str1.equals(str3)); // true
             System.out.println(str2.equals(str3)); // true
         }
     }
    
    
    String 内存地址.png

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

    若 str2 = str2.intern; 那么str1 == str2 str1.equals(str2) 都是true。
    小结:

    对于 ==
    • 若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的是否相等
    • 若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同。也就是说,若此时返回true,则该操作符作用的一定是同一个对象。
    对于 equlas 本意是 比较两个对象的 content 是否相同。
    那么hashcode呢?

    hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数。
    hashcode作用?
    如果想要将一个元素放到容器当中,想要知道是否重复如何判断呢?可以用equals来比较,那么如果有10000个元素呢?执行10000次equals方法吗?显然效率很低。Java应用到了hash表的原理,每次将要存入集合的元素进行一次哈希算法的算出一个值,然后根据该值计算出元素应该在数组中的位置,如果该位置上没有则放入,如果有则调用equals方法与新元素进行比较;相同的话就不存了,如果不相同则放入这个位置对应的链表中。

    • 概念 : Hash 就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出(int),该输出就是散列值。这种转换是一种 压缩映射,也就是说,散列值的空间通常远小于输入的空间。不同的输入可能会散列成相同的输出,从而不可能从散列值来唯一的确定输入值。简单的说,就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

    在 Java 中,由 Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数。(这是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧)。

    equals与hashcode
    原则 1 : 如果 x.equals(y) 返回 “true”,那么 x 和 y 的 hashCode() 必须相等 ;
    原则 2 : 如果 x.equals(y) 返回 “false”,那么 x 和 y 的 hashCode() 有可能相等,也有可能不等 ;
    原则 3 : 如果 x 和 y 的 hashCode() 不相等,那么 x.equals(y) 一定返回 “false” ;
    原则 4 : 一般来讲,equals 这个方法是给用户调用的,而 hashcode 方法一般用户不会去调用 ;
    原则 5 : 当一个对象类型作为集合对象的元素时,那么这个对象应该拥有自己的equals()和hashCode()设计,而且要遵守前面所说的几个原则。

    hashcode是系统用来快速检索对象而使用。

    相关文章

      网友评论

        本文标题:1.Java中==和equals和hashCode的关联和区别

        本文链接:https://www.haomeiwen.com/subject/styreqtx.html