Android 面试面试题

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

2019-02-13  本文已影响81人  perry_Fan

较好的回答版本:
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。
小结:

对于 ==
对于 equlas 本意是 比较两个对象的 content 是否相同。
那么hashcode呢?

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

在 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是系统用来快速检索对象而使用。

上一篇 下一篇

猜你喜欢

热点阅读