java 基礎五 -- 數組

1 數組的定義

  • 概念:同一種類型數據的集合,其實數組就是一個容器。
  • 數組的好處:可以自動的給數組中的元素從0開始編號,方便操作這些元素。
  • 格式1:
    • 元素類型[] 數組名 = new 元素類型[元素個數或數組長度];
  • 格式2:
    • 元素類型[] 數組名 = new 元素類型[]{元素1,元素2,……};    

 

  • 示例:  
package java005;

/**
 * 2017/9/3
 * 說明:數組
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
    }
}
  • 示例:
package java005;

/**
 * 2017/9/3
 * 說明:數組
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[]{};
    }
}
  • 示例:
package java005;

/**
 * 2017/9/3
 * 說明:數組
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[]{1,2,3};
    }
}
  • 示例:
package java005;

/**
 * 2017/9/3
 * 說明:數組
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
        System.out.println(arr[0]);
        arr[1] = 59;
        for(int x = 0;x<arr.length;x++){
            System.out.println(arr[x]);
        }
    }
}

 

2 數組的內存分配及特點

  • 內存的劃分:
    • 寄存器
    • 本地方法區
    • 方法區
    • 堆內存
    • 棧內存  

 

  • 棧內存:存儲的都是局部變量,而且變量所屬的作用域一旦結束,該變量就自動釋放。

 

  • 堆內存:存儲的數組和對象(其實數組就是對象)。
    • 每一個對象都有一個首地址值。
    • 堆內存中的每一個變量都有默認初始化值,根據類型的不同而不同。整數爲0,小數是0.0,boolean類型是false,char類型是'\u0000'。
    • 垃圾回收機制。  

 

  • 圖解:int[] arr = new int[5];
    • ①main方法進棧

    • ②main方法進入到棧中,執行main方法中的代碼,當執行到new int[5];的時候,在堆內存開闢了一段連續的空間,長度是5,並初始化堆中數組對象的默認值爲對應類型的默認值,並分配堆中數組對象的內存地址。  

    • ③當將堆中地址賦值給左邊的arr變量的時候,arr就指向了堆中的數組對象。  

 

3 數組操作常見問題

  • ArrayIndexOutOfBoundsException
package java005;

/**
 * 2017/9/3
 * 說明:數組
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
        System.out.println(arr[5]);

    }
}

 

  • NullPointerException
package java005;

/**
 * 2017/9/3
 * 說明:數組
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
        System.out.println(arr[arr.length-1]);
        arr = null;
        System.out.println(arr[arr.length-1]);

    }
}

 

4 數組常見操作

4.1 遍歷數組

package java005;

/**
 * 2017/9/3
 * 說明:數組
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0};
        for(int x = 0 ;x<arr.length;x++){
            System.out.print(arr[x] +"\t");
        }

    }
}

4.2 最值

package java005;

/**
 * 2017/9/3
 * 說明:求最值
 */
public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] arr = new int[]{1,11,33,-1,-10};
        int max = max(arr);
        int min = min(arr);
        System.out.println("最大值是:"+max);
        System.out.println("最小值是:"+min);

    }

    /**
     * 求一個數組的最大值
     * @param arr
     * @return
     */
    public static int max(int[] arr){
       if(arr.length == 0){
           throw new RuntimeException("數組不能爲空");
       }
       int max = arr[0];
       for(int x =0;x<arr.length;x++){
           if(max < arr[x]){
               max = arr[x];
           }
       }
       return max;
    }

    /**
     * 求一個數組的最小值
     * @param arr
     * @return
     */
    public static int min(int[] arr){
        if(arr.length == 0){
            throw new RuntimeException("數組不能爲空");
        }
        int min = arr[0];
        for(int x =0;x<arr.length;x++){
            if(min > arr[x]){
                min = arr[x];
            }
        }
        return min;

    }



}

4.3 選擇排序

 

 

package java005;

/**
 * 2017/9/3
 * 說明:選擇排序
 */
public class ArraySortDemo {
    public static void main(String[] args) {
        int[] arr = {34,19,11,103,56};
        //排序前
        printArray(arr);
        //排序
        sortArray(arr);
        //排序後
        printArray(arr);

    }

    /**
     * 打印數組
     * @param arr
     */
    public static void printArray(int[] arr){
        System.out.print("[");
        for(int x = 0;x<arr.length;x++){
            if(x == (arr.length -1)){
                System.out.print(arr[x] +"]");
            }else{
                System.out.print(arr[x]  +"、");
            }


        }
    }

    /**
     * 對數組進行排序
     * @param arr
     */
    public static void sortArray(int[] arr){
        for(int x = 0;x< arr.length-1;x++){
            for(int y = x+1;y<arr.length;y++){
                if(arr[x] > arr[y]){
                    int temp = arr[y];
                    arr[y] = arr[x];
                    arr[x] = temp;
                }

            }


        }
    }


}

4.4 冒泡排序

 

 

package java005;

/**
 * 2017/9/4
 * 說明:冒泡排序
 */
public class ArraySortDemo2 {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        //排序前
        printArray(arr);

        sortArray(arr);

        //排序後
        printArray(arr);

    }

    /**
     * 輸出數組中的每個元素
     */
    public static void printArray(int[] arr){
        System.out.print("[");
        for (int x = 0;x<arr.length;x++){
            if(x == arr.length-1){
                System.out.println(arr[x] +"]");
            }else{
                System.out.print(arr[x]+"、");
            }
        }
    }

    /**
     * 冒泡排序算法
     * @param arr
     */
    public static void sortArray(int[] arr){
        for(int x =0;x<arr.length -1;x++){
            for(int y = 0; y<arr.length -1 -x;y++){
                if(arr[y] > arr[y+1]){
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;

                }
            }

        }
    }


}

