1. 程式人生 > >Java基礎——陣列佇列的原理和實現

Java基礎——陣列佇列的原理和實現

1.陣列

1.1 陣列基本概念

陣列是一個容器,可以儲存同一資料型別的N個數據;

陣列是一個數據結構,是資料結構中訪問速度最快的;

陣列是直接通過下標進行定位;

陣列是屬於引用資料型別(陣列名中儲存的是記憶體首地址);

陣列本身只有有length屬性(獲取陣列能儲存的資料個數),但是有從Objuect父類繼承的屬性和方法。

 

1.2陣列在記憶體中的儲存:

陣列在記憶體中是一個連續的儲存空間;

一維陣列、二維陣列....

 

1.3陣列排序:

堆排序

 

2.陣列佇列

利用陣列這個資料結構,來實現多個數據的類。

 

陣列在定義的時候要定義型別和大小,定義完後不能修改(不能動態改變大小和資料型別)。

儲存資料的個數是會根據實際情況進行變化,但是陣列大小無法改變。

不確定要儲存的個數:

        陣列定義大了,資料小了,浪費空間;

        陣列定義小了,資料多了,越界、儲存不下。

        要滿足上述兩種要求,利用陣列名中儲存的是陣列物件在堆記憶體中的首地址。

 

儲存資料型別,在單獨某一個程式使用中是不會存在太大問題。

        陣列佇列是否能夠通用,資料型別。

        Object是所有類的父類:Java中所有基本資料型別都由對應一個類,其父類為Object。

        如果要求陣列中只能儲存某一種資料型別;

        如果要求陣列中可以儲存任何資料型別。

        要滿足上述兩種要求,只能使用Java泛型。

        泛型不是資料型別,是一種特殊的符號,用於泛指Java中任意一種引用型別。

        在編寫陣列佇列(提供的外掛類),不確定之後要儲存的資料型別,則只能使用泛型的表示。

        泛型在此處只是一個佔位符,之後在使用中。

 

3.原始碼

3.1 myArrayList<E>

package com.java8.arraylist;

/**
 * 自定義陣列佇列類
 *
 * @param <E>
 */
public class myArrayList<E> {

    // 宣告陣列名稱:Object陣列型別,使用時可以適配所有型別
    // 不要忘記Object[],後面要加[]
    private Object[] array;
    //初始化陣列序號index
    private int index = 0;
    //初始化陣列的長度length
    private int length = 1;

    /**
     * 無參建構函式
     * 構造array物件,初始化大小為length = 1
     */
    public myArrayList() {
        array = new Object[length];
    }

    /***
     * 新增元素與陣列佇列
     * @param e
     */
    public void add(E e) {
        //1.若放入的第index個元素,比陣列長度小,則直接放入
        if (index < length) {
            array[index] = e;
            index++;
        }
        //2.若放入的第index個元素,比陣列長度大,則:擴充陣列長度
        else {
            //2.1 新建一個2倍length的陣列tempArray:資料型別Object[]
            Object[] tempArray = new Object[2 * length];
            //2.2 複製array的全部值(index=length個)至tempArray
            for (int i = 0; i < index; i++) {
                tempArray[i] = array[i];
            }
            //2.3 將最新的元素,放入tempArray
            tempArray[index] = e;
            //2.4 更新array為tempArray【千萬不要忘記!!!】
            array = tempArray;
            //2.5 更新長度length
            length = tempArray.length;
            //2.6 更新序號index
            index++;
        }
    }

    /**
     * 陣列大小
     * @return:int 陣列大小
     */
    public int size(){
        //序號往往是最好一個,陣列佇列的size也就是序號值
        return index;
    }

    /**
     * 第index個元素
     * @param index:int,第幾個
     * @return 返回陣列佇列中的第index個元素,E型別
     */
    public E get(int index){
        if(index<0||index>length){
            return null;
        }else{
            //(E):表示將Object類的元素,強制轉換為E型別的元素
            return (E) array[index];
        }
    }
}

3.2 測試程式碼myManage

package com.java8.arraylist;

import java.util.Random;

public class MyManage {
    public static void main(String arg[]) {

        //建立陣列佇列物件
        myArrayList<Integer> listInt = new myArrayList<Integer>();
        //隨機獲取size的大小,長度不定
        int size = new Random().nextInt(20) + 1;

        //放置元素於陣列佇列:add(i)
        for (int i = 0; i < size; i++) {
            listInt.add(i);
        }

        //輸出陣列佇列所有元素:size()和get(i)
        for (int i = 0; i < listInt.size(); i++) {
            System.out.println("第index個元素為:" + listInt.get(i));
        }
    }

}