資料結構---------陣列
1.Java陣列介紹
- 概念:同一種類型的集合,其實陣列就是一個容器
-
使用優點:可以自動給陣列中的元素從0開始編號,方便操作這些元素。
-
宣告的方式:
-
元素型別[] 陣列名=new 元素型別[元素個數或陣列長度]
例:int[] arr=new int[5]; -
元素型別[] 陣列名 =new 元素型別[]{元素,元素,......}
例:int[] arr=new int[]{3,5,8,6};
int[] arr={3,5,6,8}; -
陣列的遍歷
public static void main(String[] args) { int[] x = { 1, 2, 3 }; for (int y = 0; y < x.length; y++) { System.out.println(x[y]); // System.out.println("x["+y+"]="+x[y]); 列印效果 x[0]=1; } // 那麼這就是陣列的第一個常見操作.遍歷 }
-
常見異常
-
NullPointerException 空指標異常
引發原因:引用型別變數沒有指向任何物件,而訪問了物件的屬性或者是呼叫了物件的方法 -
ArrayIndexOutOfBoundsException 索引值越界
引發原因:訪問了不存在的索引值。
-
-
記憶體分析
-
2.自己手寫一個數組程式碼測試,具備以下功能
- 插入一條新的資料項
- 尋找特定資料項
-
刪除某一特定資料項
-
迭代的訪問各個資料項,以便進行顯示或其他操作
-
MyArray類
ps:假設操作人是不會新增重複元素的,這裡沒有考慮重複元素,如果新增重複元素了,後面的查詢,刪除,修改等操作只會對第一次出現的元素有效。
package com.lsl.array; public class MyArray { //定義一個數組intArray,陣列的實際長度elems,陣列的最大長度。 private int[] intArray; private int elems; private int length; //預設構造一個長度為50的陣列 public MyArray(){ elems=0; length=50; intArray=new int[length]; } //建構函式傳參時建立一個長度為length的陣列 public MyArray(int length){ elems=0; this.length=length; intArray=new int[length]; } //1.建立獲得陣列有效長度的方法 public int getSize(){ return elems; } //2.遍歷元素,列印元素值 public void display(){ for (int i=0;i<elems;i++){ System.out.print(intArray[i]+" "); } System.out.println(); } //3.新增元素 public boolean add(int value){ if (elems==length){ return false; }else{ intArray[elems]=value; elems++; } return true; } //4.根據下標獲取元素 public int get(int i){ if (i<0||i>elems){ System.out.println("訪問下標越界!"); } return intArray[i]; } //5.查詢元素下標 public int find(int searchValue){ int i; for (i=0;i<elems;i++){ if (intArray[i]==searchValue){ break; } } if (i==elems){ return -1; } return i; } //6.刪除元素 public boolean delete(int value){ int k=find(value); if (k!=-1){ if (k==elems-1){ elems--; }else{ for(int i=k;i<elems-1;i++){ intArray[i]=intArray[i+1]; } elems--; } }else{ return false; } return true; } //7.修改資料 public boolean modify(int oldValue,int newValue){ int k=find(oldValue); if (k!=-1){ intArray[k]=newValue; }else{ System.out.println("修改的資料不存在!"); return false; } return true; } }
-
MyArrayTest類
package com.lsl.array; public class MyArrayTest { public static void main(String[] args){ //建立自定義封裝陣列結構,陣列大小為4 MyArray array = new MyArray(4); //新增4個元素分別是1,0,2,4 array.add(1); array.add(0); array.add(2); array.add(4); //顯示陣列元素 array.display(); //根據下標為0的元素 int i = array.get(0); System.out.println(i); //刪除4的元素 array.delete(0); //將元素3修改為33 array.modify(2, 345); array.display(); } }
-
執行結果
3.分析總結
陣列能實現資料結構所有功能,那為什麼實際中我們不用它進行所有資料儲存呢?
資料侷限性:
①、插入快,對於無序陣列,上面我們實現的陣列就是無序的,即元素沒有按照從大到小或者某個特定的順序排列,只是按照插入的順序排列。無序陣列增加一個元素很簡單,只需要在陣列末尾新增元素即可,但是有序陣列卻不一定了,它需要在指定的位置插入。
②、查詢慢,當然如果根據下標來查詢是很快的。但是通常我們都是根據元素值來查詢,給定一個元素值,對於無序陣列,我們需要從陣列第一個元素開始遍歷,直到找到那個元素。有序陣列通過特定的演算法查詢的速度會比無需陣列快,後面我們會講各種排序演算法。
③、刪除慢,根據元素值刪除,我們要先找到該元素所處的位置,然後將元素後面的值整體向前面移動一個位置。也需要比較多的時間。
④、陣列一旦建立後,大小就固定了,不能動態擴充套件陣列的元素個數。如果初始化你給一個很大的陣列大小,那會白白浪費記憶體空間,如果給小了,後面資料個數增加了又新增不進去了。
很顯然,陣列雖然插入快,但是查詢和刪除都比較慢,而且擴充套件性差,所以我們一般不會用陣列來儲存資料,那有沒有什麼資料結構插入、查詢、刪除都很快,而且還能動態擴充套件儲存個數大小呢,答案是有的,但是這是建立在很複雜的演算法基礎上,後面會詳細講述。
版權宣告:本部落格為記錄本人自學感悟,內容大多從網上學習與整理所得,若侵權請告知!