java arraylist实现_java实现ArrayList基本功能
本篇介紹手動實現(xiàn)一個ArrayList的基本功能。
ArrayList的底層是一個動態(tài)數(shù)組,這個有別于LinkedList的鏈表。代碼實現(xiàn)了ArrayList的基本功能,所以沒有實現(xiàn)ArrayList實現(xiàn)的一些接口,比如:RandomAccess和Serializable等。
方法名
作用
getSize()
獲取數(shù)組大小
checkIncrease(int index,Object obj)
擴(kuò)容,將原來的數(shù)組擴(kuò)容一倍并將原來數(shù)據(jù)拷貝到新數(shù)組
indexOf(Object o)
根據(jù)元素獲取在數(shù)組中首次出現(xiàn)的索引值
add(Object o)
往數(shù)組中添加元素
remove(int index)
刪除數(shù)組中的元素如果此元素不在數(shù)組最后位置則將其后面的每個元素向前移動一位
checkIndexOut(int index)
檢查所給下標(biāo)是否越界
get(int index)
獲取指定下標(biāo)數(shù)據(jù)
removeAll()
清空數(shù)組
change(int index,Object o)
修改對應(yīng)索引的值
contains(Object o)
判斷是否包含對應(yīng)值
isEmpty()
判斷是否為空
public class MyArrayList {
//用于存儲數(shù)據(jù)
private Object[] data = null;
//集合的元素個數(shù)
private int size = 0;
//定義一個常量為 10.(后面用于定義默認(rèn)的集合大小)
private static final int DEFAULT_CAPACITY = 10;
/**
* 無參構(gòu)造函數(shù),指定初始大小為10
*/
public MyArrayList(){
this(DEFAULT_CAPACITY);//調(diào)用有參構(gòu)造函數(shù)
}
/**
* 有參構(gòu)造函數(shù),指定數(shù)組大小
* @param initialCapacity
*/
public MyArrayList(int initialCapacity){
if(initialCapacity < 0){//判斷數(shù)組大小不嗯呢該為負(fù)數(shù)
throw new IllegalArgumentException("非法的集合初始容量值 Illegal Capacity: "+initialCapacity);
}else{
//實例化數(shù)組
this.data = new Object[initialCapacity];
}
}
/**
* 獲取數(shù)組大小
* @return
*/
public int getSize(){
return size;
}
/**
* 擴(kuò)容,復(fù)制原來的數(shù)組并擴(kuò)容一倍
* @param index
* @param obj
*/
public void checkIncrease(int index,Object obj){
if(size >= data.length){//原來數(shù)組放滿之后進(jìn)行擴(kuò)容
//實例化一個新數(shù)組
Object[] newData = new Object[size*2];
if(index == -1 && obj == null){
System.arraycopy(data, 0, newData, 0, size);
}else{
//將要插入索引位置前面的對象 拷貝
System.arraycopy(data, index, newData, index+1, size-index);
}
data = newData;
newData = null;
}
}
/**
* 根據(jù)元素獲得在集合中首次出現(xiàn)的索引
* @param o
* @return
*/
public int indexOf(Object o){
if(o == null){
for(int i = 0,len=data.length;i
if(data[i] == null){
return i;
}
}
}else{
for(int i=0,len=data.length;i
if(o.equals(data[i])){
return i;
}
}
}
return -1;
}
/**
* 在尾部添加元素
* @param o 需要被添加的元素
*/
public boolean add(Object o){
//檢查是否需要擴(kuò)容
checkIncrease(-1,null);
data[size++] = o;
return true;
}
/**
* 根據(jù)索引刪除元素
* @param index
* @return
*/
public boolean remove(int index){
if(checkIndexOut(index)){//判斷數(shù)組是否越界
if(index == size-1){//如果要刪除的元素為最后一個元素
data[index] = null;
}else{//如果刪除的元素不為最后一個元素則需要將此元素之后的元素向前移一位
System.arraycopy(data,index+1,data,index,size-index);
}
size--;
return false;
}else{//數(shù)組越界情況
throw new IndexOutOfBoundsException("指定的索引越界,集合大小為:"+size+",您指定的索引大小為:"+index);
}
}
/**
* 判斷給定索引是否越界
* @param index
* @return
*/
public boolean checkIndexOut(int index){
if(index >= size || index <0){
// throw new IndexOutOfBoundsException("指定的索引越界,集合大小為:"+size+",您指定的索引大小為:"+index);
return false;
}
return true;
}
/**
* 根據(jù)給定索引獲取元素
* @param index
* @return
*/
public Object get(int index) {
checkIndexOut(index);//判斷是否越界
return data[index];
}
/**
* 刪除所有元素
*/
public void removeAll(){
for(int i=0,len=data.length;i
data[i] = null;
}
size = 0;//
}
/**
* 根據(jù)索引修改元素
* @param index
* @param o
* @return
*/
public boolean change(int index,Object o){
checkIndexOut(index);//判斷是否越界
data[index] = o;
return true;
}
/**
* 判斷某個元素是否存在,若存在則返回索引,不存在返回-1
* @param o
* @return
*/
public int contains(Object o){
for(int i = 0,len=data.length;i
if(o.equals(data[i])){
return i;
}
}
return -1;
}
/**
* 判斷數(shù)組是否為空
* @return
*/
public boolean isEmpty() {
return size == 0;
}
}
總結(jié)
以上是生活随笔為你收集整理的java arraylist实现_java实现ArrayList基本功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java代码的运行顺序_java中的代码
- 下一篇: 小馒头几个月宝宝能吃