java【模擬MAP的底層實現】
阿新 • • 發佈:2018-12-17
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 歡迎學習交流