Java數組基礎


Java數組的基礎

  1. 數組概述

  2. 數組聲明創建

  3. 數組使用

  4. 多維數組

  5. Arrays類

  6. 稀疏數組


1. 數組介紹

  • 數組是相同類型數據的有序集合

  • 數組描述相同類型對象的若干個數據,按照一定的先后次序排列組合而成

  • 其中,每一個數據稱為一個數組元素,可以通過下標來訪問它們

2. 數組聲明創建及初始化

  • 第一步聲明數組變量,才能在程序中使用數組

    dataType[] arrayName;  
    //如:int[] nums;
  • 第二步使用new操作符來創建數組

    arrayName = new dataType[arraySize];
    //如 nums = new int[10];
  • 第三步給數組中的元素賦值(沒有被賦值為默認值,0 或者 null)

    nums[0] = 1;
    num[1] = 2;
    num[2] = 3;
    ...
  • 聲明數組和創建數組可以同時完成

    int[] nums = new int[10];
    int[] nums = {1,2,3,4,5}
    //常用這兩種寫法同時完成
  • 數組三種初始化

    • 靜態初始化

      int[] a = {1,2,3,4,5};
      String[] str = {"this", "is", "hello", "world"};
    • 動態初始化

      int[] a = new int[10];
      nums[0] = 1;
      num[1] = 2;
      num[2] = 3;
      ...
    • 默認初始化

      • 數組是引用類型,它的元素相當於類的實例變量,因此數組一旦創建,就會被分配好空間,其中每個元素就會按照實例變量同樣的方法被隱式初始化。即沒有被初始化的值默認為 0 或者 null,false。

  • 數組的四個基本特點

    • 其長度是確定的。一旦被創建,它的大小不可以改變。

    • 數組里所有元素必須是相同類型

    • 數組元素可以是任何數據類型(基本類型,引用類型)

    • 數組變量屬於引用類型,數組本身就是對象,里面每個元素相當於該對象的成員。Java中對象是在堆中的。

3. 數組使用及內存分析

  • 數組使用方法

    • for - each 循環

    • 數組作方法引入參

    • 數組作返回值

      注意定義類型 + 變量名

  • 數組邊界

    • 下標合法區間:[0,length-1], 如果越界就會報錯。其中 ArrayName.length 就是該數組長度

    • ArrayIndexOutOfBoundsException : 數組下標越界異常!

  • Java內存分析

      • 存放new的對象和數組

      • 可以被所有的線程共享,不會存放別的對象引用

      • 存放基本數據類型(包括具體值)

      • 引用對象的變量(包括存放引用在堆里面的具體地址)

    • 方法區

      • 可以被所以線程共享

      • 包含了所有的class和static變量

4. 多維數組

  • Java使用數組一般不會超過二維數組,二維數組就是特殊的一維數組,每一個元素都是一個一維數組

  • 二維數組創建

    int a[][] = new int[2][4];
  • 多維數組的使用

// 打印二維數組
int[][] array = {{1,2},{2,3},{3,4}};
for(int i=0;i<array.length;i++){
   for(int j=0;j<array[i].length;j++){
       System.out.print(array[i][j]+" ");
  }
}

5. Arrays類

  • 數組工具類 java.util.Arrays

  • 數組對象本身沒有聲明方法供我們調用,但API中提供了一個工具類Arrays給我們使用,從而完成一些對數組的操作

  • 查看 JDK 幫助文檔 或者 Arrays類方法的源代碼 ( 學習編程思路)

  • Arrays 中的方法都是 static 修飾的靜態方法,在使用的時候可以直接使用類名進行調用。

  • 常用功能

    • 給數組賦值:fill 方法

    • 對數字排序:sort方法(升序)

    • 比較數組:equals方法(比較數組中元素是否相等)

    • 查找數組元素:通過 binarySearch 方法能對排序好的數組進行二分查找法操作

6.冒泡排序

  • 冒泡排序式最出名的排序算法,總共有八大排序

  • 冒泡排序很簡單,兩層循環,外層冒泡輪數,里層一次比較。

  • 我們看到嵌套循環,就應該立馬得出這個算法的時間復雜度O(n^2)
    int temp =0;  // 臨時變量,用於交換
    // 外層循環,判斷我們要走多少次
    for(int i=0;i<array.length;i++){
       // 內層循環,比較相鄰的數的大小,並實現交換位置功能
       for(int j=0 ; j< array[i].length-1-i; j++){
           if(array[j+1]<array[j]){
               temp = array[j];
               array[j] = array[j+1];
               array[j+1] = temp;
          }
      }
       System.out.println(Arrays.toString(array));
    }
  • 思考一些,如何優化?

    int temp =0;  // 臨時變量,用於交換
    // 外層循環,判斷我們要走多少次
    for(int i=0;i<array.length-1;i++){
       // 通過flag標識來減少沒有意義的比較
       boolean flag = false;
       // 內層循環,比較相鄰的數的大小,並實現交換位置功能
       for(int j=0 ; j< array[i].length-1-i; j++){
           if(array[j+1]<array[j]){
               temp = array[j];
               array[j] = array[j+1];
               array[j+1] = temp;
               flag = true;
          }
           if(flag == false){
               // 如果沒有進行數據交換就直接跳出循環
               break;
          }
      }
       System.out.println(Arrays.toString(array));
    }

     

