obj.hashCode()
返回一个值。这个哈希码在编程中有什么用途?hashCode()
方法被用于 HashMap
, HashTable
, HashSet
等实现了哈希算法的容器中,以对元素进行分桶。
hashCode()
返回的值被作为桶编号,用于存储集合/映射中的元素,该桶编号即为元素在集合/映射中的地址。
当调用contains()
方法时,它会获取元素的哈希码,然后找到哈希码指向的桶。如果有多个元素在同一个桶中(多个对象可以拥有相同的哈希码),则使用equals()
方法判断这些对象是否相等,并决定contains()
方法的返回值是真还是假,或者决定是否将元素添加到集合中。
equals()
进行评估。那么,如果只找到一个哈希码匹配的元素,它会直接返回true吗?但是由于多个对象可以具有相同的哈希码,因此必须运行equals()
来评估匹配的元素是否相等,否则可能会给您带来意外的结果,我是对的吗? - SaorikidohashCode()
方法? - Cardinal System来自Java文档:
返回对象的哈希码值。这个方法是为了哈希表(如
java.util.Hashtable
提供的哈希表)的效益而支持的。
hashCode
的一般合同是:
在Java应用程序执行期间,每当它在同一对象上被多次调用时,
hashCode
方法必须始终一致地返回相同的整数,前提是等于比较中使用的信息未被修改。这个整数不需要在一个应用程序的多个执行之间保持一致。如果两个对象根据
equals(Object)
方法相等,则调用这两个对象上的hashCode
方法必须产生相同的整数结果。如果两个对象根据
equals(java.lang.Object)
方法是不相等的,则并不要求调用这两个对象上的hashCode
方法必须产生不同的整数结果。然而,程序员应该意识到为不相等的对象生成不同的整数结果可能会提高哈希表的性能。尽可能实用,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但这种实现技术不是Java编程语言所要求的。)
hashCode()
是一个接受对象并输出数字值的函数。如果对象不发生更改,则对象的哈希码始终相同。
需要存储对象的类,如HashMap
、HashTable
、HashSet
等,将使用hashCode
取模它们内部数组的大小来选择要存储对象的"内存位置"(即数组位置)。
有些情况下可能会发生哈希码冲突(两个对象具有相同的哈希码),这当然需要小心地解决。
hashCode()
方法返回的是对象的哈希码,也就是对象在内存中的十六进制地址。按照定义,如果两个对象是相等的,它们的哈希码也必须相等。如果你重写了
equals()
方法,这会改变两个对象之间的比较方式,从而使得Object类提供的hashCode()
实现不再有效。因此,如果你重写了equals()方法,那么必须同时重写hashCode()
方法。
这是一个哈希码。它是一种从对象中获取数字以便在Hashtable中存储的方法。在Java中,哈希码可以是任何整数,每种对象类型都负责生成自己的哈希码。查询Object的“hashCode”方法。
来源 - 此处
虽然哈希码对您的业务逻辑没有任何作用,但在大多数情况下,我们都需要注意它。因为当您的对象被放入基于哈希的容器(HashSet
,HashMap
等)时,容器会放置/获取元素的哈希码。
hashCode()
是由JVM为每个对象创建生成的一个唯一代码。
我们使用hashCode()
执行一些哈希相关算法的操作,如Hashtable、Hashmap等。
hashCode()
的优点使搜索操作变得容易,因为当我们搜索具有唯一代码的对象时,它有助于找到该对象。
但我们不能说hashCode()
是对象的地址。它是JVM为每个对象生成的唯一代码。
这就是为什么现在哈希算法是最流行的搜索算法的原因。
hashCode() 的一个用途是构建捕获机制。看看这个例子:
class Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
if (x != point.x) return false;
return y == point.y;
}
@Override
public int hashCode()
{
int result = x;
result = 31 * result + y;
return result;
}
class Line
{
public Point start, end;
public Line(Point start, Point end)
{
this.start = start;
this.end = end;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Line line = (Line) o;
if (!start.equals(line.start)) return false;
return end.equals(line.end);
}
@Override
public int hashCode()
{
int result = start.hashCode();
result = 31 * result + end.hashCode();
return result;
}
}
class LineToPointAdapter implements Iterable<Point>
{
private static int count = 0;
private static Map<Integer, List<Point>> cache = new HashMap<>();
private int hash;
public LineToPointAdapter(Line line)
{
hash = line.hashCode();
if (cache.get(hash) != null) return; // we already have it
System.out.println(
String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
++count, line.start.x, line.start.y, line.end.x, line.end.y));
}