Java數組聲明創建和使用以及多維數組、Arrays類、稀疏數組

數組概述

  • 數組是相同類型數組的有序集合
  • 數組描述的是相同的類型的若干個數據,按照一定的先後次序排列組合而成
  • 其中,每一個數據稱作一個數組元素,每個數組元素可以通過一個下標來訪問它們

數組聲明創建

首先必須聲明數組變量,才能在程序中使用數組。下面是聲明數組變量的語法:

dataType[] arrayRefVar;//首選的方法
dataType arrayRefVar[];//效果相同,但不是首選方法

java語言使用new操作符來創建數組,語法如下:

dataType[] arrayRefVar = new dataType[arraySize];

數組的元素是通過索引訪問的,數組索引從0開始

獲取數組長度:arrays.length

public class ArrayDemo01 {
    public static void main(String[] args) {
        //數組類型 數組的名字 = 數組的值;
        int[] nums;//聲明一個數組
        int nums2[];//也是定義,但不首選
        nums = new int[10];//給聲明的數組分配空間,創建數組。這裏面可以存放10個int類型的數字
        //給數組元素中賦值
        nums[0]=1;
        nums[1]=2;
        nums[2]=3;
        nums[3]=4;
        nums[4]=5;
        nums[5]=6;
        nums[6]=7;
        nums[7]=8;
        nums[8]=9;

        System.out.println(nums[9]);//0   不賦值的話,默認值為0
        //計算所有元素的和
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum=sum+nums[i];
        }
        System.out.println(sum);//45
    }
}

內存分析

java內存分析

存放new的對象和數組

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

存放基本變量類型(會包含這個基本類型的具體數值)

引用對象的變量(會存放這個引用在堆裏面的具體地址)

方法區

可以被所有的線程共享

包含了所有的class和static變量

三種初始化

靜態初始化

創建+賦值

int[] a ={1,2,3};
Man[] mans = {new Man(1,1),new Man(2,2)};//需要先創建相關類

動態初始化

包含默認初始化

int[] a = new int[2];
a[0]=1;
a[1]=2;

數組的默認初始化

數組是引用類型,他的元素相當於類的實例變量,因此數組一經分配空間,其中的每個元素也被按照實例變量同樣的方式被隱式初始化

數組的四個基本特點

  • 其長度是確定的。數組一旦被創建,它的大小就是不可以被改變的
  • 其元素必須是相同類型,不巡視出現混合類型
  • 數組中的元素可以試試任何數據類型,包括基本類型和引用類型
  • 數組變量屬於引用類型,數組也可以看成是對象,數組中的每個元素相當於該對象的成員變量。

數組本身就是對象,java中對象是在堆中的,因此數組無論保存原始類型還是其他對象類型,數組對象本身是在堆中的

數組邊界

下標的合法區間:[0,length-1],如果越界就會報錯;

int [] a = new int[3];
System.out.println(a[3]);//ArrayIndexOutOfBoundsException:數組下標越界異常

小結:

  • 數組是相同數組類型(數據類型可以為任意類型)的有序集合
  • 數組也是對象。數組元素相當於對象的成員變量
  • 數組長度的確定的,不可變的。如果越界,則報:ArrayIndexOutOfBoundsException

數組使用

數組基礎使用

public class ArrayDemo02 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5};

        //打印全部數組元素
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]);//12345
        }
        //計算所有元素的和
        int sum = 0;
        for (int i = 0; i < arrays.length; i++) {
            sum+=arrays[i];

        }
        System.out.println("sum="+sum);//sum=15
        System.out.println("==================================");
        //查找最大元素
        int max = arrays[0];

        for (int i = 1; i < arrays.length; i++) {
            if(max<arrays[i]){
                max=arrays[i];
            }
        }
        System.out.println("max="+max);//max=5
    }
}

For Each循環和普通for循環

public class ArrayDemo03 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5};

        //for-each 沒有下標
        for (int array : arrays) {
            System.out.print(array);//取出每一個值12345
        }

        int[] reverse = reverse(arrays);
        printArray(reverse);//54321
    }

    //打印數組元素,數組可以做方法入參
    public static void printArray(int[] arrays){
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]);//12345
        }
    }

    //反轉數組
    public static int[] reverse(int[] arrays){
        int[] result = new int[arrays.length];
        //反轉操作
        for (int i = 0,j=result.length-1; i < arrays.length; i++,j--) {
            result[j]=arrays[i];
        }
        return result;//數組作為返回值
    }
}

多維數組

多維數組可以看成是數組的數組,比如二維數組就是一個特殊的一維數組,其中每一個元素都是一個一維數組

