设计HashMap中元素put顺序和输出顺序相同

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 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) {
		Mapmap = 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 = map.entrySet().iterator();
		while (entry.hasNext()) {
			Map.Entrykey_value = entry.next();
			System.out.println("键值对是:"+key_value.getKey()+"-"+key_value.getValue());
		}
	}
	
	
	
}

设计HashMap中元素put顺序和输出顺序相同_第1张图片

你可能感兴趣的:(设计HashMap中元素put顺序和输出顺序相同)