Java中順序表儲存ID的設計
阿新 • • 發佈:2018-11-30
我定義了一個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);
}
}
}
}