Java中空字符串的哈希码是多少?

4
只是好奇,为什么java.lang.String中的hashCode()方法不是静态的?如果返回null怎么办,例如返回-1?因为经常需要做类似以下的事情:
String s;
.............
if (s==null) {
  return 0;}
else {
  return s.hashCode();
}

谢谢。

如果哈希是静态的,它将不会非常有用。(请注意,hashCode是Object类的一个方法。) - Hot Licks
(当然,您可以编写自己的静态myHash方法,检查其参数是否为null。) - Hot Licks
1
static int hashCodeOf( Object o ) { return (o != null) ? o.hashCode() : 0; } - oliholz
1
@oliholz:如果你这样做,请让它接受一个“Object”。 - Joachim Sauer
5个回答

15

正如其他人所指出的那样,hashCodeObject上的一个方法,并且它是非静态的,因为它本质上依赖于一个对象/实例。

请注意,Java 7引入了Objects类,该类具有hashCode(Object)方法,它恰好可以做到您想要的:如果o非空,则返回o.hashCode();否则返回0

此类还具有其他处理可能为空的值的方法,例如equals(Object, Object)toString(Object)和其他一些方法。


如果o非空,则返回o.hashCode(),否则返回0。你怎么能在null上调用hashCode()并得到0呢? - Helen Cui
@HelenCui:显然,你不能在null上调用hashCode。这就是为什么你要在名为Objects的类上调用静态方法,并传递可能为空的值:int hash = Objects.hashCode(aVariableThatMightBeNull)。如果变量确实为null,那么hash将为0,否则它将是其hashCode()方法返回的值。 - Joachim Sauer

8

因为如果是静态的"1".hashCode()"2".hashCode()会返回相同的值,这显然是错误的。

它是特定于实例的,并受其影响,因此不能是静态的。


1
如果提供了一个静态的hashCode(String),并且与非静态的String.hashCode()一起使用,它可以像这样被调用:String.hashCode("1"),或者,如果您忽略警告,"2".hashCode("1")。两个调用都将返回相同的值。 - bernard paulus
@bernardpaulus 但问题不是关于hashCode(String),而是关于未参数化的hashCode() - amit
一个无参的静态 String.hashCode() 并没有太多意义(甚至不应该编译,因为它不能重写 Object.hashCode())。此外,foo() 的表示法通常用于指示 foo 是一个函数,而不指定参数。 - bernard paulus

2

因为字符串的哈希码是该字符串的属性。

按照同样的思路,您可以使每个方法都静态化。


2

hashCode 方法用于获取对象的哈希码,以确定该对象在 HashMap 中应放置在哪个桶中。因此,它必须是对象的实例方法,并且必须以多态方式调用。

null 可以作为 HashMap 中的键使用,但它被视为一种特殊情况。

您似乎正在将 hashCode 用于不同的目的,因此必须以特定方式处理它。


1

它返回的是一个 Object 的哈希码,而不是一个类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接