java 自定义arraylist_Java 中模仿源码自定义ArrayList
Java 中模仿源碼自定義ArrayList
最近看了下ArrayList的源碼,抽空根據ArrayList的底層結構寫了一個功能簡單無泛型的自定義ArrayLsit,幫助自己更好理解ArrayList:,其實現的底層數據結構為數Object組,代碼如下:
/**
* 自己實現一個ArrayList
*
*/
public class MyArrayList {
private Object[] elementData;
private int size;
public int size(){
return size;
}
public boolean isEmpty(){
return size==0;
}
//默認容量為10
public MyArrayList(){
this(10);
}
/**
* 自定義容量
* @param initialCapacity
*/
public MyArrayList(int initialCapacity){
if(initialCapacity<0){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = new Object[initialCapacity];
}
/**
* 添加一個元素
* @param obj
*/
public void add(Object obj){
//數組擴容和數據的拷貝,重新new一個數組
if(size==elementData.length){
Object[] newArray = new Object[size*2+1];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++]=obj;
// size++;
}
/**
* 通過索引獲取元素
* @param index
* @return
*/
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
/**
* 通過索引刪除元素
* @param index
*/
public void remove(int index){
rangeCheck(index);
int numMoved = size - index - 1;
if (numMoved > 0){
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
}
elementData[--size] = null; // Let gc do its work
}
/**
* 刪除對應的元素(利用equal判斷元素是否一致)
* @param obj
*/
public void remove(Object obj){
for(int i=0;i
if(get(i).equals(obj)){ //注意:底層調用的equals方法而不是==.
remove(i);
}
}
}
/**
* 設置索引對應的元素
* @param index
* @param obj
* @return
*/
public Object set(int index,Object obj){
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
/**
* 將元素插入對應的位置
* @param index
* @param obj
*/
public void add(int index,Object obj){
rangeCheck(index);
ensureCapacity(); //數組擴容
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = obj;
size++;
}
/**
* 數組擴容
*/
private void ensureCapacity(){
//數組擴容和數據的拷貝
if(size==elementData.length){
Object[] newArray = new Object[size*2+1];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
// for(int i=0;i
// newArray[i] = elementData[i];
// }
elementData = newArray;
}
}
/**
* 數組下標檢查
* @param index
*/
private void rangeCheck(int index){
if(index<0||index>=size){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyArrayList list = new MyArrayList(3);
list.add("333");
list.add("444");
list.add("5");
list.add("344433");
list.add("333");
list.add("333");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("------------------------------");
list.remove("444");
list.add(2, "a");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
測試結果:
333
444
5
344433
333
333
------------------------------
333
5
a
344433
333
333
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
總結
以上是生活随笔為你收集整理的java 自定义arraylist_Java 中模仿源码自定义ArrayList的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL数据库https接口_第三章
- 下一篇: java set 包含_关于Java的S