7. 稀疏數組(一種數據結構)

  • 介紹

    • 當一個數組中大部分元素為0,或者同一個值的數組時,就可以使用稀疏數組來保存該數組

    • 稀疏數組的處理方法

      • 記錄數組一共幾行幾列,有多少個不同值

      • 把具有不同值的元素的行和列及值記錄在一個小規模的數組中

      • 如同,左邊為原始數組,右邊為稀疏數組。

      • 第0行記錄了原始數組的行列數及有效值個數,其他行數記錄了有效值的坐標和值的大小。(n行3列的形式)

  • 示例

    • 需求:編寫五子棋游戲中,有存盤退出和續上盤的功能

    • 分析問題:因為該二維數組的很多值默認為0,因此記錄了許多沒有意義的數據

    • 解決:稀疏數組

      package MethodArray.ArrayStudy;
      public class ArrayTest_5 {
         public static void main(String[] args) {
             // 1. 創建一個二維數組11*11, 0:沒有棋子, 1:黑棋, 2:白棋
             int[][] array = new int[11][11];
             array[1][2] = 1;
             array[2][3] = 2;
             // 輸出原始的數組
             System.out.println("輸出原始的數組");
             for (int[] ints : array) {
                 for (int anInt : ints) {
                     System.out.print(anInt + "\t");
                }
                 System.out.println();
            }
             // 轉化為稀疏數組來保存
             int sum=0;     // 獲取有效值的個數
             for (int i = 0; i < 11; i++) {
                 for (int j = 0; j < 11; j++) {
                     if(array[i][j]!=0){
                         sum +=1 ;
                    }
                }

            }
             System.out.println("有效值的個數為:" + sum);

             // 1.稀疏數組是一個n行3列的二維數組,第一行三列分別 存儲原數組 行列數 及 有效值個數。
             // 2.其他的行數存儲 有效值的 行列數 及其 值
             // 3.創建一個稀疏數組
             int[][] smallArray = new int[sum+1][3];
             smallArray[0][0] = 11;
             smallArray[0][1] = 11;
             smallArray[0][2] = sum;
             // 變量二維數組,將 非0 的值存放進去
             int count = 0;
             for (int i = 0; i < array.length; i++) {
                 for (int j = 0; j < array[i].length; j++) {
                     if(array[i][j]!=0){
                         smallArray[count+1][0] = i;
                         smallArray[count+1][1] = j;
                         smallArray[count+1][2] = array[i][j];
                         count+=1;
                    }
                }
            }
             // 打印稀疏數組
             System.out.println("輸出稀疏數組");
             for (int[] arr:smallArray){
                 for (int anInt:arr){
                     System.out.print(anInt + "\t");
                }
                 System.out.println();
            }
             System.out.println("==========還原稀疏矩陣=========");
             // 讀取稀疏矩陣
             int[][] array1 = new int[smallArray[0][0]][smallArray[0][1]];
             // 還原元素
             for (int n = 1; n < smallArray.length; n++) {
                     array1[smallArray[n][0]][smallArray[n][1]] = smallArray[n][2];
                }
             // 輸出原始的數組
             System.out.println("---------------這是稀疏數組還原的數組-----------------");
             System.out.println("輸出原始的數組");
             for (int[] ints : array1) {
                 for (int anInt : ints) {
                     System.out.print(anInt + "\t");
                }
                 System.out.println();
            }
            }
        }

       

3. 總結

我基礎需要着重加強的地方

  1. 邏輯運算符/位運算符 (a++,2>>3)

  2. 不熟悉幾大選擇結構

  3. 循環部分(冒泡排序)

  4. 方法部分(Scanner, Arrays, 自定義方法)

  5. 容易忘記定義類型(基本類型, 引用類型)

  6. 沒有掌握 自定義變量的妙用 (換位置,求總和,相關注釋忘記寫)

鞏固基礎是王道,多復習,多敲代碼,慢慢走,不着急。

念念不忘,必有回響!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM