1.陣列
概念:
指的是一種容器,可以同來儲存同種資料型別的多個值。
但是陣列容器在儲存資料的時候,需要結合隱式轉換考慮。
比如:
定義了一個int型別的陣列。那麼boolean。double型別的資料是不能存到這個陣列中的,
但是byte型別,short型別,int型別的資料是可以存到這個陣列裡面的。
建議:
容器的類,和儲存的資料型別保持一致。
舉例:
整數1 2 3 4 56 就可以使用int型別的陣列來儲存。
小數1.1 1.2 1.3 1.4 就可以使用double型別的陣列來儲存。
字串"aaa" "bbb" "ccc" 就可以使用String型別的陣列來儲存。
2.陣列的定義
格式一:
資料型別 [] 陣列名
比如:int [] array
格式二:
資料型別 陣列名 []
比如: int array []
詳解:
資料型別:限定了陣列以後能存什麼型別的資料。
方括號:表示現在定義的是一個陣列。
陣列名:就是一個名字而已,方便以後使用。
注意點:
方法括號跟陣列名,誰寫在前面,誰寫在後面都是一樣的。
平時習慣性使用第一種方式。
3.陣列的靜態初始化
完整格式:
資料型別[] 陣列名 = new 資料型別[]{元素1,元素2,元素3,元素4...};
比如:
int[] arr = new int[]{11,22,33};
double[] arr = new double[]{1.1,1.2,1.3};
格式詳解:
資料型別:限定了陣列以後能存什麼型別的資料。
方括號:表示現在定義的是一個陣列。
陣列名:其實就是名字而已,方便以後使用,在起名字的時候遵循小駝峰命名法。
arr namesArr
new:就是給陣列在記憶體中開闢了一個空間。
資料型別:限定了陣列以後能存什麼型別的資料。
前面和後面的資料型別一定要保持一致。
int[] arr = new double[]{11,22,33};//錯誤寫法
方括號:表示現在定義的是一個陣列。
大括號:表示陣列裡面的元素。元素也就是存入到陣列中的資料。
多個元素之間,一定要用逗號隔開。
注意點:
- 等號前後的資料型別必須保持一致。
- 陣列一旦建立之後,長度不能發生變化。
簡化格式:
資料型別[] 陣列名 = {元素1,元素2,元素3,元素4...};
比如:
int[] array = {1,2,3,4,5};
double[] array = {1.1,1.2,1.3};
練習1:
定義陣列儲存5個學生的年齡。
1.給陣列限定什麼型別? int
2.利用靜態初始化完成建立並新增元素
int[] agesArr = new int[]{18,19,20,21,22};
int[] agesArr = {18,19,20,21,22};
練習2:
定義陣列儲存3個學生的姓名。
1.給陣列限定什麼型別? String
2.利用靜態初始化完成建立並新增元素
String[] namesArr = new String[]{"zhangsan","lisi","wangwu"};
String[] namesArr = {"zhangsan","lisi","wangwu"};
練習3:
定義陣列儲存4個學生的身高。
1.給陣列限定什麼型別? double
2.利用靜態初始化完成建立並新增元素
double[] heightsArr = new double[]{1.85,1.82,1.78,1.65};
double[] heightsArr = {1.85,1.82,1.78,1.65};
4.地址值
int[] arr = {1,2,3,4,5};
System.out.println(arr);//[I@6d03e736
double[] arr2 = {1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2
列印陣列的時候,實際出現的是陣列的地址值。
陣列的地址值:就表示陣列在記憶體中的位置。
以[I@6d03e736為例:
[ :表示現在列印的是一個陣列。
I:表示現在列印的陣列是int型別的。
@:僅僅是一個間隔符號而已。
6d03e736:就是陣列在記憶體中真正的地址值。(十六進位制的)
但是,我們習慣性會把[I@6d03e736這個整體稱之為陣列的地址值。
地址值對於我們來京,作用不大,簡單瞭解。
5.陣列元素訪問
格式:
陣列名[索引];
作用:
- 獲取陣列中對應索引上的值
修改陣列中對應索引上的值
一旦修改之後,原來的值就會被覆蓋了。
程式碼示例:
public class ArrDemo2 {
/*
陣列中元素訪問的格式:
陣列名[索引];
作用:
1.獲取指定索引上對應的元素
2.修改指定索引上對應的元素
*/
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
//需求1:獲取arr陣列中,3索引上的值
int number = arr[3];
System.out.println(number);
System.out.println(arr[3]);
//需求2:將arr陣列中,3索引上的值修改為10
arr[3] = 10;
System.out.println("修改之後為:" + arr[3]);
}
}
6.索引
也叫角標、下標
就是陣列容器中每一個小格子對應的編號。
索引的特點:
- 索引一定是從0開始的。
- 連續不間斷。
- 逐個+1增長。
7.陣列的遍歷
遍歷:就是把陣列裡面所有的內容一個一個全部取出來。
陣列的長度:陣列名.length;
通用程式碼:
for(int i = 0; i < arr.length; i++){
//在迴圈的過程中,i依次表示陣列中的每一個索引
sout(arr[i]);//就可以把陣列裡面的每一個元素都獲取出來,並列印在控制檯上了。
}
8.陣列的動態初始化
格式:
資料型別[] 陣列名 = new 資料型別[陣列的長度];
舉例:
//1.定義一個陣列,存3個人的年齡,年齡未知
int[] agesArr = new int[3];
//2.定義一個陣列,存班級10名學生的考試成績,考試成績暫時未知,考完才知道。
int[] scoresArr = new int[10];
陣列的預設初始化值:
整數型別:0
小數型別:0.0
布林型別:false
字元型別:'\u0000'
引用型別:null
9.陣列兩種初始化方式的區別
靜態初始化:int[] arr = {1,2,3,4,5};
動態初始化:int[] arr = new int[3];
靜態初始化:手動指定陣列的元素,系統會根據元素的個數,計算出陣列的長度。
動態初始化:手動指定陣列長度,由系統給出預設初始化值。
使用場景:
只明確元素個數,但是不明確具體的資料,推薦使用動態初始化。
已經明確了要操作的所有資料,推薦使用靜態初始化。
舉例:
使用陣列來儲存鍵盤錄入的5個整數。
int[] arr = new int[5];
將全班的學生成績存入陣列中,已知學生成績為:66,77,88,99,100
int[] arr = new int[5];
arr[0] = 66;
arr[1] = 77;
... 雖然可以實現,但是太麻煩了。
建議使用靜態初始化:int[] arr = {66,77,88,99,100};
10.陣列常見問題
當訪問了陣列中不存在的索引,就會引發索引越界異常。
避免:
針對於任意一個陣列,索引的範圍:
最小索引:0
最大索引:陣列的長度 - 1
陣列名.length - 1
public class ArrDemo6 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,5,5,5,5};
//用索引來訪問陣列中的元素
System.out.println(arr[1]);
System.out.println(arr[10]);//ArrayIndexOutOfBoundsException
}
}
11.陣列的練習
練習1:求和
需求:定義一個陣列,儲存1,2,3,4,5
遍歷陣列得到每一個元素,求陣列裡面所有的資料和
程式碼示例:
/*定義一個陣列,儲存1,2,3,4,5
遍歷陣列得到每一個元素,求陣列裡面所有的資料和*/
//分析:
//1.定義一個陣列,並新增資料1,2,3,4,5
int[] arr = {1,2,3,4,5};
//求和變數
int sum = 0;
//2.遍歷陣列得到每一個資料,累加求和
for (int i = 0; i < arr.length; i++) {
//i 依次表示陣列裡面的每一個索引
//arr[i] 依次表示陣列裡面的每一個元素
sum = sum + arr[i];
}
//當迴圈結束之後,sum的值就是累加之後的結果
System.out.println(sum);
練習2:統計個數
需求:定義一個陣列,儲存1,2,3,4,5,6,7,8,9,10
遍歷陣列得到每一個元素,統計陣列裡面一共有多少個能被3整除的數字
程式碼示例:
//分析:
//1.定義一個陣列 儲存1,2,3,4,5,6,7,8,9,10
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//定義一個變數,用來統計次數
int count = 0;
//2.遍歷陣列得到每一個元素
for (int i = 0; i < arr.length; i++) {
//i 表示陣列裡面的每一個索引
//arr[i] 表示陣列裡面的每一個元素
//3.判斷當前的元素是否為3的倍數,如果是那麼統計變數就需要自增一次。
if(arr[i] % 3 == 0){
// System.out.println(arr[i]);
count++;
}
}
//當迴圈結束之後,就表示陣列裡面所有的數字都判斷完畢了,直接列印count即可
System.out.println("陣列中能被3整除的數字有" + count + "個");
練習3:變化資料
需求:
定義一個陣列,儲存1,2,3,4,5,6,7,8,9,10
遍歷陣列得到每一個元素。
要求:
1,如果是奇數,則將當前數字擴大兩倍
2,如果是偶數,則將當前數字變成二分之一
程式碼示例:
//分析:
//1.定義一個陣列,存1,2,3,4,5,6,7,8,9,10
int[] arr = {1,2,3,4,5,6,7,8,9,10};
//2.遍歷陣列得到每一個元素
for (int i = 0; i < arr.length; i++) {
//i 依次表示陣列裡面的每一個索引
//arr[i] 依次表示陣列裡面的每一個元素
//3.對每一個元素進行判斷
if(arr[i] % 2 == 0){
//偶數 變成二分之一
arr[i] = arr[i] / 2;
}else{
//奇數 擴大兩倍
arr[i] = arr[i] * 2;
}
}
//遍歷陣列
//一個迴圈儘量只做一件事情。
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
練習4:求最值
需求:求陣列中的最大值
程式碼示例:
//定義陣列求最大值:33,5,22,44,55
//擴充套件問題:
//1.根據求最大值的思路,自己改寫一下求最小智
//2.為什麼max要記錄為arr[0],預設值不能為0嗎?
//不能寫0
//max的初始化值一定要是陣列中的值。
//3.迴圈中開始條件一定是0嗎?
//迴圈的開始條件如果為0,那麼第一次迴圈的時候是自己跟自己比了一下,對結果沒有任何影響,但是效率偏低
//為了提高效率,減少一次迴圈的次數,迴圈開始條件可以寫1.
//1.定義陣列用來儲存5個值
int[] arr = {33,5,22,44,55};
//2.定義一個變數max用來儲存最大值
//臨時認為0索引的資料是最大的
int max = arr[0];
//3.迴圈獲取陣列中的每一個元素
//拿著每一個元素跟max進行比較
for (int i = 1; i < arr.length; i++) {
//i 索引 arr[i] 元素
if(arr[i] > max){
max = arr[i];
}
}
//4.當迴圈結束之後,max記錄的就是陣列中的最大值
System.out.println(max);//55
練習5:統計個數
需求:生成10個1~100之間的隨機數存入陣列。
1)求出所有資料的和
2)求所有資料的平均數
3)統計有多少個資料比平均值小
程式碼示例:
//分析:
//1.定義陣列
int[] arr = new int[10];
//2.把隨機數存入到陣列當中
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//每迴圈一次,就會生成一個新的隨機數
int number = r.nextInt(100) + 1;
//把生成的隨機數新增的陣列當中
//陣列名[索引] = 資料;
arr[i] = number;
}
// 1)求出所有資料的和
//定義求和變數
int sum = 0;
for (int i = 0; i < arr.length; i++) {
//迴圈得到每一個元素
//並把元素累加到sum當中
sum = sum + arr[i];
}
System.out.println("陣列中所有資料的和為:" + sum);
//2)求所有資料的平均數
int avg = sum / arr.length;
System.out.println("陣列中平均數為:" + avg);
//3)統計有多少個資料比平均值小
int count = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] < avg){
count++;
}
}
//當迴圈結束之後,就表示我已經找到了所有的比平均數小的資料
System.out.println("在陣列中,一共有" + count + "個資料,比平均數小");
//遍歷陣列,驗證答案
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
練習6:交換資料
需求:定義一個陣列,存入1,2,3,4,5。按照要求交換索引對應的元素。
交換前:1,2,3,4,5
交換後:5,2,3,4,1
程式碼示例:
//1.定義陣列儲存資料
int[] arr = {1,2,3,4,5};
//2.利用迴圈去交換資料
for(int i = 0,j = arr.length - 1; i < j; i++,j--){
//交換變數i和變數j指向的元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//當迴圈結束之後,那麼陣列中的資料就實現了頭尾交換
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
練習7:打亂資料
需求:定義一個陣列,存入1~5。要求打亂陣列中所有資料的順序。
程式碼示例:
//1.定義陣列儲存1~5
int[] arr = {1, 2, 3, 4, 5};
//2.迴圈遍歷陣列,從0索引開始打亂資料的順序
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//生成一個隨機索引
int randomIndex = r.nextInt(arr.length);
//拿著隨機索引指向的元素 跟 i 指向的元素進行交換
int temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
//當迴圈結束之後,那麼陣列中所有的資料已經打亂順序了
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}