1. 程式人生 > >Java中順序表儲存ID的設計

Java中順序表儲存ID的設計

我定義了一個ArrayId類,內部封裝了一個數組和對陣列的操作方法。
主要實現了陣列的自動擴容,註冊時返回一個沒有空的id,前面如果有空位置優先前面的,對空位做記錄,犧牲部分空間來提高執行效率。
下圖size就是實際儲存的大小,size和end之間是曾經刪除過的記錄。
這是一個解釋圖


public class ArrayId<E> implements Serializable {
    Object obs[];
    private int realsize;
    private int size;//實際存值的最後一個位置
    private int end;//記錄空缺的最後位置
ArrayId(){ realsize=64; obs=new Object[realsize]; } public synchronized int add(Object o){//傳入物件並且返回物件最後存放的位置 int index=0; if(obs[size]==null){ obs[size]=o; index=size; size++; end++; if(size*2>
realsize){//如果儲存資料超過陣列的一半就擴大陣列為原來的兩倍 realsize*=2; Object obs2=obs; obs=new Object[realsize]; System.arraycopy(obs2,0,obs,0,realsize); } }else{ index=(int)obs[end-1]; obs[index]=o; obs[
end-1]=null; end--; } return index; } public synchronized void remove(int index){//移除這個位置的元素,並記錄這個位置 if(index==size-1){ obs[index]=null; obs[index]=obs[end-1]; obs[end-1]=null; size--; end--; }else{ obs[index]=null; obs[end]=index; end++; } } public synchronized E get(int index){ E o=null; if(index>=0&&index<=size) o=(E)obs[index]; return o; } public synchronized void showall(){ for(int i=0;i<size;i++){ if(obs[i]!=null){ Users u=(Users)obs[i]; System.out.println("ID"+u.ID+" 使用者名稱"+u.name+" 密碼"+u.password); } } } }