java 自定义arraylist_Java 中模仿源码自定义ArrayList
Java 中模仿源碼自定義ArrayList
最近看了下ArrayList的源碼,抽空根據(jù)ArrayList的底層結(jié)構(gòu)寫了一個(gè)功能簡(jiǎn)單無(wú)泛型的自定義ArrayLsit,幫助自己更好理解ArrayList:,其實(shí)現(xiàn)的底層數(shù)據(jù)結(jié)構(gòu)為數(shù)Object組,代碼如下:
/**
* 自己實(shí)現(xiàn)一個(gè)ArrayList
*
*/
public class MyArrayList {
private Object[] elementData;
private int size;
public int size(){
return size;
}
public boolean isEmpty(){
return size==0;
}
//默認(rèn)容量為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];
}
/**
* 添加一個(gè)元素
* @param obj
*/
public void add(Object obj){
//數(shù)組擴(kuò)容和數(shù)據(jù)的拷貝,重新new一個(gè)數(shù)組
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
}
/**
* 刪除對(duì)應(yīng)的元素(利用equal判斷元素是否一致)
* @param obj
*/
public void remove(Object obj){
for(int i=0;i
if(get(i).equals(obj)){ //注意:底層調(diào)用的equals方法而不是==.
remove(i);
}
}
}
/**
* 設(shè)置索引對(duì)應(yīng)的元素
* @param index
* @param obj
* @return
*/
public Object set(int index,Object obj){
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
/**
* 將元素插入對(duì)應(yīng)的位置
* @param index
* @param obj
*/
public void add(int index,Object obj){
rangeCheck(index);
ensureCapacity(); //數(shù)組擴(kuò)容
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = obj;
size++;
}
/**
* 數(shù)組擴(kuò)容
*/
private void ensureCapacity(){
//數(shù)組擴(kuò)容和數(shù)據(jù)的拷貝
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;
}
}
/**
* 數(shù)組下標(biāo)檢查
* @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));
}
}
}
測(cè)試結(jié)果:
333
444
5
344433
333
333
------------------------------
333
5
a
344433
333
333
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
總結(jié)
以上是生活随笔為你收集整理的java 自定义arraylist_Java 中模仿源码自定义ArrayList的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL数据库https接口_第三章
- 下一篇: java set 包含_关于Java的S