Java基礎——陣列佇列的原理和實現
阿新 • • 發佈:2018-12-05
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));
}
}
}