Java樹形結構資料介面(Java8->Stream流實現)
目錄
定義長度為10的int陣列,陣列中的10個元素為隨機生成的1-100的數字,要求:列印陣列中第二大的數和第二小的數字
闡述
陣列的概念及定義格式
陣列是儲存同一種類型多個變數(元素)的東西(容器)。
定義格式
資料型別[] 陣列名
Java中的記憶體分配及陣列的記憶體結構圖
如果我們動態初始化一個數組,並將陣列及其元素打印出來,結果如下
int[] arr = new int[3]; System.out.println(arr); // 輸出Java程式分配的記憶體的地址值,假設這次分配的地址值是001 System.out.println(arr[0]); // 輸出0 System.out.println(arr[0]); // 輸出0 System.out.println(arr[0]); // 輸出0
首先講一下Java中的記憶體分配。JVM記憶體劃分為五部分,分別是 棧記憶體、堆記憶體、方法區、本地方法區和暫存器。方法區是儲存方法的,本地方法區和系統相關,暫存器是給CPU使用的,我們重點講棧記憶體和堆記憶體。
棧儲存的是區域性變數。區域性變數就是定義在方法中的變數,在上面的例子中,區域性變數arr 就被存在棧記憶體中,使用完畢立即回收。
堆儲存的是new出來的東西,即物件。在上面的例子中,new int[3]這個動作就是在堆記憶體中開闢了一個空間,分成3個小區域,每個區域都有相應的索引。假設這個空間的地址值是001,該地址值被賦給棧記憶體中的arr,arr就可以通過001指向堆記憶體中的001區域。堆記憶體裡的東西使用完以後,會在垃圾回收器空閒的時候被回收。
動態初始化的陣列,其資料都是預設值。
拓展知識:
每一個物件都有地址值
每一個物件的資料都有預設值
整數:0
小數:0.0
字串:'\u0000'
布林型:false
引用型別:null
陣列靜態初始化的方式
初始化時指定每個陣列元素的初始值,由系統決定陣列的長度。
格式:
資料型別[] 陣列名 = new 資料型別[]{元素1,元素2,...};
可簡寫為
資料型別[] 陣列名 = {元素1,元素2,...};
陣列操作的常見問題及解決方案
編譯不報錯,執行時報錯的兩個常見問題
1.陣列索引越界異常 ArrayIndexOutOfBoundsException
產生原因:訪問了不存在的索引
解決方案:訪問存在的索引
2.空指標異常NullPointerException
產生原因:訪問了未指向堆記憶體的資料,即null
解決方案:訪問物件不為null
課後作業
定義長度為10的int陣列,陣列中的10個元素為隨機生成的1-100的數字,要求:列印陣列中第二大的數和第二小的數字
列印格式:
原陣列內容
90 34 12 35 98 23 17 71 4 66
陣列中的第二大的數字為:90
陣列中的第二小的數字為:12
public class SecondMaxMin {
public static void main(String[] args) {
//1.定義陣列
int[] arr = new int[10];
//2.生成陣列
for(int i=0; i<10; i++) {
Random rdRandom = new Random();
arr[i] = rdRandom.nextInt(100) + 1;
}
//3.列印原陣列內容
for(int a: arr) {
System.out.print(a + " ");
}
System.out.println();
//4.列印陣列中第二大的數字和第二小的數字
// int max = Integer.MIN_VALUE,secondMax = Integer.MIN_VALUE; //BUG:如果第一個元素恰好是第二大數,secondMax沒有機會得到該數值。
// int min = Integer.MAX_VALUE,secondMin = Integer.MAX_VALUE; //BUG:如果第一個元素恰好是第二小數,secondMin沒有機會得到該數值。
int max = arr[0];
int secondMax = Integer.MIN_VALUE;
int min = arr[0];
int secondMin =Integer.MAX_VALUE;
for(int b : arr) {
if(b > secondMax) {
if(b > max) {
secondMax = max;
max = b;
}else {
secondMax = b;
}
}else if (b < secondMin) {
if (b < min) {
secondMin = min;
min = b;
}else {
secondMin = b;
}
}
}
System.out.println("陣列中的第二大的數字為:" + secondMax);
System.out.println("陣列中的第二小的數字為:" + secondMin);
}
}
拓展知識:
在JDK中,整形型別是有範圍的,最大值為Integer.MAX_VALUE,即2147483647,最小值為Integer.MIN_VALUE -2147483648。
對整形最大值加1,2147483648(越界了),那麼此時值為多少呢?結果是-2147483648,即是Integer.MIN_VALUE(整形的最小值)。
類似的,對Integer.MIN_VALUE(整形的最小值)取反或者取絕對值呢?仍為Integer.MIN_VALUE(整形的最小值),因為值為-2147483648,絕對值2147483648超過整形的最大值(Integer.MAX_VALUE 2147483647)。
所以就有以下結果
Integer.MAX_VALUE + 1 = Integer.MIN_VALUE
Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE (絕對值)
Long,short,byte的結論是相同的。