面试三

== 操作符

基本类型比较:当用于比较基本数据类型(如 int、char、float 等)时,== 比较的是两个变量的值是否相等。
引用类型比较:当用于比较引用数据类型(如对象)时,== 比较的是两个变量的内存地址是否相同,即它们是否指向堆内存中的同一个对象实例。

equals() 方法

内容比较:equals() 方法用于比较两个对象的内容是否相等。默认情况下(如在 Object 类中定义的 equals() 方法),equals() 方法的行为与 == 操作符相同,即比较对象的内存地址。但是,许多类(如 String、Integer 等封装类)在继承 Object 类时重写了 equals() 方法,以提供基于对象内容的比较逻辑。
可重写:equals() 方法可以被任何类重写,以实现自定义的相等性逻辑。重写 equals() 方法时,通常也需要重写 hashCode() 方法,以保持 equals() 和 hashCode() 之间的一致性契约

点击查看代码
String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1 == str2);          // 输出 false
System.out.println(str1.equals(str2));     // 输出 true

如果 equals() 是 true,hashCode() 是否相等?

是的,如果两个对象根据 equals() 方法被认为是相等的,那么它们的 hashCode() 方法必须返回相同的整数值。这是 Java 中 hashCode() 方法的一般约定,确保对象可以被正确地存储和检索在基于哈希的集合中,如 HashSet、HashMap、Hashtable 等。

这个约定在 Object 类的文档中被明确说明:如果两个对象通过 equals() 方法比较相等,那么调用每个对象的 hashCode() 方法都必须产生相同的整数结果。

如果 hashCode() 相等,equals() 是否为 true?

不一定。如果两个对象的 hashCode() 方法返回相同的值,它们并不一定是相等的(即 equals() 方法不一定返回 true)。相同的哈希码可能来自不同的对象——这种情况称为哈希冲突。哈希冲突是哈希表背后的数据结构在设计时就已经考虑到的问题,并且有相应的解决机制来处理冲突。

因此,两个对象的哈希码相同只能说明这两个对象在哈希表中的同一个桶(bucket)里,但它们可能是不同的对象。在使用哈希表时,通常首先通过哈希码来确定桶的位置,然后在该桶中通过 equals() 方法来查找具体的对象,以此来解决哈希冲突问题。

posted @ 2024-04-10 10:14  充满希望与信心  阅读(13)  评论(0)    收藏  举报