java13編程基礎(chǔ)之數(shù)組深入
大綱
一維數(shù)組
概述
數(shù)組是相同類型數(shù)據(jù)的有序集合。數(shù)組描述的是相同類型的若干個數(shù)據(jù),按照一定的先后次序排列組合而成。其中,每一個數(shù)據(jù)稱作一個元素,每個元素可以通過一個索引(下標)來訪問它們。
這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組“[]”。
特點
- 定長
長度一旦確定不可以改變。
- 相同數(shù)據(jù)類型
其元素必須是 相同 類型,不允許出現(xiàn)混合類型。數(shù)組中的元素可以是任何數(shù)據(jù)類型,包括基本類型和引用類型。
- 位置有序
元素所在的位置是有序的。
- 數(shù)組本身屬于引用類型
數(shù)組變量屬引用類型,數(shù)組也可以看成是對象,數(shù)組中的每個元素相當于該對象的成員變量。數(shù)組本身就是對象Java 中對象是在堆中的,因此數(shù)組無論保存基本類型還是其他對象類型,數(shù)組對象本身是在堆中的。
- 數(shù)組中可以存儲任意類型的數(shù)據(jù)
定義
數(shù)組聲明格式
數(shù)據(jù)類型[] 數(shù)組名稱; --推薦使用
數(shù)據(jù)類型 數(shù)組名稱[];
double[] arr;
char arr2[];
注意 : 引用數(shù)據(jù)類型只聲明不賦值存在默認值null
數(shù)組初始化
動態(tài)初始化
數(shù)組定義與為數(shù)組元素分配空間和賦值的操作分開進行
數(shù)據(jù)類型[] 數(shù)組名=new 數(shù)據(jù)類型[長度];
int[] data = new int[5];
注意:元素為引用數(shù)據(jù)類型的數(shù)組中的每一個元素都需要實例化。
Person[] people; //聲明說組
people = new Person[3]; //創(chuàng)建數(shù)組
people[0] = new Person(); //數(shù)組中元素實例化
people[1] = new Person();
people[2] = new Person();
靜態(tài)初始化
在定義數(shù)組的同時就為數(shù)組元素分配空間并賦值
數(shù)據(jù)類型[] 數(shù)組名=new 數(shù)據(jù)類型[]{值1,值2...};
數(shù)據(jù)類型[] 數(shù)組名={值1,值2...}; --當面的簡寫方式
int[] arr=new int[]{1,3,4,6};
int[] arr2={1,2,3,4,5};
注意:
對于返回值類型為數(shù)組類型的方法來說,我們可以return new int[3];,我們也可以return new int[]{1, 2, 3};,但我們不可以return {1, 2, 3};。即簡寫方式,其不能脫離數(shù)組的聲明,{1, 2, 3}并不能返回一個數(shù)組對象。
一維數(shù)組對象演示圖
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fznINj1S-1606962908310)(/1581389339459.png)]
數(shù)組的默認值
數(shù)組中的元素只聲明不賦值存在默認值,數(shù)組是引用類型,它的元素相當于類的成員變量,因此數(shù)組分配空間后,每個元素也被按照成員變量的規(guī)則被隱式初始化。
一般規(guī)律為數(shù)值型數(shù)組默認值為 0,引用型數(shù)組默認值為 null:
| 數(shù)組類型 | 默認初始值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0 |
| char | 編碼為0的字符 |
| String(引用類型) | null |
| float | 0.0 |
| double | 0.0 |
| boolean | false |
使用
數(shù)組元素的界限
定義并用 new 為之分配空間之后,才可以引用數(shù)組中的每個元素,數(shù)組元素的引用方式為:
arrayName[index];
index為數(shù)組元素下標|索引,可以是整型常量或整型表達式 , 可以根據(jù)數(shù)組元素的下標操作數(shù)組中數(shù)據(jù)。如:
arr1[3] = 5; //為數(shù)組索引為0的空間位置賦值
arr2[0] = "張三"; //為數(shù)組索引為0的空間位置賦值
System.out.println(arr3[2]);//獲取數(shù)組中索引為2的數(shù)據(jù)值
數(shù)組元素下標從0開始;長度為n的數(shù)組的合法下標取值范圍為
0~n-1
每個數(shù)組都有一個屬性length指明它的長度
a.length的值為數(shù)組a的長度(元素的個數(shù))
數(shù)組元素遍歷方式
(1)普通for循環(huán)
for(int 索引=0;索引<長度; 索引++){
數(shù)組名稱[索引] = 值;
}
int[] arr={1,2,3,4};
//1.遍歷數(shù)組---基本for循環(huán)
for(int i=0;i<arr.length;i++){
//變量i代表索引/元素的下標
System.out.println(arr[i]);
}
(2)增強for循環(huán)
for(元素類型 局部變量 : 數(shù)組){
局部變量-->為數(shù)組中的每一個元素值,從左向右以此獲取
}
//2.遍歷數(shù)組---增強for循環(huán)
for(int i : arr){
System.out.println(i); //i中存儲數(shù)組的元素值,非索引
}
數(shù)組基本練習(xí)
//A:遍歷int類型的數(shù)組 依次輸出每個數(shù)組元素
public static void printArray(int[] arr){
//循環(huán)遍歷數(shù)組下標
for(int i=0;i<arr.length;i++){
System.out.println("輸出int類型數(shù)組的每一個元素"+arr[i]);
}
}
//B:逆序:倒敘輸出數(shù)組元素
public static void printArr(String[] arr){
for(int i=arr.length-1;i>=0;i--){
System.out.println(arr[i]);
}
}
//C:最值:獲取數(shù)組中的最大值和最小值
public static void maxMinValue(int[] arr){
//假設(shè)數(shù)組中的第一個元素當成最大值
int max=arr[0];
//假設(shè)數(shù)組中的第一個元素當成最大值
int min=arr[0];
//遍歷數(shù)組
for(int i=0;i<arr.length;i++){
//比較數(shù)組元素與max
if(max<arr[i]){
max=arr[i];
}
//比較數(shù)組元素與min
if(min>arr[i]){
min=arr[i];
}
System.out.println("數(shù)組中最大的值為max"+max);
System.out.println("數(shù)組中最小的值為min"+min);
}
}
Arrays
該類提供了關(guān)于數(shù)組操作的API.
如何查看API
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KAXglmlj-1606962908317)(/1581394901601.png)]
Arrays中常用方法
- 打印數(shù)組----toString方法。
- 比較兩個數(shù)組是否相同----equals方法。
- 數(shù)組排序----sort方法。
- 數(shù)組查找----binarySearch 方法。
- 數(shù)組拷貝----copyOf方法。
- 數(shù)組拷貝----copyOfRange方法。
String[] arr1={"hello","shsxt"};
String[] arr2={"hello","shsxt"};
System.out.println(arr1.equals(arr2)); //false
//1.Arrays.equals() 先判斷兩個數(shù)組的length是否相等,如果相等,再比內(nèi)容,如果不相等,直接返回false
System.out.println(Arrays.equals(arr1, arr2));
//2.Arrays.toString 字符串形式打印數(shù)組信息
System.out.println(Arrays.toString(arr1));
//3.Arrays.sort() 升序
int[] arr3={12,7,0,6,-32};
Arrays.sort(arr3); //-32 0 6 7 12
String[] arr4={"ab","a","bc","abc"}; //根據(jù)Unicode表中的值
Arrays.sort(arr4); //a ab abc bc
//4.Arrays.binarySearch( 數(shù)組, 元素) ) :二分法查找 查找元素在數(shù)組中出現(xiàn)的索引
//前提:先升序排序,才能二分法查找
//找到返回索引,找不到返回-(插入點)-1
Arrays.sort(arr3);
System.out.println(Arrays.binarySearch( arr3, 16)); // -6
經(jīng)典案例實現(xiàn)-點名器
運行代碼,隨機打印班級同學(xué)名字
//1.數(shù)組存儲姓名,用String數(shù)據(jù)類型
String[] names={"杰克","戴維瓊斯","伊麗莎白","愛麗絲"};
//2.遍歷數(shù)組,打印出所有姓名
for(int i=0;i<names.length;i++){
System.out.println(names[i]);
}
//3.隨機出一個人名
//利用隨機數(shù),生成一個證書,作為索引,到數(shù)組中查找對應(yīng)的元素
Random ran=new Random();
//隨機數(shù)的范圍是[0,names.length-1]
int index=ran.nextInt(names.length); //括號中填寫的最大數(shù)是獲取不到的,因為nextInt獲取的范圍是左閉右開區(qū)間
System.out.println(names[index]);
二維數(shù)組
二維數(shù)組可以看成以數(shù)組為元素的數(shù)組。
其實多維數(shù)組不僅僅只有二維數(shù)組,還有三維數(shù)組,四維數(shù)組..., 但是三維以上很少見到,所以大家重點了解二維數(shù)組即可。
舉例
int [][] a = {{1,2},{3,4,0,9},{5,6,7}};
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KMk5ckSA-1606962908322)(/1581392542509.png)]
初始化
動態(tài)初始化
數(shù)組定義與為數(shù)組元素分配空間和賦值的操作分開進行
數(shù)據(jù)類型[][] 數(shù)組名 = new 數(shù)據(jù)類型[一維][二維];
注意:這種初始化方式,每一個內(nèi)層的二位數(shù)組長度相同
int[][] a=new int[3][2];
a[0][0] = 1;
a[0][1] = 2;
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-T2WKnLOE-1606962908325)(/1581393583651.png)]
數(shù)據(jù)類型[][] 數(shù)組名 = new 數(shù)據(jù)類型[一維][];
內(nèi)層數(shù)組需要我們自己去創(chuàng)建(下面可以用一維數(shù)組的創(chuàng)建方式)
數(shù)組名[一維數(shù)組索引值] = new 數(shù)據(jù)類型[二維];
int[][] a=new int[3][];
arr[0]=new int[2];
arr[1]=new int[]{3,4,5,6};
arr[2]=new int[]{7,8,9};
arr[0][0] = 1;
arr[0][1] = 2;
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Z3A7nO8h-1606962908328)(/1581394324396.png)]
靜態(tài)初始化
在定義數(shù)組的同時就為數(shù)組元素分配空間并賦值
數(shù)據(jù)類型[][] 數(shù)組名 = new 數(shù)據(jù)類型[][]{{...},{...},{...}};
數(shù)據(jù)類型[][] 數(shù)組名 = {{...},{...},{...}}; --簡化寫法
int[][] arr1=new int[][]{{5,4,8},{3,8},{1}};
char[][] arr2={{'a'},{'b','c'}};
遍歷方式
雙重循環(huán)實現(xiàn)多維數(shù)組的遍歷
//普通for循環(huán)嵌套增強for循環(huán)
for(int i=0;i<=arr1.length-1;i++){
for(int j:arr1[i]){
System.out.println(j);
}
}
//增強 for循環(huán)嵌套普通for循環(huán)
for(int[] arr:arr1){
for(int i=0;i<=arr.length-1;i++){
System.out.println(arr[i]);
}
}
//普通for嵌套普通for循環(huán)
...
//增強for嵌套增強for循環(huán)
...
Arrays中提供操作多維數(shù)組的方法:
static boolean deepEquals(Object[] a1, Object[] a2) 如果兩個指定的數(shù)組彼此 深度相等 ,則返回 true 。
static String deepToString(Object[] a) 返回指定數(shù)組的“深度內(nèi)容”的字符串表示形式。
double[][] arr1= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};
double[][] arr2= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};
System.out.println(Arrays.deepToString(arr1)); //[[1.0, 2.0], [3.0, 4.0, 5.0], [6.0]]
System.out.println(Arrays.deepEquals(arr1, arr2)); //true
bject[] a1, Object[] a2) 如果兩個指定的數(shù)組彼此 深度相等 ,則返回 true 。
static String deepToString(Object[] a) 返回指定數(shù)組的“深度內(nèi)容”的字符串表示形式。
```java
double[][] arr1= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};
double[][] arr2= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};
System.out.println(Arrays.deepToString(arr1)); //[[1.0, 2.0], [3.0, 4.0, 5.0], [6.0]]
System.out.println(Arrays.deepEquals(arr1, arr2)); //true