java - compare() 和 compareTo() 方法是否使用哈希码来比较 java 中的字符串或对象?
问题描述
有人告诉我, java 中可比较和比较器接口的compare() 和 compareTo()方法使用哈希码来比较 java 中的字符串或对象。
我没有找到任何相关的证据。
所以主要问题是这两种方法在内部使用什么来比较对象
从理论上讲,我对哈希码的了解是:
Java 对象的哈希码只是一个数字,它是 32 位有符号整数,它允许对象由基于哈希的数据结构管理。我们知道哈希码是JVM分配给一个对象的唯一ID号。但实际上,哈希码并不是一个对象的唯一编号。如果两个对象相等,那么这两个对象应该返回相同的哈希码。所以我们必须实现一个类的 hashcode() 方法,如果两个对象相等,即通过该类的 equal() 方法进行比较,那么这两个对象必须返回相同的哈希码。如果您要覆盖 hashCode ,则还需要覆盖 equals 方法。
解决方案
compare
并compareTo
处理在 Java 中称为自然排序的东西。通常这意味着像在现实世界中那样对事情进行排序:字符串(a
按z
字典顺序)、数字从小到大等。有关该主题的更多信息:https ://docs.oracle.com/javase/8/docs/api/java /lang/Comparable.html
你可能听到的——快速而肮脏的 hack 放入MyClass
一个TreeMap
可以写的人中
class MyClass implements Comparable<MyClass> {
// ...
@Override
public int compareTo(MyClass other) {
// Dirty hack, don't use!
return Integer.compare(hashCode(), other.hashCode());
}
}
虽然这可能有效,但我不建议compareTo()
这样写。
推荐阅读
- windows - 批处理文件填充文件名 0(零)到子文件夹中的特定长度 - 工作根目录,而不是子目录
- r - 更改 R 小标题中左上角“单元格”的名称
- c# - JWT Authentication,Authorize 属性中定义的角色被忽略
- reactjs - Fabric/Fluent UI 详细信息列表:单击标题时突出显示列
- html - 单击时引导汉堡菜单不应用背景
- powershell - 我在批处理脚本中验证计算机 AD 组成员身份时遇到问题,空白输出
- javascript - React Native - 直接在父组件上设置子组件的状态
- c# - VS2019 中缺少 SQL 表下拉列表
- ubuntu - 仅在加载配置后,我的 Lubuntu 安装黑屏。如何从恢复模式终端修复它?
- python - 如何在每一轮中使用 PIL 添加带有 4 个图像的 GUI