1. 程式人生 > >第五天 陣列

第五天 陣列

5.1 陣列概述和定義格式說明

  1. 為什麼要有陣列(容器)
    1. 為了儲存同種資料型別的多個值
  2. 陣列概念
    1. 陣列是儲存同一種資料型別多個元素的集合,也可以看成是一個容器
    2. 陣列既可以儲存基本資料型別,也可以儲存引用資料型別
  3. 陣列定義格式
    1. 資料型別 [ ] 陣列名=new 資料型別 [陣列的長度]

    int[] arr = new int[5];//可以儲存五個int型別的資料

左邊:

int:資料型別

[]:代表的陣列,幾個中括號就代表幾維陣列

arr:合法的識別符號

右邊:

new:建立新的實體或物件

int:資料型別

[]:代表的陣列

5:代表陣列的長度

5.2 陣列的初始化動態初始化

  1. 什麼是陣列的初始化
    1. 就是為陣列開闢連續的記憶體空間,併為每個陣列元素賦予值
  2. 如何對陣列進行初始化
    1. 動態初始化 只指定長度,由系統給出初始化值

Int [] arr=new int [5];

    1. 靜態初始化 給出初始化值,由系統決定長度
  1. 動態初始化的格式

資料型別 [] 陣列名=new 資料型別 [陣列長度];

  1. 案例演示

輸出陣列名稱和陣列元素

整數型別:byte,short,int,long預設初始化值都是0

浮點型別:float,double預設初始化值都是0.0

布林型別:boolean預設初始化值false

字元型別:char預設初始化值'\u0000'

char在記憶體中佔的兩個位元組,是16個二進位制位

\u0000,每一個0其實代表的是16進位制的0,那麼四個0就是代表16個二進位制位