4.5 找出數組中指定數值的位置

4.5.1 普通查找法

package java005;

/**
 * 2017/9/4
 * 說明:冒泡排序
 */
public class ArraySortDemo2 {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        int index = commonFindElementIndexByValue(arr,109);
        System.out.println("索引值是:"+index);

    }

    

    public static int commonFindElementIndexByValue(int[] arr,int value){
        if(arr == null || arr.length == 0){
            return -1;
        }
        for(int x =0;x<arr.length;x++){
            if(value == arr[x]){
                return x;
            }
        }
        return -1;

    }




}

4.5.2 二分查找法(折半查找法)--必須先排序

package java005;

/**
 * 2017/9/4
 * 說明:二分查找法
 */
public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        sort(arr);
        int index = binarySearch(arr,56);
        System.out.print("index:"+index);
    }

    /**
     * 排序
     * @param arr
     */
    public static void sort(int[] arr){
        for(int x =0;x<arr.length -1; x++){
            for(int y = 0; y<arr.length -1 -x;y++){
                if(arr[y] > arr[y+1]){
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                }
            }
        }
    }

    /**
     * 二分查找法
     * @param arr
     * @param value
     * @return
     */
    public static int binarySearch(int[] arr,int value){
        if(arr == null || arr.length ==0){
            return -1;
        }
        int min = 0;
        int max = arr.length-1;
        int mid = (min + max) / 2;
        while(arr[mid] != value){
            if(value > arr[mid]){
                min = mid +1 ;
            }else if(value < arr[mid]){
                max = mid - 1;
            }
            if(min > max){
                return  -1;
            }
            mid = (min + max) / 2;


        }

        return mid;
    }

}
  • 二分查找法,是有弊端的,如果當前數組不是排序過的,那麼返回的索引不是排序之前的索引值
package java005;

import javax.lang.model.element.VariableElement;

/**
 * 2017/9/4
 * 說明:二分查找法
 */
public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        sort(arr);
        int index = binarySearch(arr,56);
        System.out.print("index:"+index);
    }

    /**
     * 排序
     * @param arr
     */
    public static void sort(int[] arr){
        for(int x =0;x<arr.length -1; x++){
            for(int y = 0; y<arr.length -1 -x;y++){
                if(arr[y] > arr[y+1]){
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                }
            }
        }
    }

    /**
     * 二分查找法
     * @param arr
     * @param value
     * @return
     */
    public static int binarySearch(int[] arr,int value){
        if(arr == null || arr.length ==0){
            return -1;
        }
        int min = 0;
        int max = arr.length-1;
        int mid = 0;
        while(min < max){
            mid = (min + max) >> 1;
            if(value > arr[mid]){
                min = mid + 1;
            }else if(value < arr[mid]){
                max = mid - 1;
            }else{
                return mid;
            }


        }

        return -1;
    }
}

4.6 將一個整數轉換爲16進制的數

  •  在Java中,整數int是32位,而16進制的數,是從0到15,即每四個二進制就對應16進制,爲啥?因爲4個二進制最大爲1111,對應的16進制是8+4+2+1=15。所以int類型的整數對應的16進制數是8位。

 

 

package java005;

/**
 * 2017/9/5
 * 說明:
 */
public class ConverterHex {
    public static void main(String[] args) {
        toHex(60);
    }

    public static void toHex(int num){

        if(num == 0){
            System.out.print("0");
            return;
        }
        
        char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

        char[] arr = new char[6];
        int p = arr.length;

        while (num != 0){
            int temp = num & 15;
            arr[--p] = chs[temp];
            num = num >>>4;
        }

        for(int x = p;x<arr.length;x++){
            System.out.print(arr[x]);
        }


    }

}

 

5 數組中的數組(二維數組)

5.1 數組的定義

5.1.1 格式一

  • int[][] arr = new int[3][2];
  • 定義了名稱爲arr的二維數組。
  • 二維數組中有3個一維數組。
  • 每一個一維數組中有2個元素。
  • 一維數組的名稱分別爲arr[0]、arr[1]和arr[2]。
  • 給第一個一維數組中第一個元素賦值89,寫法是arr[0][0]=89.

5.1.2 格式二

  • int[][] arr = new int[3][];
  • 二維數組中有3個一維數組。
  • 每一個一維數組的默認初始化值是null。
  • 可以對這三個一維數組分別進行初始化。
arr[0] = new int[3];
arr[1] = new int[9];
arr[x] = new int[50];

5.2 二維數組的示例

package java005;

/**
 * 2017/9/5
 * 說明:
 */
public class Array2Demo {
    public static void main(String[] args) {
        int[][] arr = new int[3][2];
        arr[0][0] = 89;
        for(int x = 0;x<arr.length;x++){
            for(int y = 0;y<arr[x].length;y++){
                System.out.print(arr[x][y] +"\t");
            }
            System.out.println();
        }

    }
}

 

5.3 二維數組的應用場景

  • 某個公司需要統計銷售人員每季度的銷售額,那麼其中銷售甲的季度銷售額用數組表示爲;{30,59,28,17},那麼乙同樣可以用數組來表示銷售乙的季度銷售額{37,60,22,19},那麼公司統計所有銷售人員的銷售額應該如下所示。

    • int[][] arr = {{30,59,28,17},{37,60,22,19}};  
  • 雖然,上面的方式是可以滿足我們的要求,但是我們並不清楚那個是甲的,那個是乙的,所以在java中使用Map集合來代替了二維數組在此場景下的應用。
發佈了0 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章