java中hashmap的工作原理是什么呢?
解决方案 »
- jsp里小问题
- 帮忙看看啊!!
- 求j2ee的好书一本!!!!
- javamail 不通过邮箱 发送信息
- spring+hibernate
- 重装myeclipse后,启动不了tomcat,报Catalina.start: LifecycleException
- WAS服务器启动报错,求大大们帮忙看下!
- Hibernate连接数据库问题 ?(Eclipse 工具)
- JAVA的java.sql.Date于Oracle的DATE类型之间好像有问题
- 【求助】求大神教我写一个SQL语句,在线急等!!!!
- 關於 eClipse 無法新增 GlassFish Runtime Environment
- java.lang.StringIndexOutOfBoundsException: String index out of range: 9
比如设计个算法苹果算出来是1,香蕉算出来是2,梨子算出来是3,但是有可能你算航空母舰的时候也算出1来了。所以不同的东西用相同的逻辑算法算出的值有可能一样。也就是说hash值相同的对象可能不一样。再来说map,map里面有个Node类型数组,每个对象添加的时候会根据他的hash值来计算出他应该放在数组的哪个位置。而这个node的结构是这样的他里面含有一个Object类型的value用来存放你添加的对象,同时有个next用来指向下一个node。为啥要指向下一个,因为相同的hash值会被放在同样的数组位置,但是hash值相同可能表示不同的对象,所以要判断如果条件的对象和已经在数组那个位置上的对象相同。那么就不添加这个元素,如果不同那么久添加,并且被next为null的这个node节点的value引用。基本原理就是这样。删除,获取自己动脑想吧,差不多的。因为同一个位置可能存在多个不同的对象,所以要用链表或者红黑树来存储,当然你要是自己实现,你想用数组想用队列想用栈同样可以实现,只不过是效率不高罢了
hashcode相同,元素会落在相同的桶中,之后会进行一次比较,所以,hashMap的key都尽可能的实现Comparable接口(参见HashMap的putVal方法实现),也会用 == 比较引用是否相同,不同则置于链表末端(如果是树形化的桶另当别论)
HashMap的中的hash方法对hashCode进行了二次运算,高16位和低16位做异或运算,避免因为hashCode的低位相同而一直落在同一个桶中,
所以HashMap的各个链表大部分时间才都是单节点的.参考 https://blog.csdn.net/ZTzhubajie/article/details/86693946