Java陣列
什么是陣列
- 陣列是相同型別資料的有序集合,
- 陣列描述的是相同型別的若干個資料,按照一定的先后次序排列組合而成,
- 其中,每一個資料稱作為一個陣列元素,每個陣列元素可以通過一個下標來訪問它們,
陣列宣告創建
陣列宣告創建
- 首先必須宣告陣列變數,才能在程式中使用陣列,下面是宣告陣列變數的語法:
dataType[] arrayRefVar; //首選方法
或
dataType arrayRefVar[]; //效果相同,單不是首選方法
- Java語言使用new運算子來創建陣列,語法如下
dataType[] arrayRefVar = new dataType[arraySize];
演示(宣告陣列,創建陣列,宣告創建陣列):
package com.xiaodi.operator.array;
public class ArrayDemo01 {
public static void main(String[] args) {
int[] nums; //宣告一個陣列
nums = new int[10]; //創建一個陣列,表示的是能存放10個int型別的資料
int[] nums1 = new int[10]; //宣告創建,表示的是能存放10個int型別的資料
}
}
- 陣列的元素是通過索引訪問的,陣列索引從0開始,
- 獲取陣列長度:arrays.length
演示(給陣列元素中賦值):
package com.xiaodi.operator.array;
public class ArrayDemo01 {
public static void main(String[] args) {
int[] nums; //宣告一個陣列
nums = new int[10]; //創建一個陣列
//int[] nums1 = new int[10]; //宣告創建
//給陣列元素中賦值
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;
nums[9] = 10;
//訪問陣列元素
System.out.println(nums[8]); //回傳9
//沒有賦值的話是有默認型別的,int型別的話0...(之前講實體變數中有)
System.out.println(nums[9]); //回傳0
}
}
演示(計算陣列所有元素的和):
package com.xiaodi.operator.array;
public class ArrayDemo02 {
public static void main(String[] args) {
//宣告、創建
int[] nums = new int[10];
//賦值
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;
nums[9] = 10;
//計算陣列中所有元素的和
double sum = 0;
for (int i = 0; i < nums.length; i++) {
sum = sum + nums[i];
}
System.out.println("陣列的和為:"+sum);
}
}
這里需要學會的
創建和宣告可以和成一句:
dataType[] arrayRefVar = new dataType[arraySize];
還有通過下標訪問元素,賦值:
//通過下標訪問元素
arrayRefVar[num];
//賦值、需要注意的是型別需要一致
arrayRefVar[num] = value;
還有獲取陣列的長度:
arrayRefVar.length
三種初始化
靜態初始化
//基本型別
//創建+賦值 你放多少個他空間就是多大
int[] a = {1, 2, 3};
//參考型別
后面會講,這里先不講,等一下看不懂增加了學習負擔
動態初始化
//宣告+創建 空間是自己定義的,宣告和創建好空間之后需要后期賦值
//包含默認初始化,就是如果沒有進行賦值他默認的值是,基本型別中除了布爾型別為false,其余默認值都為0
int[] b = new int[10];
b[0] = 1;
陣列默認初始化
- 陣列是參考型別,它的元素相當于類的實體變數,因此陣列一經分配空間,其中的每個元素也被按照實體變數的方式被隱式初始化,
從記憶體分析幫助理解
直接上圖
Java記憶體圖:

宣告和創建陣列的時候Java記憶體是怎么做的:

陣列邊界及小結
陣列的四個基本特點
- 其長度是確定的,陣列一旦被創建,它的長度就是不可以改變的,
- 其元素必須是相同型別,不許出現混合型別
- 陣列中的元素可以是任何資料型別,包括基本型別和參考型別
- 陣列變數屬于參考型別,陣列也可以看成是物件,陣列中的每個元素相當于該物件的成員變數,陣列本身就是物件,Java中物件是在堆中的,因此陣列無論保存原始型別還是其他物件型別,陣列物件本身是在堆中的
陣列邊界
- [0,length-1],如果越界就會報錯;
public static void main(String[] args) {
int[] a = new int[2];
System.out.println(a[2]);
}
上面這段代碼輸出a[2]是會報下面這種錯:
? ArryaIndexOutOfBoundsException:意思就是陣列下標越界例外
小結
- 陣列是相同資料型別(資料型別可以為任何型別)的有序集合
- 陣列也是物件,陣列元素相當于物件的成員變數
- 陣列長度確定后,是不可變的,如果越界,則報錯:ArryaIndexOutOfBoundsException
陣列的使用*
For-Each 回圈
例子(普通for回圈):
package com.xiaodi.operator.array;
public class ArryaDemo03 {
public static void main(String[] args) {
//定義一個陣列
int[] arrays = {1, 2, 3, 4, 5, 6};
//列印全部陣列元素
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]);
}
System.out.println("============================");
//計算所有元素的和
int sum = 0;
for (int i = 0; i < arrays.length; i++) {
sum += arrays[i];//sum = sum + arrays[i];
}
System.out.println(sum);
System.out.println("============================");
//查看元素中最大數
int max = arrays[0];
for (int i = 1; i < arrays.length; i++) {
if (arrays[i] > max) {
max = arrays[i];
}
}
System.out.println("max:"+max);
}
}
例子(增強型for回圈):
package com.xiaodi.operator.array;
public class ArrayDemo04 {
public static void main(String[] args) {
//定義一個陣列
int[] arrays = {1, 2, 3, 4, 5, 6};
//增強型for回圈:JDK1.5新特性
//省去下標,0到srray.length-1,依次遍歷
for (int array : arrays) {
System.out.println(array);
}
}
}
陣列做方法的引數
例子:
package com.xiaodi.operator.array;
public class ArrayDemo04 {
public static void main(String[] args) {
//定義一個陣列
int[] arrays = {1, 2, 3, 4, 5, 6};
//呼叫方法
printArray(arrays);
}
//列印陣列元素
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
陣列作回傳值
例子:
package com.xiaodi.operator.array;
public class ArrayDemo04 {
public static void main(String[] args) {
//定義一個陣列
int[] arrays = {1, 2, 3, 4, 5, 6};
//呼叫方法
int[] reverseArray = reverse(arrays);
//使用列印陣列元素的方法去列印它
printArray(reverseArray);
}
//列印陣列元素
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
//反轉陣列
public static int[] reverse(int[] array) {
int[] result = new int[array.length];
for (int i = 0, j = result.length-1; i < result.length; i++,j--) {
result[j] = array[i];
}
return result;
}
}
這題估計會難一點,不過花點時間去理解還是能學會的!
多維陣列
- 多維陣列可以看成是陣列的陣列,比如二維陣列就是一個特殊的一維陣列,其每一個元素都是一個一維陣列,
二維陣列宣告創建
//動態初始化 宣告+創建空間
int[][] a = nwe int[2][5];
//靜態初始化 創建空間+賦值
int[][] a = {{1,2},{3,4},{5,6},{7,8},{9,10}};
決議:以上二維陣列a可以看成一個兩行五列的陣列
思考:多維陣列的使用?
上例子:
package com.xiaodi.operator.array;
public class ArrayDemo05 {
public static void main(String[] args) {
//[4][2]
/*
1,2 array[0]
3,4 array[1]
5,6 array[2]
7,8 array[3]
*/
int[][] array = {{1,2},{3,4},{5,6},{7,8}};
//輸出array[0],會輸出一個物件,我們現在看不懂
// System.out.println(array[0]);
//我們呼叫printArray這個方法就能列印出來
printArray(array[0]);
System.out.println("==============================================");
//如果我們只需要array[0]的第一個元素 可以像下面這樣寫
System.out.println(array[0][0]);
System.out.println(array[0][1]);
System.out.println("==============================================");
//獲取陣列的長度
System.out.println(array.length); //4
System.out.println(array[0].length); //2
System.out.println("==============================================");
//根據這個,我們就可以遍歷這個二維陣列里的所有元素了
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]);
}
}
}
//我們把上一段寫的列印陣列元素的方法拿過來
//列印陣列元素
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
? 三維、四維、都是以此類推,不過我們二維陣列已經夠用了,而且用的不多,理解一下,知道有這個東西就行
Arrays 類(擴展)
陣列的工具類java.util.Arrays
由于陣列物件本身并沒有什么方法可以供我們呼叫,但API中提供了一個工具類Arrays供我們使用,從而可以對資料物件進行一些基本操作,
查看JDK幫助檔案
Arrays類中的方法都是static修飾的靜態方法,在使用的時候可以直接使用類名呼叫,而“不用”使用物件來呼叫(注意:是“不用”而不是“不能”)
Arrays類的列印陣列元素的方法:
package com.xiaodi.operator.array;
import java.util.Arrays; //引入Arrays類
public class ArrayDemo06 {
public static void main(String[] args) {
int[] a = {1,2,3,546,123,4178,1222};
System.out.println(a);//輸出的不是我們想要的結果 是一個物件[I@1b6d3586
System.out.println("===========================");
//我們使用Arrays類的toString方法來試一下
System.out.println(Arrays.toString(a));
System.out.println("===========================");
//這個方法我們也是可以自己實作的,我想說的是這種方法也是人寫的,但是不建議重復造輪子;可以在IDEA上按住Ctrl鍵點擊toString查看這個方法的原始碼
printArray(a);
}
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]+", ");
}
}
}
}
Arrays類的排序方法:
package com.xiaodi.operator.array;
import java.util.Arrays; //引入Arrays類
public class ArrayDemo06 {
public static void main(String[] args) {
int[] a = {1,2,3,546,123,4178,1222};
//對陣列進行排序(升序)
Arrays.sort(a);
//使用toString輸出看一下結果:[1, 2, 3, 123, 546, 1222, 4178]
System.out.println(Arrays.toString(a));
}
}
Arrays具有一下常用功能
- 給陣列賦值:通過 fill 方法
- 對陣列排序:通過 sort 方法,升序
- 比較陣列:通過 equals 方法比較陣列中元素是否相等
- 查找陣列元素:通過 binarySearch 方法能對排序好的陣列進行二分查找法操作
我就不一一演示了,大家知道有這個工具類就行,如果要用到了再查官方檔案,或者也可以自己寫
冒泡排序(擴展)
- 冒泡排序無疑是最出名的排序演算法之一,總共有8大排序!
- 冒泡的代碼還是相當簡單的,兩層回圈,外層冒泡輪數,里層依次比較,江湖中人人盡皆知
package com.xiaodi.operator.array;
import java.util.Arrays;
public class ArrayDemo07 {
public static void main(String[] args) {
int[] a = {1,5,2,8,23,15,992,563,123};
//呼叫完我們自己寫的排序方法后,回傳一個排序后的陣列
int[] sort = sort(a);
System.out.println(Arrays.toString(sort));
}
//冒泡排序
//1、比較陣列中,兩個相鄰的元素,如果第一個數比第二個數大,則就交換它們的位置
//2、每一次比較,都會產生一個最大,或者最小的數字
//3、下一輪則,可以少一次排序
//4、依次回圈,直到結束
public static int[] sort(int[] array) {
//臨時變數
int temp = 0;
//外層回圈,判斷我們回圈要走多少次
for (int i = 0; i < array.length; i++) {
//內層回圈,比較判斷兩個數,如果第一個數比第二個數大,則交換位置
for (int j = 0; j < array.length-1-i; j++) {
if (array[j+1] < array[j]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
}
結果:[1, 2, 5, 8, 15, 23, 123, 563, 992]
這個冒泡排序大家要閉著眼睛都會寫
- 我們看到嵌套回圈,應該立馬就可以得出這個演算法的時間復雜度為O(n2)(這個記一下就好)
思考(如果一開始就是拍好序了他是不是就沒有必要去全部比較一輪了這樣時間就浪費了)如何優化
package com.xiaodi.operator.array;
import java.util.Arrays;
public class ArrayDemo07 {
public static void main(String[] args) {
int[] a = {1,5,2,8,23,15,992,563,123};
//呼叫完我們自己寫的排序方法后,回傳一個排序后的陣列
int[] sort = sort(a);
System.out.println(Arrays.toString(sort));
}
//冒泡排序
//1、比較陣列中,兩個相鄰的元素,如果第一個數比第二個數大,則就交換它們的位置
//2、每一次比較,都會產生一個最大,或者最小的數字
//3、下一輪則,可以少一次排序
//4、依次回圈,直到結束
public static int[] sort(int[] array) {
//臨時變數
int temp = 0;
//外層回圈,判斷我們回圈要走多少次
for (int i = 0; i < array.length; i++) {
boolean flag = false; //通過flag標識位減少沒有意義的比較
//內層回圈,比較判斷兩個數,如果第一個數比第二個數大,則交換位置
for (int j = 0; j < array.length-1-i; j++) {
if (array[j+1] < array[j]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
if (flag == false) {
break;
}
}
return array;
}
}
稀疏陣列(擴展)
- 需求:撰寫五子棋游戲中,有存盤退出和續上盤的功能

分析問題:因為該二維陣列是很多是默認值0,因此記錄了很多沒意義的資料
解決:稀疏陣列
稀疏陣列介紹
- 當一個陣列中大部分元素為0,或者為同一值的陣列時,可以使用稀疏陣列來保存該陣列
- 稀疏陣列的處理方式是:
- 記錄陣列一共有幾行幾列,有多少個不同值
- 把具體不同值的元素和行列及值記錄在一個小規模的陣列中,從而縮小程式的規模
- 如圖下:左邊是原始陣列,右邊是稀疏陣列

有6行,7列,總共有8個值
第一個值在第0行第3列,值為22;通過坐標的方式定位
我們通過代碼實作一下五子棋這個例子:
package com.xiaodi.operator.array;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
public class ArrayDemo08 {
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();
}
System.out.println("--------------------------");
//轉換為稀疏陣列來保存
//1、獲取有效值的個數
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j] != 0) {
sum++;
}
}
}
System.out.println("有效值的個數:" + sum);
System.out.println("--------------------------");
//2、創建一個稀疏陣列的陣列
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//3、遍歷二維陣列,將非零的值,存放在稀疏陣列里面
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];
}
}
}
//4、輸出稀疏陣列
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]);
}
System.out.println("稀疏陣列還原:");
//1、讀取稀疏陣列
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();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442799.html
標籤:其他
上一篇:S3上傳時報錯:Data read has a different length than the expected
