數組概述
數組聲明創建
數組使用
多維數組
Arrays類
稀疏數組
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:
-