字符串中的hashcode

news/2024/11/20 7:16:18/

@[TOC]字符串中的hashcode)

h = 31 * h + val[i];

1、long类

型的hashcode精度损失
a) 为了避免long类型转换为int有高32位的精度损失,引起hashcode值相同,所以重写hashcode的时候,会将高32位与低32位进行异或与运算,再得到32位的一个数字。
b) 什么是异或与:就是真假美猴王,两数一样就完犊子了,为0。将高位无符号右移32位,这样高低32位就可以运算了
c)
2、double类型的hashcode转换,也是将double转为long类,再运算
d)
3、为什么常数选择素数:
e) 减少冲突,如果我用一个数字来乘以这个素数,那么最终的出来的结果只能被素数本身和被乘数还有1来整除。
4、为什么这个素数选择31:
f) 因为不能太大,不能干过int范围呀最后
g) 因为计算机计算31会比较快

h) 第三,好像对于英文词典,常数取31,碰撞次数很少
2、 为什么布尔类型选择1231与1237两个素数:因为不能太小,要避开其他类型数据得转换值,也不能太大,有可能跟字符串又撞上了,所以没有道理
5、hashmap与hashtable的区别
a) 三点:线程安全
i. Hashtable是线程安全的,是sychronized的
ii. 但是map可以用concurrenthashmap,它也是线程安全的,且是分段锁,效率比hashtable高很多
b) Hash计算值
i. Hashtable设计的趋向于哈希表分部的更均匀,容量尽量使用素数,且计算hash时直接将hashcode进行求余取模计算。
ii. Hashmap更关注与效率问题,所以他的长度为2的幂次方,这样取模时可以直接进行位运算,比除法强多了。当然hash冲突也增加了。
c) 速度
i. Hashtable效率较低
d) 结构关系;
i. Hashtable(他爹dictionary都obsolete了,)

ii. Hashmap

e) 作者加入了道格•李doug•lea
f) Hashmap支持一次null键多次null value, 因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
g) Hashtable不符合驼峰命名规则
h) 迭代器不同,但是jdk8之后,hashtable也支持fail-fast机制
6、Fail-fast机制
a)追源码,知道arraylist中线程B在调用的add、delete(结构变化,不是修改值)都会引起modcount数+1,再宏观一点,线程A迭代的时候,其中的remove、next()都会调用checkForComodfication方法,检测(modcount==expectedmodcount),这时候线程A就会抛异常。
b) 那么如何应对这种并发进程中的修改造成的异常呢
方法1:所有涉及到改变modcount的地方全都加锁
方法2:使用CopyOnWriteArrayList(追源码,)
6.1volatile变量
• 对volatile变量执行读操作时,都要强制的先从主内存读取最新的变量值到工作内存,然后再读工作内存中所存储的变量副本
• 对volatile变量执行写操作时,又会强制的将工作内存中的刚刚改变的值写到主内存中去
6.2CopyOnWriteArrayList(五点)
想到CopyOnWriteArrayList脑子中应该立马出现几个关键词:
1)线程安全的List ,写有锁,读没有
2)脏读
3)写时复制COW
4)底层volatile Object[] 初始0长度
5)读多写少场景

两个重要属性

迭代特点
用到的快照的思路,使得在迭代的过程中,只是Object数组之前的某个快照,而不是最新的Object,读是可以并发的,读的数据可能是老的 。


http://www.ppmy.cn/news/834997.html

相关文章

【Java学习日记】Day1之Java语言基础

Day1 Java语言基础 1.1基本数据类型 八大基本数据类型 A.数值型:a.整数型:byte,short,int,long b.浮点型:float,double B.布尔型:boolean C.字符型:char(定义时用单引号表示) 1.2运算符 #1.2.1运算符 赋值运算符:“” int a …

C语言:丹尼斯·里奇的不朽遗产

C语言:丹尼斯里奇的不朽遗产 爱伦坡 发表于 2012-10-08 00:11 46885 阅读 纪念已故的丹尼斯里奇--于丹尼斯里奇(Dennis M. Ritchie)纪念日在贝尔实验室的演讲,新泽西梅山,2012年9月7日 今天,我们齐聚此…

vue框架的学习-基础部分

1:vue的安装 使用一个框架,我们第一步要做什么呢?安装下载它 安装Vue的方式有很多: 方式一:直接CDN引入 你可以选择引入开发环境版本还是生产环境版本 <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/…

1121-世纪电源网自己经常上的几个网站

http://bbs.21dianyuan.com/thread-170420-1-1.html http://bbs.21dianyuan.com/thread-174492-1-1.html 好久不发帖&#xff0c;今天整理下了收藏夹&#xff0c;发现一些网站资料可以供大家参考&#xff0c;基本上个人经常上去看看&#xff1a; 注&#xff1a;基本上都是英文…

node.js的理解

http协议 http协议英文全称HyperText Transfer Protocol&#xff0c;翻译成中文就是超文本传输协议。它是在 1990 年时提出。最早是1.0版本&#xff0c;现在普遍大家使用的是1.1版本 http协议的特点 简单快速&#xff1a;例如常用的方法有 GET、POST、PUT、DELETE等方法。由…

熊猫数据集_使用大数据的熊猫

熊猫数据集 减少多达90%的内存使用量的提示 (Tips for reducing memory usage by up to 90%) When working using pandas with small data (under 100 megabytes), performance is rarely a problem. When we move to larger data (100 megabytes to multiple gigabytes), per…

软件架构风格 仓库风格_功能风格–第5部分

软件架构风格 仓库风格 高阶函数I&#xff1a;函数组成和Monad模式。 什么是高阶函数&#xff1f; 在上一篇文章中&#xff0c;我们看到了一些作为一等公民的函数的示例以及它们可以用于的各种用途。 回顾一下&#xff0c;当函数本身是一个值时&#xff0c;它就是一等公民&…

功能风格–第5部分

高阶函数I&#xff1a;函数组成和Monad模式。 什么是高阶函数&#xff1f; 在上一篇文章中&#xff0c;我们看到了一些作为一等公民的函数的示例以及它们可以用于的各种用途。 回顾一下&#xff0c;当函数本身是一个值时&#xff0c;它就是一等公民&#xff0c;并且可以像其他任…