1. 程式人生 > 其它 >Java樹形結構資料介面(Java8->Stream流實現)

Java樹形結構資料介面(Java8->Stream流實現)

技術標籤:Javajava

目錄

闡述

陣列的概念及定義格式

Java中的記憶體分配及陣列的記憶體結構圖

陣列靜態初始化的方式

陣列操作的常見問題及解決方案

課後作業

定義長度為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的結論是相同的。