我一直在使用Netbeans进行 Java开发,有一些事情我只是依靠工作,而不用提问如何.其中包括自动生成的hashCode()和equals()方法.

equals方法很简单,但是我发现hashCode方法有点神秘.我不明白为什么选择乘法器并应用它所做的操作.

import java.util.Arrays;
import java.util.Objects;

public class Foo {

    int id;
    String bar;
    byte[] things;

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + this.id;
        hash = 89 * hash + Objects.hashCode(this.bar);
        hash = 89 * hash + Arrays.hashCode(this.things);
        return hash;
    }    
}

搜索文档,本网站和Google的“netbeans生成哈希码”这样的东西没有什么似乎相关.有谁在这里熟悉这个世代战略是为什么Netbeans使用它?

编辑:
感谢您的答案!特别是由于this answer on the linked SO question,我了解了现在更全面地设计一个hashCode方法中使用素数的逻辑.然而,目前为止,没有人真正解决的问题的另一方面是Netbeans如何选择它为生成的方法所做的素数.哈希字段和其他乘数(在我的例子中为89)似乎根据类的各种因素而不同.

例如,如果我添加第二个String到该类,则hashCode()变为

public int hashCode() {
    int hash = 7;
    hash = 13 * hash + this.id;
    hash = 13 * hash + Objects.hashCode(this.bar);
    hash = 13 * hash + Objects.hashCode(this.baz);
    hash = 13 * hash + Arrays.hashCode(this.things);
    return hash;
}

那么,为什么Netbeans选择这些特定的素数,而不是其他的?

解决方法

这是旨在更好地分配哈希值的优化. Eclipse也是这样做的.看看 Why use a prime number in hashCode?和 Why does Java’s hashCode() in String use 31 as a multiplier?.

这是没有必要的.甚至返回0;是为了满足equals / hashcode合同.唯一的原因是基于散列的数据结构在良好的分布式哈希值下表现更好.

有人会称之为过早优化.我想这是可以的,因为它的a)免费(生成)和b)广泛认可(几乎每个IDE都这样做).

java – 为什么Netbeans以它的方式生成hashCode()?的更多相关文章

  1. ios – 如何在RubyMotion中创建字符串的md5哈希

    我有一封电子邮件,想从gravatar.com中提取相应的图片使用ruby,很容易:由于RubyMotion中没有require方法,如何从电子邮件生成哈希?解决方法一种可能性是使用“NSDataMD5”cocoapod.通过将其添加到您的Rakefile来安装它:然后你可以像这样使用它:

  2. Swift- 枚举中的rawValue和hashValue

    成员值仅仅是一组抽象的符号,不能参与任何运算,也不代表任何数据类型!4)原始值的推断:在Swift中只有Int型的原始值可以推断,其余类型包括Double、String、Character类型都无法在原始值中推断;这里的推断是指不用给出所有成员值的原始值而只需要给定一部分即可,其余的原始值Swift可以自动推断出,但是这里就只有Int类型的支持原始值推断,而推断的方法和C语言的枚举类型一样:enumWeekDays:Int{

  3. swift算法实践2

    字符串hash算法Time33在效率和随机性两方面上俱佳。对于一个Hash函数,评价其优劣的标准应为随机性,即对任意一组标本,进入Hash表每一个单元之概率的平均程度,因为这个概率越平均,数据在表中的分布就越平均,表的空间利用率就越高。Times33的算法很简单,就是不断的乘33,见下面算法原型。

  4. OpenStack 对象存储 Swift 简单介绍

    Swift最适合的就是永久类型的静态数据的长期存储。提供账号验证的节点被称为AccountServer。Swift中由Swauth提供账号权限认证服务。ProxyserveracceptsincomingrequestsviatheOpenStackObjectAPIorjustrawHTTP.Itacceptsfilestoupload,modificationstoMetadataorcontainercreation.Inaddition,itwillalsoservefilesorcontaine

  5. Swift开篇004->集合

    如有错误和疑问,欢迎指正提出。

  6. 在Swift中编写一个很好的Hashable实现

    在Objective-C中,–哈希的相对较好的默认实现可能是:假设property1和property2都返回hash值的好值。这在Swift的等价varhashValue:在其Hashable协议中定义的Int方法不起作用。相当的Swift代码很可能会溢出,这是Swift中的运行时错误。所以我的问题是,在Swift中生成散列值的最佳技术是什么?虽然我的理解是XOR不是创建统一散列分布的理想选择。也许更奇特的东西?如FabianKreiser所建议的,可以使用overflow操作符来制作hashValue

  7. 泛型 – 在Swift中实现Set.addSequence

    我在Swift中实现了一个使用Dictionary键的Set.我想实现一个addAll(序列)方法,该方法在Set中的Elements上采用任何序列类型,但是我得到一个没有意义的错误.这是我的代码我在XCode6.1和6.0.1中收到此错误.我想遵循Array的extend方法的语义,但是这种类型的签名甚至都不能为我编译.我做错了什么,还是应该提交雷达?

  8. macos – 如何使用针对Swift结构的Cocoa绑定

    我正在学习斯威夫特.这些天我主要在iOS工作,但我目前正在为OSX开发一个小项目.在OSX上,我喜欢使用Cocoa绑定将我的模型中的值链接到UI元素.它节省了大量的胶水代码.我正在编写一个程序,将Swift的性能与C/Objective-C的性能进行比较.我正在使用素数生成器作为测试项目.我创建了一个SwiftStructComputeSettings,它封装了在Swift和Objective-C

  9. android – 会话提供给未打开状态的请求

    FacebookSDK3.0中的Facebook好友选取器示例显示错误拨号框.消息框说:‘com.facebook.Facebook异常:为未打开状态的请求提供的会话.解决方法我有这个确切的错误,如果你从Eclipse运行它,那么logcat中很可能会有更详细的错误.对我来说,我发现真正的错误是我的Android哈希键与我提供给Facebook的哈希键不匹配.仔细检查您使用的哈希键是否正确.请参阅

  10. 有关适用于Android的Facebook SDK的开发和发布密钥哈希的问题

    如你所知,android使用不同的Keystore进行开发和发布,因为两个密钥库在每个方面都不同,它们都有不同的指纹和SHA-1哈希,因此它们被完全区别对待.问:如果我尚未将我的应用程序发布到PlayStore.我可以使用ReleaseKey而不是使用Development键吗?如果你担心Facebook密钥,附加是图像问:为什么我们为iOS开发时,不需要那些关键的哈希?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部