文章目錄
- Java陣列
- 1、陣列的定義
- 1.1、陣列的宣告創建
- 1.2、記憶體分析
- 1.3、陣列的三種初始化
- 1.4、 陣列的基本特點
- 1.5、陣列邊界
- 2、陣列的使用
- 2.1、For-Each回圈
- 2.2、陣列作方法入參
- 2.3、陣列作回傳值
- 3、多維陣列
- 4、Arrays類
- 5、冒泡排序
- 6、稀疏陣列
Java陣列
1、陣列的定義
陣列是相同型別資料的有序集合
陣列描述的是相同型別的若干資料,按照一定先后次序排序組合而成
其中,每一個資料稱作一個陣列元素,每個陣列元素可以通過下標訪問它們
1.1、陣列的宣告創建
-
首先必須宣告陣列變數,才能在程式中使用陣列,
dataType[] arrayRefVar; //首選 dataType arrayRefVar[]; //效果相同,但不是首選 -
Java語言使用new運算子來創建陣列,語法如下
dataType[] arrayRefVar = new dataType[arraySize]; //int[] nums=new int[10] -
陣列的元素是通過索引訪問的,陣列索引從0開始
-
獲取陣列長度:arrays.length
int[] nums; //1.宣告一個陣列
nums = new int[3]; //2.創建一個陣列
//3.給陣列元素賦值
nums[0]=1;
nums[1]=2;
nums[2]=3;
for (int num : nums) { //列印陣列所有元素
System.out.println(num);
}
1.2、記憶體分析