[[email protected]

[代表是陣列,幾個就代表幾維

I代表是int型別

@是固定的

19bb25a代表的是陣列的地址值

class Demo2_Array {
	public static void main(String[] args) {
	//資料型別[] 陣列名 = new 資料型別[陣列長度];
	int[] arr = new int[5];//動態初始化,在記憶體中開闢連續的5塊空間
	System.out.println(arr[0]);//系統給出預設初始化值,整數型別的都是0
	arr[0] = 10;
	System.out.println(arr[0]);	
	System.out.println(arr);			//[
[email protected]
} }

5.3 Java中的記憶體分配以及棧和堆的區別

棧:儲存區域性變數

堆:儲存new出來的陣列或物件

方法區:面向物件部分講解

本地方法區:和系統相關

暫存器:給CPU使用

5.4 陣列的記憶體圖解1 一個數組

5.5 陣列的記憶體2兩個陣列

5.6 陣列的記憶體圖解3三個引用兩個陣列

5.7 陣列的初始化靜態初始化及記憶體圖

靜態初始化的格式:

格式 資料型別 [] 陣列名=new 資料型別[]{元素1,元素2,元素3,…};

class Demo6_Array {
	public static void main(String[] args) {
		//資料型別[] 陣列名 = new 資料型別[]{元素1,元素2,…};
		//int[] arr = new int[5]{11,22,33,44,55};	//不允許動靜結合
		int[] arr2 = {11,22,33,44,55};			//靜態初始化的簡寫形式
		//int[] arr;								//宣告陣列引用
		//arr = new int[]{11,22,33,44,55};
		//int[] arr2;
		//arr2 = {11,22,33,44,55};				//簡寫形式宣告和賦值在同一行

		System.out.println(arr2);
		System.out.println(arr2[4]);
	}
}

5.8 陣列操作的兩個常見小問題越界和空指標

a:ArrayIndexOutOfBoundsException:陣列索引越界異常

原因:你訪問了不存在的索引

b:NullPointerException:空指標異常

原因:陣列已經不在指向堆記憶體了。而你還用陣列名去訪問元素。

int[] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);
class Demo7_Exception {
	public static void main(String[] args) {
		int[] arr = new int[5];						//0x0011
		//System.out.println(arr[-1]); //當訪問陣列中不存在的索引,會出現索引越界異常
		arr = null;
		System.out.println(arr[0]); //當陣列引用賦值為null,再去呼叫陣列中的元素就會出現空指標異常
	}
}

5.9 陣列的操作遍歷

陣列遍歷:就是依次輸出陣列中的每一個元素。

陣列的屬性:arr.length陣列的長度

陣列的最大索引:arr.length - 1;

class Demo8_Array {
	public static void main(String[] args) {
		int[] arr = {11,22,33,44,55};
		for (int i = 0;i < 5 ;i++ ) {
			System.out.println(arr[i]);
		}
		System.out.println("---------------");
		//arr.length 代表的是陣列的長度
		System.out.println(arr.length);
		for (int i = 0;i < arr.length ;i++ ) {
			System.out.println(arr[i]);
		}
		int[] arr2 = {3,4,5};
		print(arr2);
	}
	/*
	陣列的遍歷
	1,返回值型別void
	2,引數列表int[] arr
	*/
	public static void print(int[] arr) {
		for (int i = 0;i < arr.length ;i++ ) {
			System.out.print(arr[i] + " ");
		}
	}
}

5.10 陣列的操作2取最值

陣列獲取最值(獲取陣列中的最大值最小值)

class Demo9_Array {
	public static void main(String[] args) {
		int[] arr = {33,77,22,44,55};
		int max = getMax(arr);
		System.out.println(max);
	}
	/*
	獲取陣列中最大值
	1,返回值型別int
	2,引數列表int[] arr
	*/
	public static int getMax(int[] arr) {
		int max = arr[0];
		for (int i = 1;i < arr.length ;i++ ) {//從陣列的第二個元素開始遍歷
			if (max < arr[i]) {	      //如果max記錄的值小於的陣列中的元素
				max = arr[i];	      //max記錄住較大的
			}
		}
		return max;
	}
}

5.11 陣列的操作3反轉

陣列元素反轉就是把元素對調

class Demo10_Array {
	public static void main(String[] args) {
		int[] arr = {11,22,33,44,55};
		reverseArray(arr);
		print(arr);
	}
	/*
	陣列元素反轉
	1,明確返回值型別void
	2,明確引數列表int[] arr
	*/
	public static void reverseArray(int[] arr) {
		for (int i = 0;i < arr.length / 2 ; i++) {
			//arr[0]和arr[arr.length-1-0]交換
			//arr[1]和arr[arr.length-1-1]交換
			//arr[2]和arr[arr.lentth-1-2]
			//...
			int temp = arr[i];
			arr[i] = arr[arr.length-1-i];
			arr[arr.length-1-i] = temp;
		}
	}
	/*
	陣列遍歷
	1,明確返回值型別void
	2,明確引數列表int[] arr
	*/
	public static void print(int[] arr) {
		for (int i = 0;i < arr.length ;i++ ) {	//遍歷陣列中的每一個元素
			System.out.print(arr[i] + " ");	//列印在控制檯
		}
	}
}

5.12 陣列的操作4查表法

陣列查表法(根據鍵盤錄入索引,查詢對應星期)

import java.util.Scanner;
class Demo11_Array {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("請輸入對應的星期範圍在1-7");
		int week = sc.nextInt();
		System.out.println("星期" + getWeek(week));
	}
	/*
	根據索引返回對應的星期
	1,返回值型別char
	2,引數列表int week
	*/
	public static char getWeek(int week) {
		char[] arr = {' ','一','二','三','四','五','六','日'};		//定義了一張星期表
		return arr[week];											//通過索引獲取表中的元素
	}
}

5.13 陣列的操作5基本查詢

陣列的元素查詢(查詢指定元素第一次在陣列中出現的索引)

class Demo12_Array {
	public static void main(String[] args) {
		int[] arr = {11,22,33,44,55,66,77};
		int index = getIndex(arr,88);
		System.out.println(index);
	}
	/*
	查詢元素索引
	1,返回值型別int
	2,明確引數列表,int[] arr,int value
	*/
	public static int getIndex(int[] arr,int value) {
		for (int i = 0;i < arr.length ;i++ ) {			//陣列的遍歷
			if (arr[i] == value) {					//如果陣列中的元素與查詢的元素匹配
				return i;
			}
		}
		return -1;
		
	}
}

5.14 二維陣列概述和格式1講解

二維陣列格式1:int[][] arr = new int[3][2];

注意事項:

* a:以下格式也可以表示二維陣列

       * 1:資料型別 陣列名[][] = new 資料型別[m][n];

       * 2:資料型別[] 陣列名[] = new 資料型別[m][n];

    * B:注意下面定義的區別

*int x;

int y;

int x,y;

int[] x;

int[] y[];

int[] x,y[];  x是一維陣列,y是二維陣列

定義二維陣列,輸出二維陣列名稱,一維陣列名稱,一個元素

