标签: hashcode

Java HashMap无法正常工作

我想我做了所有事情,但HashMap.get返回null.hashCode返回相同的整数,equals返回true,key是不可变的,但现在仍在工作.

我错过了什么?

这是我的代码:

public enum MyEnum_1 `AA1, AA2, AA3, AA4`;
public enum MyEnum_2 `BB1, BB2, BB3, BB4`;

public void MyClass()
{
  ...
  final MyEnum_1 enum1;
  final MyEnum_2 enum2;

  public int hashCode()
  {
    return (enum1.ordinal() * 100 + enum2.ordinal());
  }
  public boolean equals(MyClass obj2)
  {
    if (obj2 == null) return false;
    else return (enum1.equals(obj2.getEnum1()) && enum2.equals(obj2.getEnum2()));
  }
...
}
...
Map<MyClass, MyOtherClass> mappp = new HashMap<MyClass, MyOtherClass>(); 
...
mappp.put(obj1, other_obj1);
MyClass obj2 = new MyClass(obj1.getEnum1(), obj1.getEnum2());

System.out.println("hashCode: " + (obj1.hashCode() == …
Run Code Online (Sandbox Code Playgroud)

java equals hashmap hashcode

-1
推荐指数
1
解决办法
1385
查看次数

默认的Object.toString()不附加hashCode()吗?

我在Airport.java有一个Enum类

package test;

public enum Airport {
    PHX,
    LAX,
    SFO,
    NRT,
    SIN;

    Airport() {
    }
}
Run Code Online (Sandbox Code Playgroud)

和Test.java中的Test类

package test;

public class Test {

    public static void main(String[] args) {
        Airport a = Airport.PHX;
        System.out.println(a);
        System.out.println(String.valueOf(a));
        System.out.println(a.name());
        System.out.println(a.toString());
        System.out.println(a.name() + '@' + Integer.toHexString(a.hashCode()));
    }

}
Run Code Online (Sandbox Code Playgroud)

这个输出是

PHX
PHX
PHX
PHX
PHX@15db9742
Run Code Online (Sandbox Code Playgroud)

但输出不应该

PHX
PHX
PHX
PHX@15db9742
PHX@15db9742
Run Code Online (Sandbox Code Playgroud)

根据Object API https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html,默认Object.toString()getClass().getName() + '@' + Integer.toHexString(hashCode())

java enums tostring hashcode

-1
推荐指数
1
解决办法
85
查看次数

我应该继续缩短我的equals和hashcode函数吗?

当我有这样的课程

public class MyClass {
    private ClassA classA;
    private ClassB classB;
}
Run Code Online (Sandbox Code Playgroud)

我的equals和hascode函数经常会像这样混乱

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((classB == null) ? 0 : classB.hashCode());
    result = prime * result + ((classA == null) ? 0 : classA.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false; …
Run Code Online (Sandbox Code Playgroud)

java equals hashcode

-1
推荐指数
1
解决办法
82
查看次数

在调用 Objects.hash() 之前是否需要检查值是否为空?

我有一个自定义对象,其属性包括可以是整数(例如Integer num1Integer num2null

对于 equal 函数,我通过执行 来确定 2 个自定义对象是否相等return num1 == customObj.num1 && num2 == customObj.num2。这工作 b/cnull == nulltrue在 Java 中。

所以我想知道在我的对象的哈希码函数中是否可以这样做return Objects.hash(num1, num2)

我只是不确定我是否可以将null对象传递给它Objects.hash(...),是否会以某种方式弄乱哈希码,或者我是否会得到NullPointerException.

java hash hashcode

-1
推荐指数
1
解决办法
2631
查看次数

在Optional中使用hashCode的目的是什么

有人可以解释为什么java人会覆盖hascodein 的目的Optional

java api-design hashcode optional java-8

-1
推荐指数
1
解决办法
180
查看次数

为什么以下三个字符串的哈希码是相同的?

在阅读了JDK的源代码之后,我仍然对这些字符串"AaAa", "AaBB" and "BBBB"具有相同的哈希码感到惊讶 .

JDK的来源如下,

int h = hash;
if (h == 0 && value.length > 0) {
    char val[] = value;

    for (int i = 0; i < value.length; i++) {
        h = 31 * h + val[i];
    }
    hash = h;
}
return h;
Run Code Online (Sandbox Code Playgroud)

任何人都可以澄清一下吗?

java string hashcode

-1
推荐指数
2
解决办法
126
查看次数

如果两个对象的哈希码相同,为什么不意味着 o1.equals(o2)?

执行equals()hashCode()应遵循这些规则。

  1. 如果o1.equals(o2)o1.hashCode() == o2.hashCode()则应始终为真。
  2. 如果o1.hashCode() == o2.hashCode()是真的,这并不意味着那o1.equals(o2)将是真的。

如果o1.hashCode() == o2.hashCode()是真的。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希码。如果两个对象的哈希码相同,为什么不是这样o1.equals(o2)

java equals hashcode

-1
推荐指数
1
解决办法
398
查看次数

Java 中记录与类的 hashCode() 和 equals() 的默认实现

尝试使用示例代码来检查recordequals()classhashCode()的默认行为,但与class相比,记录的行为似乎有所不同。

这是记录的代码示例

public class EqualsAndHashcode {
    public static void main(String[] args) {
        var employeeA = new Employee(101);
        var employeeB = new Employee(101);
        var employeeAClass = new EmployeeClass(102);
        var employeeBClass = new EmployeeClass(102);
        var printStream = System.out;
        printStream.println("record equals: " + employeeA.equals(employeeB) + "\nhashcode objA: " + employeeA.hashCode() + "\nhashcode objB: " + employeeB.hashCode());
        printStream.println("\nclass equals: " + employeeAClass.equals(employeeBClass) + "\nhashcode objA: " + employeeAClass.hashCode() + "\nhashcode objB: …
Run Code Online (Sandbox Code Playgroud)

java equals hashcode java-record java-17

-1
推荐指数
1
解决办法
4402
查看次数

为什么Object.hashCode()没有为看似相同的对象返回相同的值

代码如下:

public class Main {
    public static void main(String[] args) {
        Student a = new Student(10, "Ole");
        Student b = new Student(10, "Ole");

        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
    }
}
Run Code Online (Sandbox Code Playgroud)

对象看起来像这样:

public class Student {
    private int snr;
    private String namn;

    public Student(int snr, String namn) {
        this.snr = snr;
        this.namn = namn;
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是运行代码时的结果:

57651960
441366923
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些javadoc,但我找不到原因,有人可以解释为什么会这样吗?还有什么我必须做的才能使结果相同?(如果可能的话)

谢谢你的解释:)!现在有道理;)

java object hashcode

-2
推荐指数
1
解决办法
461
查看次数

这个陈述对重写hashcode和equals意味着什么?

我有关于java equals和hashcode的声明.

如果我们将这样的Integer对象用于HashMap中的键,我们将无法可靠地检索关联的值

这是什么意思 ?为什么它说"不可靠"?我写了一个测试程序,它始终有效.

public class Test1 {

    public static void main(String[] args){
        Map<Integer, Student> map = new HashMap<Integer, Student>();

        map.put(1, new Student("john"));        
        map.put(2, new Student("peter"));

        Student s1 = map.get(1);
        Student s2 = map.get(1);
        Student s3 = map.get(2);
        System.out.println("s1:"+s1+" s2:"+s2+" s3:"+s3);

        System.out.println(s1==s2);
        System.out.println(s1==s3);
        System.out.println(s1.equals(s3));
        System.out.println(s1.equals(s2));
    }   
}

class Student{
    private String name;
    public Student(String name){        
        this.name = name;       
    }

    public String getName(){
        return this.name;
    }   
}
Run Code Online (Sandbox Code Playgroud)

java hash hashcode

-3
推荐指数
1
解决办法
408
查看次数