gpt4 book ai didi

Java 哈希码 : Object vs composite

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:23 26 4
gpt4 key购买 nike

我在一些代码中偶然发现了这个方法,这些代码的唯一目的是为 HashMap 创建一个 String Key(编辑:在我的例子中,所有的 X,Y和 Z 将是数字,如果这样更容易,请将它们视为坐标):

protected String createMappingKey(String x, String y, String z) {
return x+":"+y+":"+z;
}

这段代码有些地方不对,我认为最好用这样的对象替换(请注意,这段代码是由我的 IDE 生成的,因此您可以根据需要更改实现):

public static class MyKey {
String x,y,z;

// Constructor(s), maybe getters and setters too here

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

MyKey myKey = (MyKey) o;

if (x != null ? !x.equals(myKey.x) : myKey.x != null) return false;
if (y != null ? !y.equals(myKey.y) : myKey.y != null) return false;
if (z != null ? !z.equals(myKey.z) : myKey.z != null) return false;

return true;
}

@Override
public int hashCode() {
int result = x != null ? x.hashCode() : 0;
result = 31 * result + (y != null ? y.hashCode() : 0);
result = 31 * result + (z != null ? z.hashCode() : 0);
return result;
}
}

但是,这似乎是一大堆代码,但值(value)不大。我很确定这两种方法之间的碰撞次数差别可以忽略不计。

您更喜欢以下哪种方法,为什么?我缺少更好的方法吗?

如果这些方法中的一种会比另一种产生更多的碰撞,那我也会感兴趣,我将打开一个单独的问题来解决这个问题。

最佳答案

当我想创建一个 key 但又觉得没有必要使用完整的 key 类时,我倾向于使用的方法是创建一个 List使用 Arrays.asList .

protected List<Object> createMappingKey(String x, String y, String z) {
return Arrays.<Object>asList(x, y, z);
}

String 的危险在于,如果您的元素使用您也用作分隔符的字符,则等号可能会发生冲突。列表可确保不会发生此类冲突。它还具有使用具有正确 equals/hashCode 实现的任何对象的好处,而不仅仅是字符串和具有 equals-compatible toString 实现的对象。

如果你想创建一个关键类,你可以使用 Appache Commons EqualsBuilderHashCodeBuilder显着缩短您的 hashCode 和 equals 类。

关于Java 哈希码 : Object vs composite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com