package xxj.datastructure0810; import java.util.Random; public class DataStructure { /** * @param args */ public static void main(String[] args) { String [] array = {"1","2","3"}; MyArrayList<String> mal = new MyArrayListImpl<String>(); // mal.add(100); // mal.add(new Object()); for(int i=0;i<array.length;i++){ mal.add(array[i]); } Random rand = new Random(); int size = rand.nextInt(20); for(int i=0;i<size;i++){ mal.add(""+((char)(rand.nextInt(26)+97))); } System.out.println("size = "+size); for(int i=0;i<mal.size();i++){ System.out.println(mal.get(i)); } } }
package xxj.datastructure0810; /** * 自定義數組隊列的接口,同時使用<E>表示該接口支持泛型 */ public interface MyArrayList<E> { /** * 添加元素到數組隊列中的方法 * @param e要添加的元素 */ public void add(E e); /** * 向數組隊列中指定的位置插入一個新的元素 * @param index要插入元素的所在的索引位置 * @param e要插入的新元素 * @return 返回true表示插入成功,返回false表示插入失敗 */ public boolean add(int index,E e); /** * 根據指定的索引位置,從數組隊列中移除一個元素 * @param index要移除元素所在的索引位置 * @return 返回null表示移除失敗,否則會返回移除的元素 */ public E remove(int index); /** * 移除指定的元素 * @param e要移除的元素 * @return 返回值true表示執行成功,返回false表示執行失敗 */ public boolean remove(E e); /** * 修改指定索引位置的元素 * @param index要修改元素的位置 * @param e新的元素 * @return 返回值true表示執行成功,返回false表示執行失敗 */ public boolean update(int index,E e); /** * 修改指定元素的內容 * @param oldE要修改的元素 * @param e新的元素 * @return 返回值true表示執行成功,返回false表示執行失敗 */ public boolean update(E oldE,E e); /** * 獲取數組隊列中存儲的元素總數 * @return 返回數組隊列中存儲的元素總數屬性 */ public int size(); /** * 獲取指定索引位置的元素 * @param index要獲取元素的索引位置 * @return 返回null表示獲取失敗,否則會返回獲取到的元素 */ public E get(int index); }
package xxj.datastructure0810; /** * 定義數組隊列的實現類,該類實現了MyArrayList接口 * * @author 熊哥 * */ public class MyArrayListImpl<E> implements MyArrayList<E> { // 聲明一個數組名 private Object[] array; // 聲明一個記錄存儲元素總數的屬性名 private int size; /** * 構造方法 */ public MyArrayListImpl() { array = new Object[1]; } // public MyArrayListImpl(int i){ // array = new String[i]; // } /** * 添加元素到數組隊列中的方法 * * @param e要添加的元素 */ public void add(E e) { if (size == 0) array[0] = e; else { // 根據所添加元素的的個數來創建新的數組,新數組的長度是size+1 Object[] newArray = new Object[size + 1]; // 將新元素str添加到newArray數組的末尾 newArray[size] = e; // 將原始數組中的數據存入到新數組中 for (int i = 0; i < size; i++) { newArray[i] = array[i]; } // 新數組的地址賦給原始數組 array = newArray; } // 記錄元素總數增加1. size++; } /** * 向數組隊列中指定的位置插入一個新的元素 * * @param index要插入元素的所在的索引位置 * @param e要插入的新元素 * @return 返回true表示插入成功,返回false表示插入失敗 */ public boolean add(int index, E e) { return false; } /** * 根據指定的索引位置,從數組隊列中移除一個元素 * * @param index要移除元素所在的索引位置 * @return 返回null表示移除失敗,否則會返回移除的元素 */ public E remove(int index) { return null; } /** * 移除指定的元素 * * @param e要移除的元素 * @return 返回值true表示執行成功,返回false表示執行失敗 */ public boolean remove(E e) { return false; } public boolean removeAll(E e) { return false; } /** * 修改指定索引位置的元素 * * @param index要修改元素的位置 * @param e新的元素 * @return 返回值true表示執行成功,返回false表示執行失敗 */ public boolean update(int index, E e) { return false; } /** * 修改指定元素的內容 * * @param oldE要修改的元素 * @param e新的元素 * @return 返回值true表示執行成功,返回false表示執行失敗 */ public boolean update(E oldE, E e) { return false; } /** * 獲取數組隊列中存儲的元素總數 * * @return 返回數組隊列中存儲的元素總數屬性 */ public int size() { return size; } /** * 獲取指定索引位置的元素 * * @param index要獲取元素的索引位置 * @return 返回null表示獲取失敗,否則會返回獲取到的元素 */ public E get(int index) { if (index < 0 || index >= size) return null; return (E)array[index]; } }
1.數組:
數組是屬於數據結構中的一種線性結構。
數據對象在內存中的儲存方式是一種線性結構。
數組定義的方式:
數據類型 [] 數組名 = new 數據類型[長度];
數據類型 [] 數組名 = {數據,...};
數據類型 [] 數組名 = new 數據類型[]{數據,...};
數據類型 [] 數組名;
數組名 = new 數據類型[長度];
數組名 = new 數據類型[]{數據,...};
//錯誤示范
數組名 = {數據,。。。}
數據類型 [][] 數組名 = new 數據類型[行][列];
數據類型 [][] 數組名 = {{數據,...},...};
數組是否是一個類?
是的
數組是類,那么肯定提供了屬性和方法,那么數組有哪些屬性和方法呢?
數組只有一個唯一的length屬性,該屬性是用來獲取數組長度
獲取或設置一維數組中某一個位置的數據:數組名[下標]
獲取一維數組能存儲多少個元素:數組名.length
獲取或設置二維數組中某一個位置的數據:數組名[行下標][列下標]
獲取二維數組的行數:數組名.length
獲取二維數組的列數:數組名[行下標].length
獲取二維數組能存儲多少個元素:
數組名.length*數組名[行下標].length //不適用於所有情況
數組名[行下標].length+...
除了0可以直接給數字之外,其他的都通過length來獲取
數組下標只會從0開始。
2.數組隊列
1.數組有什么優點和缺點?
優點:
存取數據是所有數據結構中速度最快的一種,你在獲取或設置數據時,
可以直接通過下標定位。
缺點:
如果你要存儲的數據不確定時,數組在創建時需要給予的長度就是缺點。
1.創建數組小了,存儲不下數據
2.創建數組大了,浪費內存空間
如果在項目中特定情況下只能存儲一種數據類型;在項目的兩一個位置
需要存儲N種數據類型;這樣數組在創建時需要指定固定的類型就會是缺點。
2.數組隊列的實現
數組隊列的實現原理:借助於數組名中存儲的是數組對象在內存中的首地址。
interface MyArrayList.java 父接口,定義數組中所需要實現的方法
class MyArrayListImpl.java 子類,實現接口中所有的抽象方法。
使用泛型來解決第二個問題。
泛型是Java中的一種特殊符號,不能把它當做任何一個種數據類型。
但是它可以泛指Java所有的數據類型(基本數據類型,引用類型)。
Java中的泛型有E(元素)、K(鍵)、V(值)。