在Java中,obj.hashCode()
返回一些值。此哈希码在编程中有什么用?
在Java中,obj.hashCode()
返回一些值。此哈希码在编程中有什么用?
Answers:
hashCode()
用于铲装在Hash
实现喜欢HashMap
,HashTable
,HashSet
等。
从中接收的值hashCode()
用作存储集合/映射元素的存储桶编号。该存储桶编号是集合/映射中元素的地址。
完成后contains()
,它将获取元素的哈希码,然后查找哈希码指向的存储桶。如果在同一存储桶中找到了多个元素(多个对象可以具有相同的哈希码),则它将使用该equals()
方法来评估对象是否相等,然后确定contains()
是对还是假,或者确定元素是否可以为是否添加到集合中。
equals()
进行求值”,那么,如果仅找到一个与哈希码匹配的元素,它将直接返回true怎么办?但是由于多个对象可以具有相同的哈希码,因此必须运行该对象才能equals()
评估匹配的元素是否相等,否则可能会给您带来意外的结果,对吗?
hashCode()
方法?
从Javadoc:
返回对象的哈希码值。支持此方法是为了使哈希表受益,例如
java.util.Hashtable
。的总合同
hashCode
为:
在Java应用程序执行期间,只要在同一对象上多次调用它,该
hashCode
方法就必须始终返回相同的整数,前提是不修改该对象的equals比较中使用的信息。从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。如果根据该
equals(Object)
方法两个对象相等,则hashCode
在两个对象中的每个对象上调用该方法必须产生相同的整数结果。它不要求,如果两个对象根据是不相等的
equals(java.lang.Object)
方法,然后调用hashCode
在每个两个对象的方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是Java编程语言不需要此实现技术。)
返回的值
hashCode()
是对象的哈希码,它是对象的内存地址(十六进制)。根据定义,如果两个对象相等,则它们的哈希码也必须相等。如果重写该
equals()
方法,则会更改两个对象的相等方式,并且Object的实现hashCode()
不再有效。因此,如果重写equals()方法,则还必须重写该hashCode()
方法。
甲哈希码是从任何对象生成的数字。
这就是允许将对象快速存储/检索到哈希表中的原因。
想象下面的简单示例:
在你面前的桌子上。您有9个盒子,每个盒子都标有1到9的数字。在这些盒子中还可以存储一堆完全不同的对象,但是一旦它们放在那里,您就需要尽快找到它们。
您需要的是一种立即确定将每个对象放入哪个盒子的方法。它的工作原理类似于索引。您决定找到卷心菜,因此您要查找卷心菜所在的盒子,然后直接去那个盒子拿它。
现在想像一下,您不想打扰索引,而是希望能够从对象中立即找到它所在的盒子。
在示例中,让我们使用一种非常简单的方法进行操作-对象名称中的字母数。因此,白菜在方框7中进入,豌豆在方框3中进入,火箭在方框6中进入,班卓琴在方框5中以此类推。
那犀牛呢?它有10个字符,因此我们将略微更改算法并“环绕”,以便在框1中放入10个字母的对象,在框2中放入11个字母,依此类推。那应该覆盖任何物体。
有时候,一个盒子里有不止一个物体,但是如果您要寻找火箭,比较花生和火箭要比检查一大堆白菜,豌豆,班卓琴和犀牛要快得多。
那是一个哈希码。一种从对象获取数字以将其存储在哈希表中的方法。在Java中,哈希码可以是任何整数,每种对象类型都负责生成自己的整数。查找对象的“ hashCode”方法。
来源- 这里
hashCode()的用途之一是建立Catching机制。看这个例子:
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));
}
hashCode()
是由JVM为每次对象创建生成的唯一代码。
我们用来hashCode()
对哈希相关的算法(例如Hashtable,Hashmap等)执行一些操作。
hashCode()
使搜索操作容易的优势,因为当我们搜索具有唯一代码的对象时,它有助于发现该对象。
但是我们不能说hashCode()
是对象的地址。它是JVM为每个对象生成的唯一代码。
这就是为什么哈希算法是当今最受欢迎的搜索算法。