class Demo1_Array {
	public static void main(String[] args) {
		int[][] arr = new int[3][2];
		/*
		這是一個二維陣列
		這個二維陣列中有3個一維陣列
		每個一維陣列中有2個元素
		[[[email protected]				//二維陣列的地址值
		[[email protected]				//一維陣列的地址值
		0					//元素值
		*/
		System.out.println(arr);		//二維陣列
		System.out.println(arr[0]);		//二維陣列中的第一個一維陣列
		System.out.println(arr[0][0]);		//二維陣列中的第一個一維陣列的第一個元素
	} 

5.15 二維陣列格式1的記憶體圖解

5.16 二維陣列格式2的講解及其記憶體圖解

A:二維陣列格式2

    int[][] arr = new int[3][];

B:二維陣列格式2的解釋

class Demo3_Array {
	public static void main(String[] args) {
		int[][] arr = new int[3][];	//這是一個二維陣列,這個二維陣列中有三個一維陣列,三個一維陣列都沒有被賦值
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		arr[0] = new int[3];		//第一個一維陣列中可以儲存三個int值
		arr[1] = new int[5];		//第二個一維陣列中可以儲存五個int值
		System.out.println("------------------");
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
	}
}

5.17 二維陣列格式3的講解及其記憶體圖解

A:二維陣列格式3

    int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};

B:二維陣列格式3的解釋

C:案例演示

    講解格式,輸出資料,並畫記憶體圖

class Demo4_Array {
	public static void main(String[] args) {
		int[][] arr = {{1,2,3},{4,5},{6,7,8,9}}; //這是一個二維陣列,這個二維陣列中每個大括號都代表一個一維陣列
		System.out.println(arr);		//[[[email protected],二維陣列的地址值
		System.out.println(arr[0]);	//[[email protected],一維陣列的地址值
		System.out.println(arr[0][0]);	//1,一維陣列中的元素值
	}
}

5.18 二維陣列練習1遍歷

A:案例演示

需求:二維陣列遍歷

外迴圈控制的是二維陣列的長度,其實就是一維陣列的個數。

內迴圈控制的是一維陣列的長度。

class Test1_Array {
	public static void main(String[] args) {
		int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
		for (int i = 0;i < arr.length ;i++ ) {			//獲取到每個二維陣列中的一維陣列
			for (int j = 0;j < arr[i].length ;j++ ) {	//獲取每個一維陣列中的元素
				System.out.print(arr[i][j] + " ");
			}

			System.out.println();
		}
	}
}

5.19 二位陣列練習2求和

需求:公司年銷售額求和

某公司按照季度和月份統計的資料如下:單位(萬元)

第一季度:22,66,44

第二季度:77,33,88

第三季度:25,45,65

第四季度:11,66,99

class Test2_Array {
	public static void main(String[] args) {
		int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
		int sum = 0;						//定義變數,記錄每次相加的結果
		for (int i = 0;i < arr.length ;i++ ) {	//獲取每一個一維陣列
			for (int j = 0;j < arr[i].length ;j++ ) {	//獲取每一個一維陣列中的元素
				sum = sum + arr[i][j];					//累加
			}
		}
		System.out.println(sum);
	}
}

5.20 Java中的引數傳遞問題及圖解

基本資料型別的值傳遞,不改變原值,因為呼叫後就會彈棧,區域性變數隨之消失

引用資料型別的值傳遞,改變原值,因為即使方法彈棧,但是堆記憶體陣列物件還在,可以通過地址繼續訪問

Java中到底是傳值還是傳址

1,既是傳值,也是傳地址,基本資料型別傳遞的值,引用資料型別傳遞的地址

2,java中只有傳值,因為地址值也是值(出去面試都說這種,支持者是高司令(java之父))

class Test3_Array {
	public static void main(String[] args) {
		/*int a = 10;
		int b = 20;
		System.out.println("a:"+a+",b:"+b);			//a = 10,b = 20
		change(a,b);
		System.out.println("a:"+a+",b:"+b);			//?*/

		int[] arr = {1,2,3,4,5};
		change(arr);
		System.out.println(arr[1]);
	}

	public static void change(int a,int b) {		//a = 10, b= 20
		System.out.println("a:"+a+",b:"+b);			//a = 10,b = 20
		a = b;										//a = 20
		b = a + b;									//b = 40
		System.out.println("a:"+a+",b:"+b);			//a = 20, b = 40
	}

	public static void change(int[] arr) {			//1,4,3,8,5
		for(int x=0; x<arr.length; x++) {
			if(arr[x]%2==0) {
				arr[x]*=2;
			}
		}
	}
}