Java 是否使用String 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

从链接:

但是我不能理解hashcode

下面是一个例子:

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