Java基礎之數組的定義與使用詳解


一、數組

數組(array)是多個相同數據類型按照一定順序排列的集合,並使用一個名字命名,並通過編號的方式對這些數據進行統一管理

數組的相關概念:

  • 數組名
  • 元素
  • 角標(下標、索引):數組的索引從0開始,到數組長度-1結束
  • 長度

數組的特點:

  • 數據是有序排列的
  • 數組是引用類型變量。數組的元素可以是基本數據類型,也可以是引用數據類型
  • 數據對象會在內存開辟一塊連續的空間
  • 數組的長度一旦確定,不能更改

數組的分類:

  • 按照維數:一維數組、二維數組……
  • 按照數組元素類型:基本數據類型元素的數組、引用數據類型元素的數組

一維數組的使用:

  • 一維數組的聲明和初始化
    • int[] ids;  // 聲明
      ids = new int[]{1001, 1002, 1003, 1004}; // 靜態初始化:數組的初始化和數組元素的賦值同時進行
      String[] names = new String[5];  //動態初始化:數組的初始化和數組元素的賦值分開進行
  • 如何調用數組指定位置的元素
    •         names[0] = "小陳";
              names[1] = "小吳";
              names[2] = "小李";
              names[3] = "老鄧";
              names[4] = "小王";
      //        names[5] = "小鄧";  // 報錯,java.lang.ArrayIndexOutOfBoundsException
  • 如何獲取數組的長度
    • System.out.println(names.length);   // 5
  • 如何遍歷數組
    • for (int i=0;i<names.length;i++){
                  System.out.println(names[i]);
              }
  • 數組元素的默認初始化值
    • 數組元素是整形:0
    • 數組元素是浮點型:0.0
    • 數組元素是char型:0或'\u0000',而非'0'
    • 數組元素是布爾值:false
    • 數組元素是引用數據類型:null
    •  String[] arr = new String[4];
              for (int i=0;i<arr.length;i++){
                  System.out.print(arr[i] + "\t");
              }       //  null    null    null    null
  • 數組的內存解析
    • 簡化版內存結構
    •    

 例題:UN公社單間短期出租4個月,1550元/月(水電煤公攤,網費35元/月),空調、衛生間、廚房齊全。屋內均是IT行業人員,喜歡安靜。所以要求來租者最好是同行或者剛畢業的年輕人,愛干凈。安靜,聯系方式:

public class TestDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{8, 2, 1, 0, 3};
        int[] index = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};
        String tel = "";
        for (int i = 0; i < index.length; i++) {
            tel += arr[index[i]];
        }
        System.out.println("聯系方式:" + tel);
    }
}

二維數組的使用

對於二維數組的理解,我們可以看成是以為數組array1又作為另一個一維數組array2的元素而存在。其實,從數組底層的運行機制來看,沒有多維數組 

  • 二維數組的聲明和初始化
    • public class TestDemo {
          public static void main(String[] args) {
              int[][] ids;  // 聲明
              ids = new int[][]{{1,2,3},{4,5},{6,7,8,9}}; // 靜態初始化:數組的初始化和數組元素的賦值同時進行
              int[][] ids2= {{1,2,3},{4,5},{6,7,8,9}};  //類型推斷,也是正確寫法
              String[][] names = new String[3][2];  //動態初始化1:數組的初始化和數組元素的賦值分開進行
              String[][] names2 = new String[3][];  //動態初始化2:數組的初始化和數組元素的賦值分開進行
              String[] names3[] = new String[3][];  //也是正確寫法
          }
      }
  • 如何調用數組指定位置的元素
    •         System.out.println(ids[0][1]); //2
              System.out.println(names[1][1]); //null
              System.out.println(names2[1]); //null
              names2[1] = new String[4];
              System.out.println(names2[1][1]); //null
  • 如何獲取數組的長度
    •         System.out.println(names.length); //3
              System.out.println(ids[2].length); //4    
  • 如何遍歷數組
    •         for(int i=0;i<ids.length;i++){
                  for(int j=0;j<ids[i].length;j++){
                      System.out.print(ids[i][j]+"\t");
                  }
                  System.out.println();
              }
      //        1    2    3
      //        4    5
      //        6    7    8    9
  • 數組元素的默認初始化值
    • 針對初始化方式一:比如:int[][] arr = new int[4][3];
    • 外層元素的初始化值為:地址值
    • 內層元素的初始化值為:與一位數組初始化值情況相同
    • 針對初始化方式二:比如:int[][] arr = new int[4][];
    • 外層元素的初始化值為:null
    • 內層元素的初始化值為:不能調用,報空指針錯誤
  • 數組的內存解析
    •  

例題:

1、打印楊輝三角

public class TestDemo {
    public static void main(String[] args) {
//       楊輝三角
        int[][] yangHui= new int[10][];
        for(int i=0;i<yangHui.length;i++){
            yangHui[i]=new int[i+1];
            yangHui[i][0] = yangHui[i][i] = 1;  // 首尾賦值為1
//            給中間位置賦值
            for(int j=1;j<yangHui[i].length-1;j++){
                yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];
            }
        }
        //            遍歷數組
        for(int i=0;i<yangHui.length;i++){
            for (int j=0;j<yangHui[i].length;j++){
                System.out.print(yangHui[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

2、創建一個長度為6的int型數組,要求取值為1-30,同時元素值各不相同

public class TestDemo {
    public static void main(String[] args) {
//       創建一個長度為6的int型數組,要求取值為1-30,同時元素值各不相同
        int[] arr = new int[6];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 30 + 1);
            for (int j = 0; j < i; j++) {
                if (arr[i] == arr[j]) {
                    i--;
                    break;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
}

3、求數組中元素的最大值、最小值、平均數、總和

定義一個int型的一維數組,包含10個元素,分別賦一些隨機數,然后求出所有元素的最大值、最小值、和值、平均數,並輸出

要求:所有隨機數都是兩位數

public class TestDemo {
    public static void main(String[] args) {
//定義一個int型的一維數組,包含10個元素,分別賦一些隨機數,然后求出所有元素的最大值、最小值、和值、平均數,並輸出
//要求:所有隨機數都是兩位數[10,99]
        int[] arr = new int[10];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 88 + 10);  //公式:[a,b]:(int) (Math.random() * (b-a+1) + a)
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
        // 最大值
        int maxValue = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (maxValue < arr[i]) {
                maxValue = arr[i];
            }
        }
        System.out.println("最大值:" + maxValue);
        // 最小值
        int minValue = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (minValue > arr[i]) {
                minValue = arr[i];
            }
        }
        System.out.println("最小值:" + minValue);
        // 和值
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println("總和值:" + sum);
        // 平均值
        double avg = sum / arr.length;
        System.out.println("平均值:" + avg);
    }
}

4、數組的引用

public class TestDemo {
    public static void main(String[] args) {
        int[] arry1,arry2;
        arry1=new int[]{8,9,65,32,56,23,7,5,43};
        arry2=arry1;    // arry2引用指向arry1,注意此時arry1與arry2是同一個數組,不是復制
        // 此時修改arry1的值后,arry2的值會隨之修改
        for(int i=0;i<arry1.length;i++){
            if(i%2==0){
                arry1[i] = i;
            }
        }
        for(int i=0;i<arry2.length;i++){
            System.out.print(arry2[i]+"\t");  // 0    9    2    32    4    23    6    5    8
        }

    }
}

5、數組的復制

public class TestDemo {
    public static void main(String[] args) {
        int[] arry1,arry2;
        arry1=new int[]{8,9,65,32,56,23,7,5,43};
        arry2=new int[9];
        // 復制數組arry1
        for(int i=0;i<arry1.length;i++){
            arry2[i]=arry1[i];
        }
        for(int i=0;i<arry1.length;i++){
            if(i%2==0){
                arry1[i] = i; //此時修改arry1后,arry2的值不變
            }
        }
        for(int i=0;i<arry2.length;i++){
            System.out.print(arry2[i]+"\t"); // 8    9    65    32    56    23    7    5    43
        }
    }
}

6、數組的反轉

public class TestDemo {
    public static void main(String[] args) {
        int[] arry = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        // 數組的反轉
        // 方法一
//        for (int i = 0; i < arry.length / 2; i++) {
//            int temp = arry[i];
//            arry[i] = arry[arry.length - i - 1];
//            arry[arry.length - i - 1] = temp;
//        }
        // 方法二
        for (int i = 0, j = arry.length - 1; i < j; i++, j--) {
            int temp = arry[i];
            arry[i] = arry[j];
            arry[j] = temp;
        }
        for (int i = 0; i < arry.length; i++) {
            System.out.print(arry[i] + "\t"); // 9    8    7    6    5    4    3    2    1
        }
    }
}

7、數組的線性查找

public class TestDemo {
    public static void main(String[] args) {
        String[] arry = new String[]{"aa", "bb", "cc", "dd", "ee", "ff", "gg"};
        // 數組的查找
        //線性查找(地毯式搜索)
        String dest = "gg";
        boolean isFlag = true;
        for (int i = 0; i < arry.length; i++) {
            if (dest.equals(arry[i])) {
                System.out.println("找到了指定元素的位置:" + i);
                isFlag = false;
                break;
            }
        }
        if (isFlag) {
            System.out.print("很遺憾,沒有找到你要找的元素呢");
        }

    }
}

public class TestDemo {
    public static void main(String[] args) {
        String[] arry = new String[]{"aa", "bb", "cc", "dd", "ee", "ff", "gg"};
        // 數組的查找
        //線性查找(地毯式搜索)
        String dest = "gg";
        for (int i = 0; i < arry.length; i++) {
            if (dest.equals(arry[i])) {
                System.out.println("找到了指定元素的位置:" + i);
                break;
            }
            if (i == arry.length -1) {
                System.out.print("很遺憾,沒有找到你要找的元素呢");
            }
        }
    }
}

8、數組的二分查找

public class TestDemo {
    public static void main(String[] args) {
        int[] arry = new int[]{-55, -23, -5, 3, 9, 13, 35, 46, 56, 67};
        //二分法查找
        //前提:查找的數組必須有序
        int dest = 56; // 要查找的元素
        int head = 0;//初始起始索引
        int end = arry.length - 1;//初始的末尾索引
        boolean isFlag = true;
        while (head <= end) {
            int middle = (head + end) / 2; //中間值
            if (dest == arry[middle]) {
                System.out.println("找到了你要查找的元素,位置為:" + middle);
                isFlag = false;
                break;
            } else if (dest < arry[middle]) {
                end = middle - 1;
            } else if (dest > arry[middle]) {
                head = middle + 1;
            }
        }
        if (isFlag) {
            System.out.print("很遺憾,沒有找到你要找的元素呢");
        }
    }
}

數組排序 

  • 選擇排序
    • 直接選擇排序
    • 堆排序
  • 交換排序
    • 冒泡排序
    • 快速排序
  • 插入排序
    • 直接插入排序
    • 折半插入排序
    • Shell排序
  • 歸並排序
  • 桶式排序
  • 基數排序

冒泡排序舉例

public class TestDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{-55, -23, -5, 3, 9, 13, 35, 46, 56, 67};
        // 冒泡排序
        int temp;
        for (int i = 0; i < arr.length - 1; i++) {  // 比較次數
            for (int j = 0; j < arr.length - 1 - i; j++) { // 比較到的位置
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        //遍歷排序后的數組
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
}

快速排序 

原理:

demo:

  

舉例:

public class QuickSort {
    private static void swap(int[] data, int i, int j) {
        int temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    private static void subSort(int[] data, int start, int end) {
        if (start < end) {
            int base = data[start];
            int low = start;
            int high = end + 1;
            while (true) {
                while (low < end && data[++low] - base <= 0)
                    ;
                while (high > start && data[--high] - base >= 0)
                    ;
                if (low < high) {
                    swap(data, low, high);
                } else {
                    break;
                }
            }
            swap(data, start, high);
            subSort(data, start, high - 1);//遞歸調用
            subSort(data, high + 1, end);
        }
    }

    public static void quickSort(int[] data) {
        subSort(data, 0, data.length - 1);
    }

    public static void main(String[] args) {
        int[] data = {9, -16, 30, 23, -30, -49, 25, 21, 30};
        System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
        quickSort(data);
        System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
    }
}

排序算法性能對比

 


免責聲明!

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



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