标签: hashcode

Objects.hash()vs Objects.hashCode(),需要澄清

好的,所以在Java 7中我们有

o.hashCode();
Objects.hashCode(o);

    Objects.hash(o);
Run Code Online (Sandbox Code Playgroud)

前两个与零点检查大致相同,但最后一个是什么?

提供单个对象引用时,返回的值不等于该对象引用的哈希代码.

这是为什么?我的意思是,我们不需要3种做同样事情的方法,我理解......但为什么我们需要Objects.hash()呢?你什么时候选择使用一个与另一个?

hashcode java-7

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

接口中的toString(),equals()和hashCode()

所以,我有一个需要实现的一堆方法的接口,方法名称是无关紧要的.

实现此接口的对象通常被放入集合中,并且还具有我希望它们使用的特殊toString()格式.

所以,我认为将hashCode(),equals()和toString()放入接口会很方便,以确保我记得覆盖这些的默认方法.但是当我将这些方法添加到接口时,如果我没有实现这三个方法,IDE/Compiler就不会抱怨,即使我明确地将它们放在接口中.

为什么不对我强制执行?它抱怨如果我没有实现任何其他方法,但它没有强制执行这三个方法.是什么赋予了?有线索吗?

java interface equals tostring hashcode

52
推荐指数
6
解决办法
4万
查看次数

hashCode()是如何用Java计算的

hashCode()方法在java中返回什么值?

我读到它是一个对象的内存引用...当我打印哈希值为new Integer(1)1时; 因为String("a")是97.

我很困惑:它是ASCII还是什么类型的值?

java hashcode

52
推荐指数
6
解决办法
8万
查看次数

是否有可能在java中创建像Comparator,但用于实现自定义equals()和hashCode()

我有一个对象数组,我想将它与另一个对象数组连接起来,除了具有相同id的对象.这些对象在系统中的许多地方使用,并且没有实现哈希码或等号.所以我不想要实现hashCode()equals(),因为我怕系统某处碰坏,其中所使用的对象,我不知道.

我想将所有对象放在一个集合中,但不知何故使对象使用自定义hashCode()equals().像自定义的东西Comparator,但对于平等.

java collections equals hashcode

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

Java Array HashCode实现

这很奇怪.一位同事询问了java中myArray.hashCode()的实现.我以为我知道,但后来我做了一些测试.检查下面的代码.我注意到的奇怪的想法是,当我写出第一个系统时,结果是不同的.请注意,它几乎就像报告内存地址并修改类移动了地址或其他内容.只是想我会分享.

int[] foo = new int[100000];
java.util.Random rand = new java.util.Random();

for(int a = 0; a < foo.length; a++) foo[a] = rand.nextInt();

int[] bar = new int[100000];
int[] baz = new int[100000];
int[] bax = new int[100000];
for(int a = 0; a < foo.length; a++) bar[a] = baz[a] = bax[a] = foo[a];

System.out.println(foo.hashCode() + " ----- " + bar.hashCode() + " ----- " + baz.hashCode() +  " ----- " + bax.hashCode());

// returns 4097744 ----- 328041 ----- 2083945 ----- 2438296 …
Run Code Online (Sandbox Code Playgroud)

java int hashcode

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

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

Hashset的Hashcode和Equals

请澄清我对Hashset的疑问.考虑以下代码,

class Person
{
    String name;

    Person(String n)
    {
        name=n; 
    }
    public String getName()
    {
        return name;   
    }

    @Override
    public boolean equals(Object arg0) {

        System.out.println("in equals");

        Person obj=(Person)arg0;

        System.out.println("1st "+getName());
        System.out.println("2nd "+obj.getName());

        if(this.getName().equals(obj.getName()))
        {
                return true;
        }
        return false;
    }


    @Override
    public int hashCode() {

        System.out.println("in hash code");
        System.out.println(" value is "+Integer.valueOf(name.charAt(0)));
        return Integer.valueOf(name.charAt(0));
    }
}
Run Code Online (Sandbox Code Playgroud)

在主要我有以下代码

Person obj1=new Person("bcd");

Person obj2=new Person("cde");

Person obj3=new Person("abc");

Person obj4=new Person("abc");
Run Code Online (Sandbox Code Playgroud)

现在,如果我将这些对象添加到hashset

