我想在 Ruby 中生成与 Java 的 String.hashCode 方法返回的哈希码相同的哈希码。什么方法最优雅?Java 的 String hashCode 实现如下所述:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode%28%29
执行这段代码后:
int a = 50;
float b = 50.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());
Run Code Online (Sandbox Code Playgroud)
我们得到False,这是预期的,因为我们正在处理不同的对象,因此我们应该得到不同的哈希值。
但是,如果我们执行以下命令:
int a = 0;
float b = 0.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());
Run Code Online (Sandbox Code Playgroud)
我们得到True. 两个对象返回相同的哈希码:0。
为什么会出现这种情况?他们不应该返回不同的哈希值吗?
为什么Eclipse实现的equals方法要比较每个值,只比较两个对象的hashCode不是更简单吗?
据我所知:
编辑:相关问题,如果 equals 实际上不需要 hashCode,为什么在实现 equals 时总是实现 hashCode?
我正在尝试使用 HashMap 实现稀疏网格,但是似乎重写 hashCode() 并没有按照我的预期工作。我将问题归结为以下代码:
public class Main {
private static class Coord {
int x, y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
// See https://en.wikipedia.org/wiki/Pairing_function#Cantor_pairing_function
return (((x + y) * (x + y + 1)) / 2) + y;
}
}
public static void main(String[] args) {
HashMap<Coord, String> grid = new HashMap<Coord, String>();
grid.put(new Coord(0, 0), "A");
System.out.println(grid.get(new Coord(0, 0)));
}
}
Run Code Online (Sandbox Code Playgroud)
我期望输出是:
A
Run Code Online (Sandbox Code Playgroud)
但是,输出是:
null …Run Code Online (Sandbox Code Playgroud) 我有一个字符串列表。我想从列表中的所有字符串生成一个哈希码。我怎样才能做到这一点?
hashcode 或 hashmap 是如何工作的,如果我们重写总是返回常量的 hashcode 并且重写的 equals 方法返回 false,那么它如何在返回或删除时识别确切的对象?time bean 忘记了性能所有这些东西,我的问题是它如何能够识别确切的对象,让我多解释一下,我有一个包含两个字段的 person 类,并且覆盖了始终返回 1 的 hashcode 和返回 false 的覆盖 equals 方法,创建了 3 个对象,对象 1 -- id 10 名称 AAAA,对象 2 -- id 20,名称 BBB,对象 3 -- id 30,名称 CCC,我已将所有三个对象添加到 hashSet,之后删除了对象2、这里如何识别准确的对象(20,BBB)
我有一个相当简单的问题:根据最佳编程实践,当我创建一个新的模型类时,我应该总是重写 equals、hashcode 和 toString 方法吗?即使我不打算比较特定类的对象?
我有课
class Controller with EquatableMixin {
final int id;
//... other props
Controller.from(Controller controller) :
id = controller.id,
//... other props assignments
List<Object> props => [
id,
//... other props
];
}
final ctrl1 = Controller(...); // Create ctrl1
final ctrl2 = Controller.from(ctrl1); // Create ctrl2 (actually clonning)
assert(ctrl1.hasCode != ctrl2.hasCode); // triggered!
Run Code Online (Sandbox Code Playgroud)
我期望 和ctrl1是ctrl2具有不同hashCodes 的不同对象,但它们具有相同的hashCode。为什么?我如何确保这ctrl12不是指向 的指针ctrl2?
我有一个名为的类User.java,代码如下,
public abstract class User implements Serializable {
// serialVersionUID
private Integer userId;
private String userName;
private String fullName;
// Constructor()
// Getters and Setters
// equals()
// hashCode()
}
Run Code Online (Sandbox Code Playgroud)
而且我还有Contact.java课,
public class Contact extends User {
// serialVersionUID
private String phoneNumber;
private String address;
// Constructor()
// Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,即使生成了 User 类,equals我hashcode是否需要在子类 Contact 中再次重写它?
而且我正在使用IDE lombok,IDE是IntelliJ。我看到当我生成equals并hashcode通过 IDE 时,可以选择模板,例如,
我是 Kotlin 的新手,我正在尝试理解它,我刚刚编写了一个简单的示例,该示例展示了如何将数据类与映射一起使用有点棘手,因为在我看来,数据类有一种奇怪的行为。默认情况下,他们根据类的每个属性定义 hashCode()。但他们没有定义默认的 equals() 方法。这给我带来了很多困惑,因为我创建了一个以数据类作为键的 HashMap,但我没有重写 hashCode() 和 equals()。我的数据类有一个 MutableList 成员。当我将一个元素放入映射中时,只要我没有将元素添加到 MutableList 中,我就会使用 map.get(dataObject) 检索它。之后,即使数据对象仍然相同,并且我使用map.keys(map.keys.indexOf(dataObject)有效)发现它,由于hashCode(),map.get(dataObject)失败了。
我可以使用普通类或添加 hashCode() 和 equals() 来修复它,从 hashCode() 中删除 MutableList,但我想知道,由于默认行为,重写 hashCode() 和 equals() 是否应该是“强制”与数据类一起使用,否则将它们与地图一起使用可能会导致错误。
我还能做些什么来避免这个问题吗?
package cards
data class Player(val name: String, var cards: MutableList<Card>) {
constructor(name: String): this(name, mutableListOf())
//I don't need to define equals, so pointers are checked. But if I don't override hashCode, as it's based
//on every property, the hashCode is calculated considering the content of the MutableList!
// override …Run Code Online (Sandbox Code Playgroud)