==、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 )。
相关推荐
程序员小凯14 分钟前
Spring Boot测试框架详解
java·spring boot·后端
豐儀麟阁贵20 分钟前
基本数据类型
java·算法
_extraordinary_1 小时前
Java SpringMVC(二) --- 响应,综合性练习
java·开发语言
程序员 Harry1 小时前
深度解析:使用ZIP流式读取大型PPTX文件的最佳实践
java
wxweven2 小时前
校招面试官揭秘:我们到底在寻找什么样的技术人才?
java·面试·校招
陈陈爱java2 小时前
新知识点背诵
java
失散132 小时前
分布式专题——39 RocketMQ客户端编程模型
java·分布式·架构·rocketmq
泽02022 小时前
Linux之环境变量
java·linux·redis
程序媛徐师姐3 小时前
Java基于SpringBoot的茶叶商城系统,附源码+文档说明
java·spring boot·java springboot·茶叶商城系统·java茶叶商城系统·茶叶·java茶叶商城
爱读源码的大都督3 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构