相关疑难解决方法(0)

Hashcode平等是否意味着引用基于参考的平等?

我读到要在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()方法?

java methods overriding object

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

如何检查Object ArrayList包含没有Loop的Object的单个属性

这是这个问题的答案,但我还需要其他方法

假设Person是一个包含属性的类

  • PERSONID
  • PERSONNAME
  • personAddress

一个ArrayList持有千人对象,我想检查"11"personId是否在ArayList中?

一种方法是迭代(循环)arraylist并逐个单独检查.

有没有其他方法可以解决这个问题?

java arrays search list arraylist

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

如何去除HashSet中的重复项?

在下面的代码中,我在哈希集中添加了 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)

java hashset

3
推荐指数
1
解决办法
2万
查看次数

为什么具有相同数据的两个不同的HashSet具有相同的HashCode?

我最近在 leetcode 上遇到了一个问题,我用嵌套哈希集解决了这个问题。如果您有兴趣,这就是问题:https ://leetcode.com/problems/group-anagrams/ 。

我的直觉是将每个单词的所有字母添加到一个哈希集中,然后将该哈希集放入另一个哈希集中。在每次迭代中,我都会检查哈希集是否已经存在,如果存在,则添加到现有的哈希集。

奇怪的是,这似乎有效。如果两个哈希集是不同的对象,为什么它们共享相同的哈希码?类似的东西if(set1.hashCode() == set2.hashCode()) doStuff()是有效的代码吗?

java hashcode hashset

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

将对象映射为关键字

我想创建一个具有某个类作为键的映射.我遇到的问题是,由于这个类包含指针,如果我使用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

java map

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

java中的哈希代码实现

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)

java

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

为什么更改用作HashMap中的键的对象的哈希码会使查找返回null?

请考虑以下情形:

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().

我已经在调试过程中遇到过这个问题,因为我已经明确覆盖equalshashCode一个特定的对象上我用了一些业务逻辑.我完全理解为什么当我改变它的状态时对象的哈希码会改变,但为什么map.get(o1)会因为它而返回null?只有一个对象,所以密钥的哈希码不应该匹配吗?

java equals hashmap hashcode

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

java.util.HashSet不遵守其规范吗?

作为一个相对的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 hashset

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

kotlin - 如何覆盖哈希码

我已经覆盖了 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)

但我认为这更好: …

equals kotlin

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

比较 HashSet 中的对象

我正在制作一款有星星的 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 中。我对吗 ?

java collections

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