- 浏览: 747705 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (419)
- 杂软粉墨 (2)
- 创意灵感 (3)
- 经验记录 (137)
- 开源轨迹 (2)
- sip-communicator (2)
- 闲侃杂谈 (8)
- 问题交流 (24)
- 概念模式 (32)
- 难点备案 (5)
- JwChat (1)
- 中国象棋 (1)
- 教育探索 (6)
- 英语研究 (58)
- 星际争霸 (1)
- 电信知识 (1)
- 软件架构 (3)
- 哲学探索 (26)
- 算法灵魂 (8)
- 近视探索 (6)
- 数学数学 (3)
- 牛角钻尖 (23)
- 至强文言 (3)
- 数据结构 (1)
- 宇宙物理 (2)
- 网络架构 (3)
- 游戏领域 (4)
- 图形处理 (2)
- 修炼之路 (8)
- 读书天地 (20)
- 编解乱码 (2)
- 概念探索 (8)
- 格物致知 (1)
- 其它语言 (1)
- 测试领域 (3)
- 文化风流 (1)
- JQuery (1)
- 網頁領域 (1)
- Unix/Linux (1)
- Inside JVM (1)
- 异常分析 (1)
最新评论
-
suyujie:
引用
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
iamzhoug37:
您能说一下"局部变量不受文本顺序限制" 是 ...
声明前为什么能赋值却不能输出,都是使用
源自<<effective java 2nd>> Item9
The value 31 was chosen because it is
an odd prime. If it were even and the multiplication overflowed, information
would be lost, as multiplication by 2 is equivalent to shifting. The advantage of
using a prime is less clear, but it is traditional. A nice property of 31 is that the
multiplication can be replaced by a shift and a subtraction for better performance:
31 * i == (i < < 5) - i. Modern VMs do this sort of optimization automatically.
主要是关于 result = 31 * result + c
这个式子中为什么用31,他说31是奇数,不是偶数,如果是偶数且乘法造成溢出的话,信息就会丢失,因为乘以2就相当于移位,那我就有个疑惑了,乘31就
不会造成信息丢失了?乘2是移位,乘31的过程其实也是包含移位的
MT502回答说:乘31和2都会溢出造成信息丢失,但是乘2更容易导致低位都变成0从而导致hashcode一样的概率变大
我认为乘31也没有理由不造成溢出,看来原文描述确实有些语病。
选择31这个质数,至少是有意让hash值最大程度散布,降低碰撞可能~
For what it's worth, Effective Java 2nd Edition hand-waives around the
mathematics issue and just say that the reason to choose 31 is:
* Because it's an odd prime, and it's "traditional" to use primes
* It's also one less than a power of two, which permits for bitwise optimization
Here's the full quote, from Item 9: Always override hashCode when you override equals:
The value 31 was chosen because it's an odd prime. If it were even
and multiplication overflowed, information would be lost, as
multiplication by 2 is equivalent to shifting. The advantage of using a
prime is less clear, but it is traditional.
A nice property
of 31 is that the multiplication can be replaced by a shift (§15.19) and
subtraction for better performance:
31 * i == (i << 5) - i
Modern VMs do this sort of optimization automatically.
While the recipe in this item yields reasonably good hash
functions, it does not yield state-of-the-art hash functions, nor do
Java platform libraries provide such hash functions as of release 1.6.
Writing such hash functions is a research topic, best left to
mathematicians and theoretical computer scientists.
Perhaps a
later release of the platform will provide state-of-the-art hash
functions for its classes and utility methods to allow average
programmers to construct such hash functions. In the meantime, the
techniques described in this item should be adequate for most
applications.
Rather simplistically, it can be said that using a
multiplier with numerous divisors will result in more hash collisions.
Since for effective hashing we want to minimize the number of
collisions, we try to use a multiplier that has fewer divisors. A prime
number by definition has exactly two distinct, positive divisors.
http://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode
其它相关信息stackoverflow上也有不少,如:
http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier
发表评论
-
RuntimeException为啥不用声明抛出?
2012-11-13 15:04 7465异常,错误都是同一种父类:java.lang.Throwabl ... -
why null is allocated on java stack
2012-06-05 11:45 1190提问: 恩。。。俺的意思是, String str = n ... -
关于Java 泛型 ?extends T 的问题
2012-05-21 11:05 4357http://topic.csdn.net/u/2012051 ... -
HashSet的contains方法de解释是不是有问题
2011-02-20 22:27 3267first of all, exhibits the code ... -
为什么AnonymousInnerClass只能访问final型非同一方法局部变量
2010-09-13 09:39 1444import java.io.IOException; im ... -
URLConnection访问servlet无反应
2010-07-26 09:28 2677这样完整的回路是ok的 客户端 import jav ... -
This is how scientists see the world
2010-07-14 15:36 1013有些东西不清楚,比如右上角什么东东,中间那个看似压强C, ... -
接口能描述成has-a吗
2010-07-10 10:19 1333接口has a什么呢? 如果说接口当作具备某种能力来用,比如X ... -
关于java.util.ResourceBundle
2010-07-05 14:17 4352import java.util.ResourceBundle ... -
ArrayList,Vector线程安全性测试
2010-06-18 09:43 3213import java.util.ArrayList; im ... -
SortedSet去重
2010-06-13 17:06 1336import java.util.Iterator; imp ... -
这个静态内部类实现的单例是迟加载且线程安全的吗?
2010-05-28 13:10 1632public class JiveProperties { ... -
double-checked locking实现的单例模式之volatile
2010-05-26 17:23 3511private volatile static Singlet ... -
死锁的例子描述对吗
2010-05-10 11:20 1104public class Deadlock { stati ... -
java中Adapter是什么概念
2010-04-06 11:30 4942Adapter乃适配器,� ... -
编码转换会丢失信息吗
2010-03-09 13:13 1253编码转换会丢失信息吗? 这是个命题,根 ... -
文本文件在系统中的存储与展现方式
2010-02-04 09:38 1134碰到了一个问题,同样的一个properties ... -
servlet如何实现多线程访问同一个实例的多个service方法
2009-12-09 11:22 1624如题,这是我现在想的一个问题,暂存于此,它同一个方法的 ... -
构造方法是静态的吗?
2009-12-03 15:13 1434public class Test { private ... -
关于JTextPane读取RTF多出一行的问题
2009-11-11 11:20 2467代码如下: import java.io.FileInput ...
相关推荐
定义hashcode时使用31系数的原因 Hashcode是一个非常重要的概念在Java编程中,它是用于唯一标识对象的整数值。特别是在使用HashMap、HashSet等集合类时,hashcode的正确实现是非常重要的。本文将详细介绍为什么在...
3. **扰动函数**:在计算过程中加入扰动因子,进一步打乱哈希码的分布,降低碰撞概率。 4. **避免零值**:处理字段为零的情况,因为零可能导致较差的哈希码分布。 了解了`hashCodeUtil`的基本原理后,我们可以将其...
加载因子是衡量HashMap满的程度,当HashMap中的元素数量达到初始容量和加载因子的乘积时,HashMap会进行扩容,将容量扩大为原来的两倍。加载因子越大,HashMap填满的几率就越大,但空间利用效率就越高;加载因子越小...
4. **重写hashCode和equals方法的原因** 为了确保键的唯一性,需要重写这两个方法,使具有相同意义的对象能正确地映射到相同的哈希值,并且equals方法可以确认两个对象是否相等。 5. **hash函数的实现** JDK1.8中,...
哈希映射(HashMap)是Java编程语言中广泛使用的数据结构之一,主要提供键值对的存储和查找功能。...在实际编程中,应充分考虑哈希冲突的处理、负载因子的选择以及预估容量的设定,以提高HashMap的使用效率。
而加载因子决定了HashMap何时扩容,即当HashMap中的条目数超过了加载因子与当前容量的乘积时,HashMap会进行rehash操作,通常默认加载因子是0.75。 4. **一致性哈希算法**:一致性哈希算法通过构造一个长度为2^32的...
- 选择合适的初始容量(initialCapacity)和负载因子,以优化HashMap的性能。初始容量越大,扩容次数越少,但内存占用也会增加。 - 注意HashMap的并发问题,如果在多线程环境下,使用Collections.synchronizedMap()...
Java编程语言在软件开发领域占据着重要地位,特别是在大型企业如阿里云和蚂蚁集团中...在实际使用中,根据需求选择合适的数据结构,考虑线程安全问题,并了解其底层实现原理,可以帮助我们编写出更高效、更稳定的代码。
- 哈希函数:HashMap使用键对象的hashCode()方法生成哈希值,再通过取模运算确定在数组中的位置。 - 链表与碰撞:当多个键的哈希值相同,它们会被链接到同一个数组槽位形成链表,解决哈希冲突。 - 负载因子:...
2. **哈希函数**:HashMap通过键对象的`hashCode()`方法计算哈希值,然后使用`indexFor(int hash, int length)`方法确定元素在数组中的位置。这个过程是为了尽量使不同的键分散在数组的不同位置,减少哈希冲突。 3....
- **容量和负载因子的选择**:容量和负载因子的大小直接影响HashMap的性能。过高的负载因子会导致链表过长,影响性能;过低则会造成空间的浪费。通常推荐使用默认值。 - **键的equals和hashCode方法**:由于HashMap...
在Java编程语言中,HashMap是Java集合框架的重要组成部分,它提供了高效的存储和检索对象的能力,实现了"键-值"对的映射。本教程将深入分析2022年Java中HashMap的内部机制、关键属性和操作。 HashMap的核心属性包括...
在Java中,`HashMap`作为最常用的数据结构之一,其内部实现选择红黑树而非其他数据结构(如链表或AVL树)有着深刻的考虑。 **主要原因:** 1. **更快的搜索和插入速度:** - 红黑树是一种自平衡二叉搜索树,因此...
- **定义**:负载因子是哈希表中已存在的元素数量与哈希桶数量的比值,即 \(\text{负载因子} = \frac{\text{元素数量}}{\text{哈希桶数量}}\)。 - **作用**:负载因子直接影响哈希表的冲突率。通常,当负载因子过...
5. **负载因子选择**: 0.75是一个折衷的选择,它在查找效率和内存使用之间取得平衡。较低的负载因子减少冲突,提高查找效率,但占用更多内存;较高的负载因子节省内存,但可能导致更多的冲突和查找时间。 6. **...
阿里云Java实习生面试真题涉及了Java集合框架中的一些核心概念,主要集中在HashSet、...在面试中,深入理解这些数据结构的内部工作原理以及如何根据需求选择合适的集合类型,将有助于展示你的专业技能和问题解决能力。
在Java中,`hashCode()`方法就是用于计算对象的哈希值,通常在实现`equals()`方法时需要一起考虑。 哈希表,又称为散列表,是基于哈希函数实现的一种数据结构,它允许我们以近乎常数的时间复杂度进行插入、删除和...
- **get方法**:获取值时,同样根据key的hashCode()和hash()方法定位到数组的相应位置,然后在链表或红黑树中查找对应的键值对。 - **resize方法**:当HashMap需要扩容时,会创建一个新的更大的数组,并将旧数组中...
HashMap是Java编程语言中最常用的集合类之一,它提供了一种基于键值对(key-value pair)的数据存储方式,允许我们快速...在设计和优化数据结构时,也应考虑到哈希冲突的处理和负载因子的选择,以达到最佳的运行效果。