二維數組

int a[][] = new int[2][5];//可以看成一個兩行五列的數組

遍歷二維數組

public class ArrayDemo04 {
    public static void main(String[] args) {
        int[][] array = {{1,2,3},{2,3,4},{3,4,5}};//創建二維數組[3][3]
        /*
        1,2,3     array[0]
        2,3,4     array[1]
        3,4,5     array[2]
         */
        printArray(array[1]);//234
        System.out.println(array[0][2]);//3
        System.out.println(array.length);//3
        System.out.println(array[0].length);//3
        
        //遍歷二維數組
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.println(array[i][j]);//123 234 345
            }

        }
    }
    //打印數組元素
    public static void printArray(int[] arrays){
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]);//12345
        }
    }
}

Arrays類

數組的工具類java.util.Arrays;

由於數組對象本身並沒有什麼方法可以供我們調用,但API中提供了一個工具類Arrays供我們使用,從而可以對數據對象進行一些基本操作

Arrays類中的方法都是static修飾的靜態方法,在使用的時候可以直接使用類名進行調用,而「不用」使用對象來調用(“不用”而不是”不能”)

具體以下常用功能:

  • 給數組賦值:通過fill方法
  • 對數組排序:通過sort方法,按升序
  • 比較數組:通過equals方法比較數組中元素值是否相等
  • 查找數組元素:通過binarySearch方法能對排序好的數組進行二分查找法操作
package com.shenxiaoyu.array;

import java.lang.reflect.Array;
import java.util.Arrays;

public class ArrayDemo05 {
    public static void main(String[] args) {
        int[] a = {1,2,3,4,9090,32311,643,21,3,3,23};
        System.out.println(a);//[I@16d3586
        //打印數組元素Arrays.toString
        //System.out.println(Arrays.toString(a));//[1, 2, 3, 4, 9090, 32311, 643, 21, 3, 3, 23]
        printArray(a);
        Arrays.sort(a);//數組進行排序:升序
        System.out.println(Arrays.toString(a));//[1, 2, 3, 3, 3, 4, 21, 23, 643, 9090, 32311]

        Arrays.fill(a,0);//數組填充
        System.out.println(Arrays.toString(a));//[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    }
    //打印數組元素
    public static void printArray(int[] a){
        for (int i = 0; i < a.length; i++) {
            if (i==0){
                System.out.print("[");
            }
            if(i==a.length-1){
                System.out.print(a[i]+"]");
            }else{
                System.out.print(a[i]+",");
            }
        }
    }

}

稀疏數組

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

稀疏數組的處理方式:

  • 記錄數組一共有幾行幾列,有多少不同值
  • 把具有不同值的元素和行列及值記錄在一個小規模數組中,從而縮小程序的規模。
package com.shenxiaoyu.array;

import java.util.jar.JarOutputStream;

public class ArrayDemo07 {
    public static void main(String[] args) {
        //1.創建一個二維數組 11*11 0:沒有棋子 1:黑棋  2:白棋
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 2;
        //輸出原始的數組
        System.out.println("輸出原始的數組");

        for (int[] ints : array1) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        /*
        輸出原始的數組
        0  0  0  0  0  0  0  0  0  0  0
        0  0  1  0  0  0  0  0  0  0  0
        0  0  0  2  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
         */

        //轉換為稀疏數組來保存
        //獲取有效值的個數
        int sum = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1.length; j++) {
                if(array1[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的個數:"+sum);

        //創建一個稀疏數組的數組
        int[][] array2 = new int[sum+1][3];

        array2[0][0]=11;
        array2[0][1]=11;
        array2[0][2]=sum;
        //遍歷二維數組,將非零的值,存放稀疏數組中
        int count = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if (array1[i][j]!=0){
                    count++;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];

                }
            }
        }
        //輸出稀疏數組
        System.out.println("稀疏數組");
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i][0]
                    +"\t"+array2[i][1]
                    +"\t"+array2[i][2]);
        }
        /*
        有效值的個數:2
        稀疏數組
        11 11 2
        1  2  1
        2  3  2
         */
        System.out.println("====================================");
        System.out.println("還原");
        //讀取稀疏數組
        int[][] array3 = new int[array2[0][0]][array2[0][1]];
        //給其中的元素還原他的值
        for (int i = 1; i < array2.length; i++) {
            array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }

        //打印
        System.out.println("輸出還原的數組");

        for (int[] ints : array3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        /*
        還原
        輸出還原的數組
        0  0  0  0  0  0  0  0  0  0  0
        0  0  1  0  0  0  0  0  0  0  0
        0  0  0  2  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
         */
    }
}
Tags: