字符串中的hashcode

@[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,读是可以并发的,读的数据可能是老的 。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值