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