JAVA學習筆記20——String3_實踐環節:構造自己的MyArrayList

最近在看JAVA教學的視頻,覺得老師講的很好,同時借用源代碼還有筆記來撰寫本系列博客,記錄自己的學習內容,同時也供看到的人學習。

這篇來進行一個實踐,上一篇我們介紹了StringBuilder,相比於String,作爲可變字符序列的它已經有了很明顯的優勢,但是在對象種類無數的JAVA裏面,StringBuilder所提供的數組成員也要完全一樣的,只靠它是不行滴~那麼問題來了,怎樣構造一個“超級容器”去盛放各種各樣的對象而又讓他們構成一個數組呢?那就是JAVA的一個大容器——ArrayList,以Object[] elements爲結構的它完全可以包含任何類型的對象,同時ArrayList也是邁向JAVA數據結構世界的一個大門,本篇要實踐的內容就是參考StringBuilder類和ArrayList類的JDK源碼來仿造出一個MyArrayList,代碼如下,部分解釋已經寫在註釋部分:

<span style="font-size:14px;">import java.util.ArrayList;
/**
 * 仿造StringBuilder類,模擬實現JDK中提供的ArrayList類,創造一個容器,可以裝各種各樣的對象。
 */
public class MyArrayList {
	/**
     * The value is used for object storage.
     */
    private Object[] value;
    /**
     * The size is the number of objects used.
     */
    private int size;
    public MyArrayList(){
    //	value = new Object[16];
    	this(10);   //一個構造器調另一個構造器。
    }
    public MyArrayList(int size){
    	if(size<0){
    		try {
				throw new Exception();  //手動拋出一個異常。 講到異常章節再說,先混個眼熟
			} catch (Exception e) {
				e.printStackTrace();
			}
    	}
    	value = new Object[size];
    }
    
    public int size(){
    	return size;
    }
    public boolean isEmpty() {
        return size == 0;
    }   
    public void add(Object obj){
    	//是變化着的:
    	value[size] = obj;
    	size++;
    	if(size>=value.length){
    		//裝不下了。擴容吧!
    		int newCapacity = value.length*2;
    		//System.arraycopy(src, srcPos, dest, destPos, length);   //這種是調用JDK提供的數組複製的方法,建一個新數組把老的成員拷貝進來,見上一篇筆記。
    		
    		//建一個新的數組,手動拷貝舊的內容:
    		Object[] newList = new Object[newCapacity];
    		//下面是手動拷貝部分:
    		for(int i=0;i<value.length;i++){
    			newList[i] = value[i];
    		}
    		value = newList;
    	}
    }    
    public Object get(int index){
    	rangeCheck(index);   //調用檢測是否越界的方法。
    	return value[index];
    }
    public int indexOf(Object obj){
    	if(obj==null){
    		return -1;          
    	}else{
    		for(int i=0;i<value.length;i++){
    			if(obj==value[i]){
    				return i;
    			}
    		}
    		return -1;   //循環一遍之後如果還沒有相等的那就報空(返-1)
    	}
    }
    public int lastIndexOf(Object obj){
    	if(obj==null){
    		return -1;
    	}else{
    		for(int i=value.length-1;i>=0;i--){
    			if(obj==value[i]){
    				return i;
    			}
    		}
    		return -1;
    	}
    }
    public Object set(int index, Object object) {
    	rangeCheck(index);
    	Object old = value[index];
        value[index] = object;
        return old;
    }
    public void rangeCheck(int index){
    	if(index<0||index>size-1){    //[0,size-1]
    		try {
				throw new Exception();  //手動拋出一個異常。 講到異常章節再說
			} catch (Exception e) {
				e.printStackTrace();
			}
    	}
    }
    public static void main(String[] args) {
		MyArrayList  list = new MyArrayList(2);
		list.add("aaa");    //index = 0
		list.add(new Human("高琪"));   //index = 1
		list.add("bbbb");
		list.add("bbbb");
		list.add("bbbb");
		list.add("bbbb");
		ArrayList list2;
		Human h = (Human) list.get(1);  //強制轉型,由value型轉爲Human型。
		System.out.println(h.getName());
//		System.out.println(list.get(3)); 
		System.out.println(list.size());
	}
}</span>
<span style="font-size:14px;">public class Human {
	private String name;
	public Human(String name) {
		super();
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}</span>
建議閱讀或者編寫、調試上述代碼的時候對比着JDK文檔的源碼看纔能有不少收穫,看源碼的方法上一篇筆記已經介紹過了,這裏就不贅述了。

終於寫到第20篇了~~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章