1. 程式人生 > >java【模擬MAP的底層實現】

java【模擬MAP的底層實現】

1.1陣列我們無論是C、Java都會學過:

陣列是一種連續儲存線性結構,元素型別相同,大小相等

陣列

陣列的優點:

存取速度快

陣列的缺點:

事先必須知道陣列的長度
插入刪除元素很慢
空間通常是有限制的
需要大塊連續的記憶體塊
插入刪除元素的效率很低

2.1連結串列說明

看完了陣列,回到我們的連結串列:

連結串列是離散儲存線性結構 n個節點離散分配,彼此通過指標相連,每個節點只有一個前驅節點,每個節點只有一個後續節點,首節點沒有前驅節點,尾節點沒有後續節點。 連結串列

連結串列優點:

空間沒有限制 插入刪除元素很快 連結串列缺點:

讀取速度很慢,複雜度是O(n)

下面是原始碼

package com.bjsxt;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

public class MyMap {
	static int instiallSize=10;
	static Object[] arr=new Object[instiallSize];
	static int size=0;
	
	/****
	 * 
	
	* @Title: addEntry
	
	* @Description: TODO(這裡用一句話描述這個方法的作用)
	
	* @param @param key
	* @param @param value    設定檔案
	
	* @return void    返回型別
	
	* @throws
	 */
	public static void addEntry(String key,String value){
		if(StringUtils.isEmpty(value.toString())){
			return;
		}
		SxtEntry x=new SxtEntry(key,value);
		if(arr.length==size){//擴容
			arr=Arrays.copyOf(arr, arr.length+instiallSize);	
			System.out.println("擴容成功,陣列大小為"+arr.length);
		}
		int jsSize=key.hashCode()%arr.length;//對這個取模
		
		if(arr[jsSize]!=null){
			//不等於空就取出列表,將物件加入進去即可
			LinkedList<SxtEntry> linkList= (LinkedList<SxtEntry>) arr[jsSize];
			linkList.add(x);
			arr[jsSize]=linkList;
		}else{
			//等於空,則建立連結串列
			LinkedList<SxtEntry> list=new LinkedList<SxtEntry>();
			list.add(x);
			arr[jsSize]=list;
		}
		size++;
	}
	
	/***
	 * 
	
	* @Title: removeEntry
	
	* @Description: TODO(這裡用一句話描述這個方法的作用)
	
	* @param @param key
	* @param @return    設定檔案
	
	* @return SxtEntry    返回型別
	
	* @throws
	 */
	public static SxtEntry removeEntry(String key){
		int jsSize=key.hashCode()%arr.length;
		if(arr[jsSize]==null){
			//如果沒有找到,則返回null,剔除失敗
			return null;
		}else{
			LinkedList<SxtEntry> linkList= (LinkedList<SxtEntry>) arr[jsSize];
			for(SxtEntry sxt:linkList){
				if(sxt.key.equals(key)){
					//如果遇到,就幹掉它
					linkList.remove(sxt);
				}
			}
			return null;
		}
	}
	
	public static SxtEntry getEntry(String key){
		int jsSize=key.hashCode()%arr.length;
		if(arr[jsSize]==null){
			//如果沒有找到,則返回null,剔除失敗
			return null;
		}else{
			LinkedList<SxtEntry> linkList= (LinkedList<SxtEntry>) arr[jsSize];
			for(SxtEntry sxt:linkList){
				if(sxt.key.equals(key)){
					//如果遇到,就返回這個物件
					return sxt;
				}
			}
			return null;
		}
	}
	
	
	
	public static void main(String[] args){
		
		//第一步放入物件,現在放入了20個物件
		for (int i=0;i<10;i++){
			addEntry("x"+i,"vvvv"+i);
		}
		for (int i=0;i<10;i++){
			//這時候就去擴容了
			addEntry("x==>"+i,"vvvv==>"+i);
			
			//addEntry("x==>"+i,"vvvv-->"+i);
		}
		
		//Object[] arr=new Object[instiallSize];
		System.out.println("map陣列的大小為"+arr.length);
		//遍歷map,取出裡面所有的物件
		for(Object ls:arr){
			if(ls!=null){
				LinkedList<SxtEntry> list=(LinkedList<SxtEntry>)ls;
				for(SxtEntry sxt:list){
					if(sxt!=null){
						System.out.println(sxt.toString());
					}
				}
			}
		}
		
	
		//第二步傳入key值得到物件
		SxtEntry entry=getEntry("x==>0");
		String s1=entry==null?null:entry.value;
		System.out.println("得到的value="+s1);
		
		
		//第三部,剔除key
		
		removeEntry("x==>0");
		SxtEntry entry2=getEntry("x==>0");
		String s2=(null==entry2?"":entry2.value);
		System.out.println("的到的value2="+s2);
		
		
		
		
	}
}

class SxtEntry{
	String key;
	String value;
	public SxtEntry(String key,String value){
		this.key=key;
		this.value=value;
	}
	@Override
	public String toString() {
		return "SxtEntry [key=" + key + ", value=" + value + "]";
	}
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	
	
}

勵志語:越長大越明白一句真理:機會是留給有準備的人的

V:18612372242 歡迎學習交流