Java 使用hashcode函数初始化

Java 使用hashcode函数初始化,java,hashcode,Java,Hashcode,我想检查上述代码中是否正确使用了hashcode函数。我注意到map有一些奇怪的null和0值,而不是{1,2,3} public class Test { public static void main(String[] args) { int[] array = {1,2,3}; Map<Row, Integer> map = map(array); } static class Row extends Object { private in

我想检查上述代码中是否正确使用了
hashcode
函数。我注意到
map
有一些奇怪的null和0值,而不是{1,2,3}

public class Test {

public static void main(String[] args) {
    int[] array = {1,2,3}; 
    Map<Row, Integer> map = map(array);
}

static class Row extends Object {
        private int value;
        private volatile int hashCode = 0;

        public Row(int val) {
            this.value = val;
        }

        @Override
        public boolean equals(Object obj) {
            if(this == obj)
                return true;
            if((obj == null) || (obj.getClass() != this.getClass()))
                return false;
            // object must be Row at this point
            Row row = (Row)obj;
                return (value == row.value);
        }

        @Override
        public int hashCode () {
            final int multiplier = 7;
            if (hashCode == 0) {
                int code = 31;
                code = multiplier * code + value;
                hashCode = code;
            }
            return hashCode;
        }
    }

    private static Map<Row, Integer> map(int[] array) {
          Map<Row, Integer> arrayMap = new HashMap<Row, Integer>();
          for (int i=0; i<array.length; i++)
                arrayMap.put(new Row(array[i]), i);
          return arrayMap;
    }
}
公共类测试{
公共静态void main(字符串[]args){
int[]数组={1,2,3};
Map=Map(数组);
}
静态类行扩展对象{
私有int值;
私有易失性int hashCode=0;
公共行(int val){
this.value=val;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
如果((obj==null)| |(obj.getClass()!=this.getClass())
返回false;
//对象在此点必须是行
行=(行)对象;
返回值(值==行值);
}
@凌驾
公共整数哈希代码(){
最终整数乘数=7;
if(hashCode==0){
整数代码=31;
代码=乘数*代码+值;
hashCode=代码;
}
返回哈希码;
}
}
私有静态映射(int[]数组){
Map arrayMap=newhashmap();

对于(int i=0;i您到底遇到了什么问题?如果我将
toString
方法添加到
类中:

@Override
public String toString() {
    return Integer.toString(value);
}
然后打印地图:

public static void main(String[] args) {
    int[] array = { 1, 2, 3 };
    Map<Row, Integer> map = map(array);
    System.out.println(map);
}
publicstaticvoidmain(字符串[]args){
int[]数组={1,2,3};
Map=Map(数组);
系统输出打印项次(map);
}

它打印:
{3=2,1=0,2=1}
。这似乎是正确的。

您到底有什么问题?如果我向
类添加
toString
方法:

@Override
public String toString() {
    return Integer.toString(value);
}
然后打印地图:

public static void main(String[] args) {
    int[] array = { 1, 2, 3 };
    Map<Row, Integer> map = map(array);
    System.out.println(map);
}
publicstaticvoidmain(字符串[]args){
int[]数组={1,2,3};
Map=Map(数组);
系统输出打印项次(map);
}

它打印:
{3=2,1=0,2=1}
。这似乎是正确的。

您的hashCode在我看来是正确的,除了值字段应该是最终的,以使类不可变,从而保证线程安全,但它太复杂了。
只是int值的包装。hashCode
可以简化为:

return this.value;

或者您可以完全避免使用
类,并使用
整数
来包装int值。

您的hashCode在我看来是正确的,只是value字段应该是最终的,以使类不可变,从而保证线程安全,但它太复杂了。
只是int值的包装器。
hashCode可以减少为:

return this.value;

或者你可以完全避免使用
类,使用
整数
来包装你的int值。

我看不出上面的代码有任何缺陷。为什么不包括你用来查看空值和零值的代码,并向我们展示该代码的确切输出?(“一些奇怪的空值和零值”有点模糊,你不觉得吗?)更好的是,你为什么不把它转换成一个函数,这样我们就可以自己尝试一下呢?我看不出上面的代码有任何缺陷。你为什么不把用来查看空值和零值的代码包括进来,并向我们展示代码的确切输出?(“一些奇怪的空值和零值”有点模糊,你不觉得吗?)更好的是,为什么不将其转换为一个函数,以便我们可以自己尝试呢?我正在解决此处描述的问题:。而代码工作不正常。我执行了调试,得出结论认为hashcode函数有问题。我正在解决此处描述的问题:。而代码工作不正常。我执行了以下操作:d调试并得出结论,hashcode函数有问题。