不同字符串,HashCode可能相同
不同的字符串,hashcode可能相同。
先看例子:
@Test
public void test6(){
System.out.println("ABCDEa123abc".hashCode()); //
System.out.println("ABCDFB123abc".hashCode()); //
}
源码:String.class
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value; for (int i = 0; i < value.length; i++) {
//上次一算出的hash值乘以31 然后再加上当前字符编码值
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
分析:int 在java中4个字节,[-2^31,2^31-1] (注意,数学表示方法,实际java用Math.pow(2,31))
int肯定会有一个上限,当字符长时产生的数值过大int放不下时会进行截取,一旦截取HashCode的正确性就无法保证了,所以这点可以推断出HashCode存在不相同字符拥有相同HashCode。
那为什么HashMap可以照常获取val呢?
@Test
public void test6(){
System.out.println("ABCDEa123abc".hashCode()); //
System.out.println("ABCDFB123abc".hashCode()); // Map<String,String> map = new HashMap<String,String>();
map.put("ABCDEa123abc","123");
map.put("ABCDFB123abc","321"); System.out.println(map.get("ABCDEa123abc"));
System.out.println(map.get("ABCDFB123abc")); }
结果:
165374702
165374702
123
321
看下获取的源码:
(1)获取Node[] 数组对应的Node元素, first = tab[(n - 1) & hash]
(2)如果不是Entry第一个元素,就指向Next。也就是说当hash相同时,只是说明所在的数组位置一样,后续还是需要key比较;
不同字符串,HashCode可能相同的更多相关文章
- Java equals 和 hashcode 方法
问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...
- 聊一聊Java字符串的不可变
前言 在 Java 开发中 String (字符串)对象是我们使用最频繁的对象,也是很重要的对象.正是使用得如此频繁,String 在实现层面上不断进行优化,从 Java6 到 Java7,再到 Ja ...
- No.1.测试Synchronized加锁String字符串后的多线程同步状况
测试目的描述 Synchronized关键字锁定String字符串可能会带来严重的后果, 尽量不要使用 synchronized(String a) 因为JVM中,因为字符串常量池具有缓冲功能! 接下 ...
- java String hashCode遇到的坑
在进行数据交换时,如果主键不是整型,需要对字符串,或联合主键拼接为字符串,进行hash,再进行取模分片,使用的是String自带的hashCode()方法,本来是件很方便的事,但是有些字符串取hash ...
- java7笔记
1 switch case 增加字符串类型,原理根据字符串hashcode以及string.equal比较2 数值字面量改进 新增二进制数值字面量 0b000004,在数值中间新增下划线方便阅读200 ...
- [搜片神器]DHT后台管理程序数据库流程设计优化学习交流
谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器: sosobt.com 大家可以给提点意见... 服务器在抓取和处理同时进行,所以访问速度慢是有些的,特别是搜索速度通过SQL的like来查 ...
- 《Java程序员面试笔试宝典》之switch使用时有哪些注意事项
switch语句用于多分支选择,在使用switch(expr)的时候,expr只能是一个枚举常量(内部也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或其对应的包装类In ...
- java工程师-面试知识点总结
目录(转载) [x] 一.Java基础(语言.集合框架.OOP.设计模式等) [x] 二.Java高级(JavaEE.框架.服务器.工具等) [x] 三.多线程和并发 [x] 四.Java虚拟机 [x ...
- day05(Object,tostring(),equals(),System,Date,SimpleDateFormat,拆装箱,正则表达式)
Object类, 是所应类的父类: 拥有自己的方法:常用的 红颜色标记的为常用的方法 toString() 用法:打印对象的地址值 getClass() 获取当前类的字节码文件getName() ...
- Java精选笔记_JSP技术
JSP技术 JSP概述 什么是JSP 在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术. 在JSP文件中,HTML代码与Java代码共同存在,其中,H ...
随机推荐
- linux操作系统的调度策略
linux的进程分为两种 1.实时进程,优先级高,操作系统会优先执行这种进程 2.普通进程,大多数的进程都是这种进程 调度策略 unsigned int policy; 调度策略的定义 #define ...
- centos7系统乱码问题解决
操作步骤: 查看当前系统的默认语言 echo $LANG 查看系统支持的语言库 locale 如果没有要设置的语言需要安装一下 yum groupinstall chinese-support -y ...
- Linux mysql 乱码
http://www.pc6.com/infoview/Article_63586.html http://itindex.net/detail/41748-linux-mysql-5.5 http: ...
- go 结构体取代类
我们知道go的结构体有点类的感觉,可以有自己的属性和方法. 但是由于结构体的属性都是有零值的,我们在创建结构体的时候并不需要设置这些属性的值就能创建,但是这样创建的结构体往往没有什么实用价值. 我们可 ...
- Java的socket编程中关于bufferedWriter的发送问题
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String send ...
- Move Over and Click Link
Move Over and Click Link [Documentation] 等待悬浮菜单中的元素出现并单击元素 [Arguments] ${hover_locator} ${opt_locato ...
- ARC096E Everything on It 容斥原理
题目传送门 https://atcoder.jp/contests/arc096/tasks/arc096_c 题解 考虑容斥,问题转化为求至少有 \(i\) 个数出现不高于 \(1\) 次. 那么我 ...
- NOSQL导图
- Python中使用"subplot"在一张画布上显示多张图
subplot(arg1, arg2, arg3) arg1: 在垂直方向同时画几张图 arg2: 在水平方向同时画几张图 arg3: 当前命令修改的是第几张图 t = np.arange(0,5,0 ...
- 什么是ppa
What is ppa? PPAs are for non standard software/updates. They are generally used by people who want ...