Set<Person> sset=new HashSet<Person>();

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj3);
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出

in hash …
Run Code Online (Sandbox Code Playgroud)

java equals hashcode hashset

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

关于如何正确覆盖object.GetHashCode()的一般建议和指南

根据MSDN,散列函数必须具有以下属性:

  1. 如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值.但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值.

  2. 只要没有对对象状态的修改来确定对象的Equals方法的返回值,对象的GetHashCode方法必须始终返回相同的哈希代码.请注意,这仅适用于当前应用程序的执行,并且如果再次运行应用程序,则可以返回不同的哈希代码.

  3. 为获得最佳性能,哈希函数必须为所有输入生成随机分布.


我一直在以下场景中找到自己:我创建了一个类,实现IEquatable<T>并重写了object.Equals(object).MSDN声明:

重写Equals的类型也必须覆盖GetHashCode; 否则,Hashtable可能无法正常工作.

然后它通常会为我停止一点.因为,你如何正确覆盖object.GetHashCode()?从来没有真正知道从哪里开始,这似乎是很多陷阱.

在StackOverflow中,有很多与GetHashCode重写相关的问题,但大多数问题似乎都是针对非常特殊的情况和具体问题.因此,我想在这里得到一个很好的汇编.概述与一般建议和指南.该做什么,不该做什么,常见的陷阱,从哪里开始,等等.

我希望它特别针对C#,但我认为它对其他.NET语言也有同样的作用(?).


我想也许最好的方法是每个主题创建一个答案,首先是快速简短的答案(如果可能的话,尽可能接近单行),然后可能会有更多信息,并以相关问题,讨论,博客文章等结束. ,如果有的话.然后,我可以创建一个帖子作为接受的答案(将其置于顶部),只需一个"目录".尽量保持简洁明了.而且不要只链接到其他问题和博客文章.尝试采用它们的本质,然后链接到源(特别是因为源可能会消失.另外,请尝试编辑和改进答案,而不是创建许多非常相似的答案.

我不是一个非常优秀的技术作家,但我至少会尝试格式化答案,使它们看起来很相似,创建目录等.我也会尝试在这里搜索一些相关的问题来回答部分问题.这些并且可能拉出我能管理的那些的本质.但由于我在这个主题上不是很稳定,所以我会尽量远离这个主题:p

.net c# hashcode gethashcode

44
推荐指数
2
解决办法
6427
查看次数

如何在.net(c#)中为可安全存储在数据库中的字符串创建HashCode?

引用 Eric Lippert的GetHashCode指南和规则:

规则:GetHashCode的消费者不能依赖它随着时间的推移或跨appdomains的稳定性

假设您有一个Customer对象,其中包含一系列字段,如Name,Address等.如果在两个不同的进程中使用完全相同的数据生成两个这样的对象,则它们不必返回相同的哈希代码.如果你在星期二的一个进程中创建这样一个对象,关闭它,并在星期三再次运行程序,哈希码可能会有所不同.

这在过去曾经被人咬伤过.System.String.GetHashCode的文档特别指出,两个相同的字符串在CLR的不同版本中可以具有不同的哈希码,实际上它们也是如此.不要在数据库中存储字符串哈希并期望它们永远是相同的,因为它们不会.

那么创建一个可以存储在数据库中的字符串的HashCode的正确方法是什么?

(请告诉我,我不是第一个在我写的软件中留下这个错误的人!)

.net c# database hashcode gethashcode

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

为什么String中的equals方法不使用哈希?

equalsString类中方法的代码是

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我有一个问题 - 为什么这个方法不使用hashCode()?

据我所知,hashCode()可以快速比较两个字符串.

更新:我知道,两个不相等的字符串,可以有相同的哈希值.但两个相等的字符串具有相等的哈希值.因此,通过使用hashCode(),我们可以立即看到两个字符串是不相等的.

我只是想,使用hashCode()方法可以很好的过滤器equals.

更新2:这里有一些代码,我们在这里谈论.

这是String方法等于的示例 …

java string hashcode

44
推荐指数
3
解决办法
4633
查看次数

标签 统计

hashcode ×10

java ×6

equals ×3

.net ×2

c# ×2

gethashcode ×2

collections ×1

database ×1

hash ×1

hashset ×1

int ×1

interface ×1

java-7 ×1

string ×1

tostring ×1

xor ×1