Javase 自定义map和hashcode equals

0 Map

  HashMap:线程不安全

  HashTable:线程安全 

hashcode和equals方法要重写的时候要一起重写,保证equals一样的情况下 hashcode一定相等,一般情况下不需要重写。

hashcode: 默认返回地址, 在使用eclipse定义的Javabean中自动生成的hashcode中,会生成一个防范来进行散列。

equals: 默认根据两个对象的地址进行比较

如果equals为true,则hashcode一定相等,而如果 hashcode相等,但是 equals不一定一样。

2 自定义map, 还是用数组接收:

第一种写法:

public class SxtMap001 {
	
	SxtEntry[]  arr  = new SxtEntry[990]; // 还是使用数组来存储, 而数组的组成体是 自定义的bean,里面有k v两个属性
	int size;
	
	public void put(Object key,Object value){
		SxtEntry e = new SxtEntry(key,value);
		//解决键值重复的处理
		for(int i=0;i<size;i++){
			if(arr[i].key.equals(key)){
				arr[i].value=value;
				return ;
			}
		}
		
		arr[size++] = e;
	}
	
	public Object get(Object key){
		for(int i=0;i<size;i++){
			if(arr[i].key.equals(key)){
				return arr[i].value;
			}
		}
		return null;
	}
	
	public boolean containsKey(Object key){
		for(int i=0;i<size;i++){
			if(arr[i].key.equals(key)){
				return true;
			}
		}
		return false;
	}
	
	public boolean containsValue(Object value){
		for(int i=0;i<size;i++){
			if(arr[i].value.equals(value)){
				return true;
			}
		}
		return false;
	}
	
	
	
	public static void main(String[] args) {
		SxtMap001 m = new SxtMap001();
		m.put("zm", new Wife("liangliang"));
		m.put("zm", new Wife("meimei"));
		Wife w = (Wife) m.get("zm");
		System.out.println(w.name); 
	}

}

class  SxtEntry {
	Object key;
	Object value;
	
	public SxtEntry(Object key, Object value) {
		super();
		this.key = key;
		this.value = value;
	}	
}

第二种写法:

public class SxtMap002 {
       //特殊的数组,组成数组的元素是LinkedList  eg String[] 则数组成员是String
	LinkedList[]  arr  = new LinkedList[9]; //Map的底层结构就是:数组+链表!
	int size;
	
	public void put(Object key,Object value){
		SxtEntry  e = new SxtEntry(key,value);
		
		int hash = key.hashCode();
		hash = hash<0?-hash:hash;
		
		int a = hash%arr.length;
		if(arr[a]==null){
			LinkedList list = new LinkedList();
			arr[a] = list;
			list.add(e);
		}else{
			LinkedList list = arr[a];
			for(int i=0;i<list.size();i++){
				SxtEntry e2 = (SxtEntry) list.get(i);
				if(e2.key.equals(key)){
					e2.value = value;  //键值重复直接覆盖!
					return;
				}
			}
			
			arr[a].add(e);
		}
		//a:1000-->1   b:10000-->13
	}

	public Object get(Object key){
		int a = key.hashCode()%arr.length;
		if(arr[a]!=null){
			LinkedList list = arr[a];
			for(int i=0;i<list.size();i++){
				SxtEntry e = (SxtEntry) list.get(i);
				if(e.key.equals(key)){
					return e.value;
				}
			}
		}
		
		return null;
	}
	
	public static void main(String[] args) {
		SxtMap002 m = new SxtMap002();
		m.put("zm", new Wife("liangliang"));
		m.put("zm", new Wife("huanghuang"));
		Wife w = (Wife) m.get("zm");
		System.out.println(w.name); 
	}

}

第二种写法的图:



 

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2398239