1. 程式人生 > >資料結構---------陣列

資料結構---------陣列

1.Java陣列介紹

  1. 概念:同一種類型的集合,其實陣列就是一個容器
  2. 使用優點:可以自動給陣列中的元素從0開始編號,方便操作這些元素。

  3. 宣告的方式:

    1. 元素型別[] 陣列名=new 元素型別[元素個數或陣列長度]
      例:int[] arr=new int[5];

    2. 元素型別[] 陣列名 =new 元素型別[]{元素,元素,......}
      例:int[] arr=new int[]{3,5,8,6};
             int[] arr={3,5,6,8};

    3. 陣列的遍歷
       

      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;
      
          } // 那麼這就是陣列的第一個常見操作.遍歷
       
      }
    4. 常見異常

      1. NullPointerException 空指標異常
        引發原因:引用型別變數沒有指向任何物件,而訪問了物件的屬性或者是呼叫了物件的方法

      2. ArrayIndexOutOfBoundsException 索引值越界
        引發原因:訪問了不存在的索引值。

    5. 記憶體分析

2.自己手寫一個數組程式碼測試,具備以下功能

  1. 插入一條新的資料項
  2. 尋找特定資料項
  3. 刪除某一特定資料項

  4. 迭代的訪問各個資料項,以便進行顯示或其他操作

  5. 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;
        }
    }
  6. 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();
        }
    }
  7. 執行結果

3.分析總結

    陣列能實現資料結構所有功能,那為什麼實際中我們不用它進行所有資料儲存呢?

    資料侷限性:

           ①、插入快,對於無序陣列,上面我們實現的陣列就是無序的,即元素沒有按照從大到小或者某個特定的順序排列,只是按照插入的順序排列。無序陣列增加一個元素很簡單,只需要在陣列末尾新增元素即可,但是有序陣列卻不一定了,它需要在指定的位置插入。

           ②、查詢慢,當然如果根據下標來查詢是很快的。但是通常我們都是根據元素值來查詢,給定一個元素值,對於無序陣列,我們需要從陣列第一個元素開始遍歷,直到找到那個元素。有序陣列通過特定的演算法查詢的速度會比無需陣列快,後面我們會講各種排序演算法。

            ③、刪除慢,根據元素值刪除,我們要先找到該元素所處的位置,然後將元素後面的值整體向前面移動一個位置。也需要比較多的時間。

            ④、陣列一旦建立後,大小就固定了,不能動態擴充套件陣列的元素個數。如果初始化你給一個很大的陣列大小,那會白白浪費記憶體空間,如果給小了,後面資料個數增加了又新增不進去了。

  很顯然,陣列雖然插入快,但是查詢和刪除都比較慢,而且擴充套件性差,所以我們一般不會用陣列來儲存資料,那有沒有什麼資料結構插入、查詢、刪除都很快,而且還能動態擴充套件儲存個數大小呢,答案是有的,但是這是建立在很複雜的演算法基礎上,後面會詳細講述。

 

 

版權宣告:本部落格為記錄本人自學感悟,內容大多從網上學習與整理所得,若侵權請告知!

https://me.csdn.net/qq_39657909