==、equals、hashcode

==和equals区别

  • ==用于基本数据类型,比较的是值,用于引用类型,比较的是对象的内存地址。
  • java中只有值传递,因此对于引用类型,实际比较的引用的内存地址的值。
  • equals不能用来判断基本数据类型,只能判断引用数据类型,判断两个对象是否相等。
java 复制代码
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
System.out.println(aa == bb);// true
System.out.println(a == b);// false
System.out.println(a.equals(b));// true
System.out.println(42 == 42.0);// true

hashcode

  • 把输入的值经过哈希算法得出哈希码,即散列码,用来确定对象在哈希表的索引位置。
  • hashCode() 定义在 JDK 的 Object 类中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。另外需要注意的是:ObjecthashCode() 方法是本地方法,也就是用 C 语言或 C++ 实现的。

为什么JDK同时提供hashCode()equals()方法

hashCode()equals()都是用于比较两个对象是否相等。

  • 为什么 JDK 还要同时提供这两个方法呢?
    这是因为在一些容器(比如 HashMapHashSet)中,有了 hashCode() 之后,判断元素是否在对应容器中的效率会更高(参考添加元素进HashSet的过程)!
    我们在前面也提到了添加元素进HashSet的过程,如果 HashSet 在对比的时候,同样的 hashCode 有多个对象,它会继续使用 equals() 来判断是否真的相同。也就是说 hashCode 帮助我们大大缩小了查找成本。
  • 为什么不只提供 hashCode() 方法呢?
    这是因为两个对象的hashCode 值相等并不代表两个对象就相等。
  • 那为什么两个对象有相同的 hashCode 值,它们也不一定是相等的?
    因为 hashCode() 所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的 hashCode )。
相关推荐
金銀銅鐵18 分钟前
[Java] 以 IntStream 为例,浅析 Stream 的实现
java·后端
曳渔1 小时前
UDP/TCP套接字编程简单实战指南
java·开发语言·网络·网络协议·tcp/ip·udp
hqxstudying2 小时前
JAVA项目中邮件发送功能
java·开发语言·python·邮件
最初的↘那颗心2 小时前
Java HashMap深度解析:原理、实现与最佳实践
java·开发语言·面试·hashmap·八股文
小兔兔吃萝卜2 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
亲爱的马哥2 小时前
重磅更新 | 填鸭表单TDuckX2.9发布!
java
Java中文社群2 小时前
26届双非上岸记!快手之战~
java·后端·面试
whitepure2 小时前
万字详解Java中的面向对象(二)——设计模式
java·设计模式
whitepure3 小时前
万字详解Java中的面向对象(一)——设计原则
java·后端
2301_793086873 小时前
SpringCloud 02 服务治理 Nacos
java·spring boot·spring cloud