2011-08-08 41 views
4

唯一有趣的是,为什么hashCode()在java.lang.String中不是静态的? 而且在空返回的情况下,例如-1? 由于经常需要做somethihg,如:Java String hashCode为空字符串

String s; 
............. 
if (s==null) { 
    return 0;} 
else { 
    return s.hashCode(); 
} 

感谢。

+0

如果是静态的,它不会是一个非常有用的散列。 (并且注意hashCode是Object的一个方法。) –

+0

(当然,你可以编写你自己的静态myHash方法来检查它的参数为null。) –

+1

'static int hashCodeOf(Object o){return(o!= null )? o.hashCode():0; }' – oliholz

回答

14

正如其他人已经注意到的hashCodeObject上的方法,并且是非静态的,因为它固有地依赖(即属于)对象/实例。

注意,Java 7中引入了Objects类,它有hashCode(Object)方法,它正是你想要的:返回o.hashCode()如果o非空或0其他。

该课程还有其他方法处理可能的值,例如equals(Object, Object),toString(Object)等。

1

它返回的hashCode不是一个类Object

7

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

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

+1

错误:如果沿着非静态[String.hashCode()]提供静态'hashCode(String)'(http://docs.oracle.com/javase/7/docs/api/java/lang /String.html#hashCode%28%29),可以像这样调用'String.hashCode(“1”)',或者如果忽略警告''2“.hashCode(”1“)'。这两个调用都会返回相同的值。 –

+0

@bernardpaulus但问题不是关于'hashCode(String)',而是关于'hashCode()'(未参数化)。 – amit

+0

一个没有参数的静态'String.hashCode()'没有多大意义(甚至不应该编译,因为它不能重载[Object.hashCode()](http://docs.oracle.com/javase/7/docs /api/java/lang/Object.html#hashCode%28%29))。另外,'foo()'表示法通常用于指示'foo'是一个函数,而不指定参数。 –

2

因为String的哈希码是该String的属性。

使用相同的思路,您可以使每种方法都是静态的。

2

hashCode用于获取对象的hashCode,以便知道该对象必须放置在哪个桶中。因此它必须是对象的一个​​实例方法,并且必须以多态方式调用它。

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

你似乎在使用hashCode来达到不同的目的,所以你必须以特定的方式来处理。