1.3、陣列的三種初始化
-
靜態初始化
//靜態初始化:創建+賦值 int[] a={1,2,3}; Man[] mans={new Man(1,1),new Man(2,2)} -
動態初始化
//包含默認初始化 int[] a=new int[2]; //默認值為0 a[0]=1; a[1]=2; -
默認初始化
陣列是參考型別,它的元素相當于類的實體變數,因此陣列一經分配空間,其中的每個元素也被按照實體變數同樣的方式被隱式初始化,
1.4、 陣列的基本特點
- 其長度是確定的,陣列一旦被創建,它的大小就是不可改變的,
- 其元素必須是相同型別,不允許出現混合型別,
- 陣列中的元素可以是任何資料型別,包括基本型別和參考型別,
- 陣列變數屬于參考型別,陣列也可以看作物件,其中每個元素相當于該物件的成員變數,
- 陣列本身就是物件,Java中物件是在堆中的,因此陣列無論保存原始型別還是其他物件型別, 陣列本身是在堆中的,
1.5、陣列邊界
下標的合法區間:[0, length-1],如果越界就會報錯;
public static void main(String[] args) {
int[] a=new int[2];
system.out.println(a[2]);
}
ArraylndexOutOfBoundsException:陣列下標越界例外!
小結:
- 陣列是相同資料型別(資料型別可以為任意型別)的有序集合陣列也是物件,
- 陣列元素相當于物件的成員變數
- 陣列長度的確定的,不可變的, 如果越界,則報:ArraylndexOutofBounds
2、陣列的使用
2.1、For-Each回圈
int[] arrays = {1,2,3,4,5};
//列印全部的陣列元素 JDK1.5 沒有下標
for (int array : arrays) {
System.out.println(array);
}
2.2、陣列作方法入參
//列印陣列元素
public static void printArray(int[] a){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
2.3、陣列作回傳值
//反轉陣列
public static int[] reverse(int[] arrays){
int[] result = new int[arrays.length];
//反轉的操作
for (int i = 0; i < arrays.length; i++) {
result[i] = arrays[arrays.length-i-1];
}
return result;
}
3、多維陣列
多維陣列可以看成陣列的陣列,比如二維陣列就是一個特殊的陣列,其每一個元素都是一個一維陣列,
int arr[][] = new int[3][2]; //二維陣列,三行兩列

int[][] array = {{1,2},{3,4},{5,6}};
//列印二維陣列所有元素
for (int i = 0; i < array.length; i++) { //arrays.length=3
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]+" ");
}
System.out.println();
}
4、Arrays類
- 陣列的工具類java.util.Arrays
- 由于陣列物件本身并沒有什么方法可以供我們使用,但API提供了一個工具類Arrays供我們使用,
- Array類中的方法都是static修飾的靜態方法,使用時直接使用類名進行呼叫,可以不用物件呼叫,
- 常用功能
- 給陣列賦值:fill方法,
- 排序:sort方法,升序,
- 比較陣列:equals方法比較陣列中元素值是否相等,
- 查找陣列元素:binarySearch對排序好的陣列進行二分查找法操作,
int[] a = {1,2,3,4,9000,32145,451,21};
System.out.println(a); // [I@28d93b30 (hashcode)
//Arrays.toString 列印陣列元素
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 9000, 32145, 451, 21]
//二分法查找某值 回傳下標
System.out.println(Arrays.binarySearch(a, 9000)); // 4
//填充
Arrays.fill(a,2,4,0); //陣列[a[2]~a[4])之間填充0
System.out.println(Arrays.toString(a)); //[1, 2, 0, 0, 9000, 32145, 451, 21]
//升序排序
Arrays.sort(a);
5、冒泡排序
1、冒泡排序是八大排序最出名的排序演算法,
2、代碼:兩層回圈,外層冒泡輪數,里層依次比較,
3、當我們看到嵌套回圈,應該立馬就可以得出這個演算法的時間復雜度為O(n2),
//冒泡排序
//1.比較陣列中兩個相鄰的元素,如果第一個數大于第二個數,交換它們位置
//2.每一次比較,都會產生一個最大或最小的數字(升序為最大數)
//3.下一輪則可以少一次排序
//4.依次回圈,直到結束
public static int[] sort(int[] array){
int temp=0;
//外層回圈,次數length-1
for (int i = 0; i < array.length-1; i++) {
//內層回圈:如果第一個數大于第二個數,交換它們位置
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag = true;
}
}
}
return array;
}
public static void main(String[] args) {
int[] a={8,1,35,47,19,-2};
int[] sort = sort(a);
System.out.println(Arrays.toString(sort)); //[-2, 1, 8, 19, 35, 47]
}
優化
//冒泡排序演算法
int[] a = {6,2,4,5,2,1,3};
int temp = 0;
for(int i = 0;i<a.length-1;i++){
boolean flag = false;
for(int j = 0;j<a.length-1-i;j++){
if(a[j] > a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = true;
}
}
}
if(!flag){
break;
}
System.out.println("排序后的結果是:");
for(int i : arr){
System.out.print(i);
}
6、稀疏陣列
當一個陣列中大部分元素為0,或者為同一值的陣列時,可以使用稀疏數
- 組來保存該陣列稀疏陣列的處理方式是:
-
記錄陣列一共有幾行幾列,有多少個不同值
-
把具有不同值的元素和行列及值記錄在一個小規模的陣列中,從而縮小程式的規模
-
如下圖:左邊是原始陣列,右邊是稀疏陣列

-
需求:撰寫五子棋游戲中,有存盤退出和續上盤的功能
分析問題:因為該二維陣列的很多值是默認值0,因此記錄了很多沒有意義的資料,
解決:稀疏陣列
//創建一個二維陣列 11*11 0:沒有棋子,1:黑棋 2:白棋
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
//輸出原始的陣列
System.out.println("原始的陣列:");
for (int[] array : array1) {
for (int i : array) {
System.out.print(i+"\t");
}
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++;
}
}
}
//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++) {
for (int j = 0; j < array2[i].length; j++) {
System.out.print(array2[i][j]+"\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
稀疏陣列
11 11 2
1 2 1
2 3 2
*/
視頻學習地址:https://www.bilibili.com/video/BV12J41137hu?p=51
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/298104.html
標籤:java
上一篇:深度思考:老生常談的雙親委派機制,JDBC、Tomcat是怎么反其道而行之的?
下一篇:手擼一個mvc框架有多簡單
