设计HashMap中元素put顺序和输出顺序相同
来源:互联网 发布:淘宝主播怎么做 编辑:程序博客网 时间:2024/05/23 00:08
HashMap 采用“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(Object1,Obect2)方法 时,系统将调用Object1的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。源码如下:
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; //判断当前确定的索引位置是否存在相同hashcode和相同key的元素,如果存在相同的hashcode和相同的key的元素,那么新值覆盖原来的旧值,并返回旧值。 //如果存在相同的hashcode,那么他们确定的索引位置就相同,这时判断他们的key是否相同,如果不相同,这时就是产生了hash冲突。 //Hash冲突后,那么HashMap的单个bucket里存储的不是一个 Entry,而是一个 Entry 链。 //系统只能必须按顺序遍历每个 Entry,直到找到想搜索的 Entry 为止——如果恰好要搜索的 Entry 位于该 Entry 链的最末端(该 Entry 是最早放入该 bucket 中), //那系统必须循环到最后才能找到该元素。 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }因此,我们put进去元素的时候,元素因为自己的hashcode值分配到的存储位置而导致了元素的无序。所以要使得put进去元素和输出元素的顺序一样,只需要我们put进去的hashcode值和我们put的次序相同或保持同步递增,只要hashcode值按次序从小到大即可满足。重写hashcode源码如下:
import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;public class ObjectEntity {
//如果有参数,那么还要重写equals方法
//private String put;//@Override//public boolean equals(Object obj) {////if(!(obj instanceof Entity))//return false;////Entity entity = (Entity)obj;////return entity.put == put;//}
static关键字代表index是属于类的属性
private static int index = 0;@Override
//鉴于有人剔除不同意见,说不能实现:我个人猜测,最重要一点在与final关键字,这是强制使得hash值和put顺序同步增长的关键public final synchronized int hashCode() {return index ++;}测试main方法如下:
public static void main(String[] args) {Map<Entity, Object>map = new HashMap<>();map.put(new ObjectEntity(), 5);map.put(new ObjectEntity(), 4);map.put(new ObjectEntity(), 1);map.put(new ObjectEntity(), 52);System.out.println(map);System.out.println("----------------------------------------------------------------------------");Iterator<Entry<Entity, Object>>entry = map.entrySet().iterator();while (entry.hasNext()) {Map.Entry<Entity, Object>key_value = entry.next();System.out.println("键值对是:"+key_value.getKey()+"-"+key_value.getValue());}}}
0 0
- 设计HashMap中元素put顺序和输出顺序相同
- Java Hashmap中元素的顺序问题
- 按顺序取出HashMap的put 值
- 顺序表删除和X相同的所有元素(C)
- 使用HashMap输出的顺序
- Java中关于HashMap的元素遍历的顺序问题
- Java中关于HashMap的元素遍历的顺序问题
- Java中关于HashMap的元素遍历的顺序问题
- 顺序表删除相同的元素
- HashMap元素遍历的顺序问题
- HashMap按value的顺序输出
- Java中HashMap和TreeMap的顺序问题
- java查看字符串中有多少相同的字母,并且按顺序输出
- 字符串数组元素计数,按顺序输出
- 集合中元素的顺序
- 调整表中元素顺序
- 顺序容器中添加元素
- java中实现HashMap中的按照key的字典顺序排序输出
- sql分页语句
- C# VS2010 windows服务的安装
- python学习之 字符串前'r'的用法
- java 加密jdbc连接
- c++
- 设计HashMap中元素put顺序和输出顺序相同
- Web前端面试指导(四十五):页面渲染原理是什么?
- 《汇编语言》学习(十)call and ret
- 知道这20个正则表达式,能让你少写1,000行代码
- Oracle PLSQL 学习笔记一
- Unity3d 必备的几种优秀的设计模式
- linux内核源码总览之0000--------备分,未整理,文件访问1
- java基础1-第一个程序
- MyBatis中实现动态的SQL语句、分页以及mybatis的常用的配置