Java 是否使用String hashCode()方法?
从链接: 但是我不能理解hashcode 下面是一个例子:Java 是否使用String hashCode()方法?,java,string,java-7,hashcode,java-8,Java,String,Java 7,Hashcode,Java 8,从链接: 但是我不能理解hashcode 下面是一个例子: public class StringDemo { public static void main(String args[]){ String strob1="first string"; System.out.println(strob1.hashCode()); } } 这个简单的程序给了我输出:-5468287 谁能告诉我: 它如何给我输出:-5468287?Ha
public class StringDemo {
public static void main(String args[]){
String strob1="first string";
System.out.println(strob1.hashCode());
}
}
这个简单的程序给了我输出:-5468287
谁能告诉我:
它如何给我输出:
-5468287
?Hashcode用于允许对象存储在映射
对象中(或与使用哈希的其他数据结构一起)。hashcode的目标是为具有不同值的对象提供唯一值,但如果对象相同,则生成相同的hashcode。这本质上是要查找的对象的唯一索引
实现Map
接口的HashMap
依赖于hashcode()
的良好实现,以便在不同的对象之间均匀分布以获得最佳性能。这样,它可以为诸如get()
之类的操作提供O(1)个平均案例速度
因此,如果您打算使用自定义对象作为HashMap
的键,那么您应该提供hashcode()
的实现,大多数IDE都会为您提供帮助
编辑:在您的示例输出-5468287
中,这是它的hashcode值。如果您查看仅相差一个字符的“first strings”
的hashcode,它应该是一个非常不同的数字,这是一件好事,因为它有助于在地图中均匀分布对象。hashcode用于允许对象存储在地图
对象中(或与使用哈希的其他数据结构一起). hashcode的目标是为具有不同值的对象提供唯一值,但如果对象相同,则生成相同的hashcode。这本质上是要查找的对象的唯一索引
实现Map
接口的HashMap
依赖于hashcode()
的良好实现,以便在不同的对象之间均匀分布以获得最佳性能。这样,它可以为诸如get()
之类的操作提供O(1)个平均案例速度
因此,如果您打算使用自定义对象作为HashMap
的键,那么您应该提供hashcode()
的实现,大多数IDE都会为您提供帮助
编辑:在您的示例输出-5468287
中,这是它的hashcode值。如果你看一下“first strings”(第一个字符串)的hashcode(只有一个字符不同),它应该是一个非常不同的数字,这是一件好事,因为它有助于在地图中均匀分布对象。本质上,你不会自己调用它,除非你正在编码一个数据结构(你很可能不需要这样做)
但是,您通常会实现一个。现在几乎所有的IDE都提供自动生成equals和hashCode。我建议暂时使用它;无论何时实现equals,都要生成一个hashCode实现。本质上,除非您正在编写一个数据结构(您很可能不需要这样做),否则您不会自己调用它
但是,您通常会实现一个。现在几乎所有的IDE都提供自动生成equals和hashCode。我建议暂时使用它;无论何时实现equals,都要生成一个hashCode实现。为什么?该方法在java.lang.Object中定义。您定义的任何类都将继承它
参考
什么?我建议你多研究一下什么是散列 为什么?该方法在java.lang.Object中定义。您定义的任何类都将继承它
参考
什么?我建议你多研究一下什么是散列 字符串的计算公式为:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int
算术,其中s[i]
是字符串的第i
个字符,n
是字符串的长度,^
表示幂运算。(空字符串的哈希值为零。)
因此,该整数计算的溢出很容易发生,根据以下公式,结果为负:
如果整数加法溢出,则结果为低阶
以足够大的数值表示的数学和的位数
二补格式。如果发生溢出,则
结果与两者的数学和的符号不同
操作数值
字符串的计算公式为:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int
算术,其中s[i]
是字符串的第i
个字符,n
是字符串的长度,^
表示幂运算。(空字符串的哈希值为零。)
因此,该整数计算的溢出很容易发生,根据以下公式,结果为负:
如果整数加法溢出,则结果为低阶
以足够大的数值表示的数学和的位数
二补格式。如果发生溢出,则
结果与两者的数学和的符号不同
操作数值
源代码可以在线或在您的JDK安装中获得。您是否只是混淆了哈希代码的用途?我看了看发现:我能理解为什么的问题,但在哪里?当然,在String.hashCode
中,还有其他地方。源代码可以在线或在您的JDK安装中获得。您是否只是混淆了hash代码的一般用途?我看了看发现:我能理解为什么的问题,但在哪里?当然,在String.hashCode
中,还有其他地方。hashCode
方法适用于使用散列的任何数据结构,而不仅仅是Map
。任何使用哈希表的数据结构都使用哈希,还有其他使用哈希的结构,比如哈希trie。或者任何其他情况下,您希望能够快速消除两项相等的可能性,而无需检查每个成员。@AJMansfield a