哈希码与对象的引用或地址之间的区别?
在JavaME中,这三件事是无关的。
对象的 hashCode 是它的半唯一标识符。
对对象的引用是该对象的作用域句柄。
对象的地址(可能)无法获取,而且肯定没用。
对象的地址/引用指向对象在内存中所处的位置。
哈希码是通过哈希算法生成的,用于识别哈希集合中的对象。不同的算法会产生不同的代码(不好的算法会导致不好的哈希码和集合中更多的冲突)。
对象的哈希码和它在内存中的地址没有任何关系。只是对象的不同实现(实际上是不同的语言)使用对象的内存地址作为识别该对象的唯一方式。
一般来说,方法对
hashCode
和 equals
提供了比较对象同一性的方法。在实现您自己的散列方案时,您应该记住散列值应该由使对象唯一的东西组成。例如,假设您向数据库系统提供一个对象映射器并想要引入一个 Customer
对象 - 您知道在您的表中,客户的主键是唯一的,因此返回该主键作为哈希码将完全可以接受,并且与对象的内存地址没有任何关系。
如果使用名字、姓氏和出生日期来识别客户(这并不足以唯一地识别一个人,但为了简洁起见,让我们保持简单),那么您可以将这 3 个值散列成散列码,在您的 O/R 映射实现中使用它。
看到对象的哈希码和引用是两个不同的东西。你可以简单地说,对象的引用是你在内存中找到对象的路径(或者简称为对象在内存中的位置)。但哈希码是一个整数值,它告诉您的对象是否唯一,即它是否包含与内存中另一个对象相同的数据或具有不同的数据(唯一)。 看下面的代码,我们通过创建两个String类的对象来理解它:
String str = "StackOver";
String str2 = new String("StackOver");
System.out.println(str.hashCode());
System.out.println(str2.hashCode());
在此,将创建两个对象。由于两个对象位于内存中的不同位置,因此它们具有不同的引用,该引用将存储在 str 和 str2 中。但对象具有相同的值,因此它们将具有相同的哈希码。
注意:使用“new”关键字创建字符串对象将始终在内存中创建一个新对象,即使您有另一个具有相同值的字符串对象。