我读到要在java中使用equals()方法我们还必须覆盖hashcode()方法,并且相等(逻辑)对象应该具有eual哈希码,但这并不意味着基于引用的相等!这是我的重写equals()方法的代码,我应该如何覆盖hashcode方法:
@Override
public boolean equals(Object o)
{
if (!(o instanceof dummy))
return false;
dummy p = (dummy) o;
return (p.getName() == this.getName() && p.getId() == this.getId() && p.getPassword() == this.getPassword());
}
Run Code Online (Sandbox Code Playgroud)
我只是想了解它是如何工作的,所以只有三个字段,即名称,id和密码,只是试图比较我在main()中定义的两个对象!我还需要知道是否总是需要覆盖hashcode()方法和equals()方法?
假设Person是一个包含属性的类
一个ArrayList持有千人对象,我想检查"11"personId是否在ArayList中?
一种方法是迭代(循环)arraylist并逐个单独检查.
有没有其他方法可以解决这个问题?
在下面的代码中,我在哈希集中添加了 5 个具有相同数据的对象,我想消除具有重复数据的对象并打印不同的对象数据。
public static void main(String[] args) {
Employee emp1 = new Employee(1,"sandhiya","cse",22);
Employee emp2 = new Employee(1,"sandhiya","cse",22);
Employee emp3 = new Employee(1,"sandhiya","cse",22);
Employee emp4 = new Employee(1,"sandhiya","cse",22);
Employee emp5 = new Employee(1,"sandhiya","cse",22);
HashSet<Employee> emps = new HashSet<Employee>();
emps.add(emp1);
emps.add(emp2);
emps.add(emp3);
emps.add(emp4);
emps.add(emp5);
for(Employee e: emps){
System.out.println(e.id + " "+e.name+" "+e.department+ " "+e.age);
}
}
Run Code Online (Sandbox Code Playgroud) 我最近在 leetcode 上遇到了一个问题,我用嵌套哈希集解决了这个问题。如果您有兴趣,这就是问题:https ://leetcode.com/problems/group-anagrams/ 。
我的直觉是将每个单词的所有字母添加到一个哈希集中,然后将该哈希集放入另一个哈希集中。在每次迭代中,我都会检查哈希集是否已经存在,如果存在,则添加到现有的哈希集。
奇怪的是,这似乎有效。如果两个哈希集是不同的对象,为什么它们共享相同的哈希码?类似的东西if(set1.hashCode() == set2.hashCode()) doStuff()是有效的代码吗?
我想创建一个具有某个类作为键的映射.我遇到的问题是,由于这个类包含指针,如果我使用HashMap,则在散列时使用此地址(请参阅下面的代码).我怎样才能比较实际值而不是地址,或者我可以使用其他容器来实现相同的结果吗?
import java.util.*;
public class Main {
public static void main(String args[]) {
class Foo {
public Foo(String a) {s = a;}
public String s;
}
HashMap<Foo,Integer> a = new HashMap<Foo,Integer>();
a.put(new Foo("test"), 1);
System.out.println(a.get(new Foo("test")));
}
}
Run Code Online (Sandbox Code Playgroud)
这输出 null
package MavenWeb.MavenWeb;
import java.util.HashMap;
import java.util.Map;
public class StringEquality {
public static void main(String[] args) {
Person p1 = new Person("Naveen", 22, 1000);
Person p2 = new Person("Naveen", 21, 2000);
Person p3 = new Person("Naveen", 23, 3000);
if(p1.equals(p2)){
System.out.println("P1 and p2 :" + p1.equals(p2));
} else{
System.out.println("P1 and p2 :" + p1.equals(p2));
}
if(p1.equals(p3)){
System.out.println("P1 and p3 :" + p1.equals(p3));
}
Map<Person, Object> map = new HashMap<Person, Object>();
map.put(p1, p1);
map.put(p2, p2);
System.out.println(map.get(new Person("Naveen", 21, 2000)));
}
}
Run Code Online (Sandbox Code Playgroud)
...
class …Run Code Online (Sandbox Code Playgroud) 请考虑以下情形:
Object o1 = new Object();
Object o2 = new Object();
HashMap<Object, Object> map = new HashMap<Object, Object>();
map.put(o1, o2);
boolean test1 = map.get(o1) == o2; // This evaluates to true
// Now lets say we alter the state of o1:
o1.setSomeInternalState(Object newState);
boolean test2 = map.get(o1) == o2; // This evaluates to false, because now map.get(o1) returns null
Run Code Online (Sandbox Code Playgroud)
假设o1的类已被覆盖equals()并且hashCode().
我已经在调试过程中遇到过这个问题,因为我已经明确覆盖equals和hashCode一个特定的对象上我用了一些业务逻辑.我完全理解为什么当我改变它的状态时对象的哈希码会改变,但为什么map.get(o1)会因为它而返回null?只有一个对象,所以密钥的哈希码不应该匹配吗?
作为一个相对的Java菜鸟,我很困惑,找出以下内容:
Point.java:
public class Point {
...
public boolean equals(Point other) {
return x == other.x && y == other.y;
}
...
}
Run Code Online (Sandbox Code Playgroud)
Edge.java:
public class Edge {
public final Point a, b;
...
public boolean equals(Edge other) {
return a.equals(other.a) && b.equals(other.b);
}
...
}
Run Code Online (Sandbox Code Playgroud)
main snippet:private Set blockedEdges;
public Program(...) {
...
blockedEdges = new HashSet<Edge>();
for (int i = 0; ...) {
for (int j = 0; ...) {
Point p = new Point(i, j);
for (Point …Run Code Online (Sandbox Code Playgroud) 我已经覆盖了 java 对象的 equals 方法。(实际上是 kotlin 中的对象,但它很容易理解,我只是覆盖了 equals 方法)。但现在为了维护 equals 合同,我还应该覆盖 hashcode 方法。但我不知道如何实现适合 equals 方法的哈希码。这是我到目前为止所拥有的:
data class AddressModel(
var id_address: Int = 0,
var id_country: Int = 0,
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is AddressModel)
return false
else {
if (other.id_address == this.id_address)
return true
}
return false
}
}
Run Code Online (Sandbox Code Playgroud)
编译器强烈建议我覆盖 hashCode 方法。但我不明白要实施什么。在 equals 覆盖中,我只想检查 addressModel 是否与另一个具有相同的 Id,如果是,那么我假设它相等。
这是我到目前为止:
override fun hashCode(): Int {
return Objects.hash(id_address, id_country);
}
Run Code Online (Sandbox Code Playgroud)
但我认为这更好: …
我正在制作一款有星星的 2D 游戏。我决定在名为 Star 的类中创建给出随机坐标的构造函数。
public Star(){
super(0,0);
x = randomX.nextInt(maxX - minX + 1);
y = randomY.nextInt(maxX - minY + 1);
}
Run Code Online (Sandbox Code Playgroud)
然后,在其他课程中我将它们放入 HashSet 中
Set<Star> star = new HashSet<>();
public Set<Star> generateStars(){
while (star.size() < numberOfStars){
star.add(new Star());
}
return star;
}
Run Code Online (Sandbox Code Playgroud)
当然,我有渲染和勾选方法,但我认为不值得粘贴它们。我的讲师告诉我,可以有相同的星星,为了防止我应该使用使用哈希码的身份函数。有人可以帮我解决这个问题吗?我想这个函数应该检查哈希码是否相同,如果是这样,它应该只返回一个值,这样我们就可以将 1 个对象而不是 2 个对象添加到 HashSet 中。我对吗 ?