2

我已经被这个问题困住了几个小时了。我已经注释掉了所有认为这与数组越界有关的代码,但这仍在发生。我正在尝试使用扫描仪从文件中读取输入,存储数据并稍后使用哈希码获取该数据。但是散列值不断变化。

public static void main(String[] args)
{
    //only prior code is to access data
    char arr[] = new char[25];
    arr = readString.toCharArray();
    int y;
    y = hash(arr);
}

public static int hash(char[] arr)
{
    int get = arr.toString().hashCode();
    System.out.println(y);
    return get; 
}

对于文件,即使每一行都有相同的内容,仍然存在这个问题

你好
你好
你好

我已经注释掉了所有其他函数,除了获取数据并对其进行哈希处理,但不确定为什么哈希码具有不同的值。我是否错误地使用了哈希码?还有另一种方法可以做到这一点吗?

编辑*当我在主要功能内对字符串进行哈希处理时,值始终相同,但我检索的值从未相同。

4

3 回答 3

7

问题是这一行:

   int get = arr.toString().hashCode();

您期望 arr.toString() 返回 char[] 中的字符串。它没有。

Object.toString()

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:getClass().getName() + '@' + Integer.toHexString(hashCode())

所以 arr.toString() 返回类似 "[C@3e25a5" 的东西,它的值每次都会改变,因此 hashCode() 也会改变。

于 2012-04-30T19:42:53.757 回答
1

您必须使用 Arrays.toString(arr) 而不是 arr.toString()

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#toString(char[])

于 2012-04-30T19:44:39.523 回答
0

Yes this is going to print out the same thing every time. Your method is printing the hashCode of key, which is not a function parameter. So presumably you've defined this somewhere in code you haven't shown us... why should its hashCode change?

于 2012-04-30T19:39:01.103 回答