标签: hashcode

覆盖子类中的equals()和hashCode()...考虑超级字段

是否有关于如何重写特定规则equals()hashCode()子类考虑超领域?知道有很多参数:超级字段是私有/公共的,有/无getter ...

例如,Netbeans生成的equals()&hashCode()将不考虑超级字段...和

    new HomoSapiens("M", "80", "1.80", "Cammeron", "VeryHot").equals(
    new HomoSapiens("F", "50", "1.50", "Cammeron", "VeryHot"))
Run Code Online (Sandbox Code Playgroud)

将返回true :(

public class Hominidae {

    public String  gender;
    public String  weight;
    public String  height;

    public Hominidae(String gender, String weight, String height) {
        this.gender = gender;
        this.weight = weight;
        this.height = height;
    }
    ... 
}

public class HomoSapiens extends Hominidae {
    public String name;
    public String faceBookNickname;

    public HomoSapiens(String gender, String weight, String height, 
                       String name, String …
Run Code Online (Sandbox Code Playgroud)

java inheritance overriding equals hashcode

62
推荐指数
4
解决办法
5万
查看次数

Java如何在HashMap或HashTable中订购商品?

我想知道Java如何在Map(HashMapHashtable)添加项目时订购项目.键是由哈希码,内存引用还是按分配优先级排序的?

这是因为我注意到它们中的相同对Map并不总是在同一个顺序中

java hashtable hashmap map hashcode

60
推荐指数
3
解决办法
7万
查看次数

可变的hashmap键是危险的做法吗?

将可变对象用作Hashmap键是不好的做法吗?当您尝试使用已修改足以更改其哈希码的密钥从Hashmap检索值时会发生什么?

例如,给定

class Key
{
    int a; //mutable field
    int b; //mutable field

    public int hashcode()
        return foo(a, b);
    // setters setA and setB omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)

用代码

HashMap<Key, Value> map = new HashMap<Key, Value>();

Key key1 = new Key(0, 0);
map.put(key1, value1); // value1 is an instance of Value

key1.setA(5);
key1.setB(10);
Run Code Online (Sandbox Code Playgroud)

如果我们现在打电话map.get(key1)怎么办?这是安全的还是可取的?或者行为是否依赖于语言?

hash key hashmap mutable hashcode

59
推荐指数
5
解决办法
2万
查看次数

什么是哈希码计算的合理素数?

Eclipse 3.5有一个非常好的功能来生成Java hashCode()函数.它会产生例如(稍微缩短:)

class HashTest {
    int i;
    int j;        
    public int hashCode() {
        final int prime = 31;
        int result = prime + i;
        result = prime * result + j;
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

(如果类中有更多属性,result = prime * result + attribute.hashCode();则对每个附加属性重复.对于int.可以省略.hashCode().)

这似乎很好,但选择31为素数.它可能来自Java StringhashCode实现,它被用于性能原因,这些原因在引入硬件乘法器之后很久就消失了.对于i和j的小值,这里有许多哈希码冲突:例如(0,0)和(-1,31)具有相同的值.我认为这是一个Bad Thing(TM),因为经常出现小值.对于String.hashCode,您还会发现许多具有相同哈希码的短字符串,例如"Ca"和"DB".如果选择大素数,如果选择素数,此问题就会消失.

所以我的问题是:选择什么是好的素数?你用什么标准来找到它?

这是一个普遍的问题 - 所以我不想给i和j一个范围.但我认为在大多数应用中,相对较小的值比较大的值更常出现.(如果你有大的值,素数的选择可能不重要.)它可能没有多大区别,但更好的选择是一种简单明了的方法来改善这一点 - 那么为什么不这样做呢?Commons lang HashCodeBuilder也提出了奇怪的小值.

(澄清:这不是重复为什么String中的Java的hashCode()使用31作为乘数?因为我的问题不关心JDK中31的历史,而是关于新代码中更好的值使用相同的基本模板.没有任何答案试图回答.)

java primes hashcode

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

我应该在JPA实体中编写equals()方法吗?

我想检查实体是否在另一个实体的Collection成员(@OneToMany@ManyToMany)中:

if (entity2.getEntities1().contains(entity1)) { }
Run Code Online (Sandbox Code Playgroud)

java entity jpa equals hashcode

57
推荐指数
5
解决办法
3万
查看次数

HashMaps和Null值?

如何将空值传递给HashMap?
以下代码段适用于填写的选项:

HashMap<String, String> options = new HashMap<String, String>();  
options.put("name", "value");
Person person = sample.searchPerson(options);  
System.out.println(Person.getResult().get(o).get(Id));    
Run Code Online (Sandbox Code Playgroud)

那么问题是必须输入选项和/或传递空值的方法?
我尝试了以下代码但没有成功:

options.put(null, null);  
Person person = sample.searchPerson(null);    

options.put(" ", " ");  
Person person = sample.searchPerson(null);    

options.put("name", " ");  
Person person = sample.searchPerson(null);  

options.put();  
Person person = sample.searchPerson();    
Run Code Online (Sandbox Code Playgroud)

java null hashmap hashcode

56
推荐指数
2
解决办法
16万
查看次数

快速简单的哈希码组合

人们可以推荐快速简单的方法来组合两个对象的哈希码.我并不太担心碰撞,因为我有一个Hash Table可以有效地处理这个问题我只想要尽可能快地生成代码的东西.

阅读SO和网络似乎有几个主要候选人:

  1. 异或
  2. 使用Prime乘法进行异或
  3. 简单的数字运算,如乘法/除法(溢出检查或环绕)
  4. 构建一个String然后使用String类的Hash Code方法

人们会推荐什么?为什么?

c# algorithm hash hashcode

55
推荐指数
5
解决办法
3万
查看次数

GetHashCode重写包含泛型数组的对象

我有一个包含以下两个属性的类:

public int Id      { get; private set; }
public T[] Values  { get; private set; }
Run Code Online (Sandbox Code Playgroud)

我做了它IEquatable<T>并覆盖了object.Equals这样的:

public override bool Equals(object obj)
{
    return Equals(obj as SimpleTableRow<T>);
}

public bool Equals(SimpleTableRow<T> other)
{
    // Check for null
    if(ReferenceEquals(other, null))
        return false;

    // Check for same reference
    if(ReferenceEquals(this, other))
        return true;

    // Check for same Id and same Values
    return Id == other.Id && Values.SequenceEqual(other.Values);
}
Run Code Online (Sandbox Code Playgroud)

object.Equals我有覆盖时,我GetHashCode当然也必须覆盖.但是我应该实现什么代码?如何从通用数组中创建哈希码?我如何将它与Id整数相结合?

public override int …
Run Code Online (Sandbox Code Playgroud)

c# arrays generics hashcode

54
推荐指数
2
解决办法
4万
查看次数

Scala中的case类中的hashCode

我已经读过Scala'a case class构造自动生成拟合equalshashCode实现.生成的代码到底是什么样的?

scala hashcode case-class

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

`hashCode`的默认实现是什么?

如果没有覆盖该hashCode方法,那么默认实现是hashCode什么?

java hashcode

54
推荐指数
3
解决办法
6万
查看次数