第五天 陣列
5.1 陣列概述和定義格式說明
- 為什麼要有陣列(容器)
- 為了儲存同種資料型別的多個值
- 陣列概念
- 陣列是儲存同一種資料型別多個元素的集合,也可以看成是一個容器
- 陣列既可以儲存基本資料型別,也可以儲存引用資料型別
- 陣列定義格式
- 資料型別 [ ] 陣列名=new 資料型別 [陣列的長度]
int[] arr = new int[5];//可以儲存五個int型別的資料
左邊:
int:資料型別
[]:代表的陣列,幾個中括號就代表幾維陣列
arr:合法的識別符號
右邊:
new:建立新的實體或物件
int:資料型別
[]:代表的陣列
5:代表陣列的長度
5.2 陣列的初始化動態初始化
- 什麼是陣列的初始化
- 就是為陣列開闢連續的記憶體空間,併為每個陣列元素賦予值
- 如何對陣列進行初始化
- 動態初始化 只指定長度,由系統給出初始化值
Int [] arr=new int [5];
-
- 靜態初始化 給出初始化值,由系統決定長度
- 動態初始化的格式
資料型別 [] 陣列名=new 資料型別 [陣列長度];
- 案例演示
輸出陣列名稱和陣列元素
整數型別:byte,short,int,long預設初始化值都是0
浮點型別:float,double預設初始化值都是0.0
布林型別:boolean預設初始化值false
字元型別:char預設初始化值'\u0000'
char在記憶體中佔的兩個位元組,是16個二進位制位
\u0000,每一個0其實代表的是16進位制的0,那麼四個0就是代表16個二進位制位
[代表是陣列,幾個就代表幾維
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;
}
}
}
}