我想我做了所有事情,但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) 我在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())
当我有这样的课程
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) 我有一个自定义对象,其属性包括可以是整数(例如Integer num1和Integer num2)null。
对于 equal 函数,我通过执行 来确定 2 个自定义对象是否相等return num1 == customObj.num1 && num2 == customObj.num2。这工作 b/cnull == null是true在 Java 中。
所以我想知道在我的对象的哈希码函数中是否可以这样做return Objects.hash(num1, num2)?
我只是不确定我是否可以将null对象传递给它Objects.hash(...),是否会以某种方式弄乱哈希码,或者我是否会得到NullPointerException.
有人可以解释为什么java人会覆盖hascodein 的目的Optional
在阅读了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)
任何人都可以澄清一下吗?
执行equals()并hashCode()应遵循这些规则。
o1.equals(o2),o1.hashCode() == o2.hashCode()则应始终为真。o1.hashCode() == o2.hashCode()是真的,这并不意味着那o1.equals(o2)将是真的。如果o1.hashCode() == o2.hashCode()是真的。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希码。如果两个对象的哈希码相同,为什么不是这样o1.equals(o2)?
尝试使用示例代码来检查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) 代码如下:
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 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)