第四天 數(shù)組【悟空教程】

第四天 數(shù)組【悟空教程】

第04天 Java基礎(chǔ)

第1章?數(shù)組

1.1?數(shù)組概念

軟件的基本功能是處理數(shù)據(jù),而在處理數(shù)據(jù)時(shí),必須先進(jìn)行數(shù)據(jù)持有,將數(shù)據(jù)持有之后,再對數(shù)據(jù)進(jìn)行處理。我們將程序中可以臨時(shí)存儲數(shù)據(jù)的部分叫做容器。

Java當(dāng)中具有持有數(shù)據(jù)功能的容器中,數(shù)組是最基本的,也是運(yùn)算速度最快的。

1.2?數(shù)組的定義格式

數(shù)組是引用類型的一種,其使用方式與引用類型類似,均使用new關(guān)鍵字創(chuàng)建對象為變量賦值。

格式1:數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[元素個(gè)數(shù)或數(shù)組長度];

格式2:數(shù)據(jù)類型 數(shù)組名[]?= new 數(shù)據(jù)類型[元素個(gè)數(shù)或數(shù)組長度];

注意:這兩種定義做完了,數(shù)組中是沒有元素值的。如何對數(shù)組的元素進(jìn)行初始化呢?


示例:int[] arr = new int[5];

還有其他格式如下:

int[] arr = new int[]{20,5,100,30,5}

int[] arr = {20,5,100,30,5}

int arr[] = new int[4];//源碼中經(jīng)常會看到的定義方式

1.3?數(shù)組初始化

概述

Java中的數(shù)組必須先初始化,然后才能使用。

所謂初始化:就是為數(shù)組中的數(shù)組元素分配內(nèi)存空間,并為每個(gè)數(shù)組元素賦值。

數(shù)組的初始化方式

動態(tài)初始化:初始化時(shí)只指定數(shù)組長度,由系統(tǒng)為數(shù)組分配初始值。

靜態(tài)初始化:初始化時(shí)指定每個(gè)數(shù)組元素的初始值,由系統(tǒng)決定數(shù)組長度。


1.3.1?數(shù)組內(nèi)元素均有默認(rèn)初始化值

在創(chuàng)建數(shù)組對象后,數(shù)組中元素會被自動賦予一個(gè)默認(rèn)值,這個(gè)過程叫做默認(rèn)初始化。根據(jù)元素類型的不同,默認(rèn)初始化的值也是不一樣的。具體如下表所示。

表2-1元素默認(rèn)值

數(shù)據(jù)類型默認(rèn)初始化值

byte、short、int、long0

float、double0.0

char一個(gè)空字符(空格),即’\u0000’

booleanfalse

引用數(shù)據(jù)類型null,表示變量不引用任何對象

1.3.2?數(shù)組的初始化(動態(tài)初始化)

動態(tài)初始化:初始化時(shí)只指定數(shù)組長度,由系統(tǒng)為數(shù)組分配初始值。

格式:數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組長度];

數(shù)組長度其實(shí)就是數(shù)組中元素的個(gè)數(shù)。

舉例:

int[] arr = new int[3];

解釋:定義了一個(gè)int類型的數(shù)組,這個(gè)數(shù)組中可以存放3個(gè)int類型的值

1.4?訪問數(shù)組元素

直接打印數(shù)組名,打印的是數(shù)組堆內(nèi)存中的地址

數(shù)組中的每個(gè)元素都是有編號的,編號是從0開始的,最大的編號就是數(shù)組的長度-1

用數(shù)組名和編號的配合我們就可以獲取數(shù)組中的指定編號的元素

數(shù)組底層是依次將數(shù)據(jù)進(jìn)行編號后直接通過編號訪問(線性序列)的。這個(gè)編號叫做索引。

格式:數(shù)組名[編號] -- 數(shù)組名[索引]

數(shù)組名稱為arr,索引為0,1,2

獲取數(shù)組中元素的格式:

arr[0]獲取數(shù)組中的第一個(gè)元素

arr[1]獲取數(shù)組中的第二個(gè)元素

arr[2]獲取數(shù)組中的第三個(gè)元素

如:

int[] arr = {20,5,100,30,5};

arr[0]訪問的為20,arr[2]訪問的100。


這里的”訪問”包含以下兩個(gè)動作:獲取值與賦值。如:

為元素賦值: arr[1] = 33; ?則第2個(gè)元素5會被33替代。

獲取元素的值: ?int x = arr[3]; ?則x的值為30。


????使用數(shù)組名.length可以獲取數(shù)組長度。

/*

數(shù)組:它是引用數(shù)據(jù)類型的一種,它是存放同種數(shù)據(jù)類型數(shù)據(jù)的容器(集合)

數(shù)組定義格式:

數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)據(jù)長度/元素個(gè)數(shù)];

訪問數(shù)組中指定編號的元素:數(shù)組名[索引]

給數(shù)組中的元素賦值: 數(shù)組名[索引] = 數(shù)據(jù)值;

使用數(shù)組名.length可以獲取數(shù)組長度。

直接打印數(shù)組名是獲取了數(shù)組的堆內(nèi)存地址值(內(nèi)存圖詳細(xì)了解)

*/

public class Demo02Array{

public static void main(String[] args){

//定義一個(gè)長度為3的整數(shù)數(shù)組

int[] arr1 = new int[3];

//int[] arr2 = new int[]{1,2,3,4,5};//有幾個(gè)元素,長度就為幾

int[] arr2 = {1,2,3,4,5};

// ????索引 ??0 1 2 3 4

//訪問arr2數(shù)組中第一個(gè)元素

//System.out.println("數(shù)組的第一個(gè)元素: " +arr2[0]);

int x = arr2[0];

System.out.println("數(shù)組的第一個(gè)元素: " + x);

//給數(shù)組中的元素賦值: 數(shù)組名[索引] = 數(shù)據(jù)值;

arr2[1] = 100;

System.out.println("arr2[1]: " +arr2[1]);

int length1 = arr1.length;

System.out.println("數(shù)組arr1的長度:" +length1);

int length2 = arr2.length;

System.out.println("數(shù)組arr1的長度:" +length2);

System.out.println(arr1);//[I@104c575

System.out.println(arr2);//[I@3fa5ac

char[] ch = new char[4];

System.out.println(ch);//[I@3fa5ac

//定義一個(gè)長度為10的String類型數(shù)組

//String[] arr2 = new String[10];

}

}


直接打印數(shù)組名是獲取了數(shù)組的堆內(nèi)存地址值(內(nèi)存圖詳細(xì)了解)


1.5?數(shù)組的注意事項(xiàng)

1.5.1?數(shù)組的長度是固定的

數(shù)組在創(chuàng)建對象過程當(dāng)中,必須指定數(shù)組長度,無法創(chuàng)建對象進(jìn)而無法給變量賦值。

1.5.2?一個(gè)數(shù)組中只能存儲一種類型的數(shù)據(jù)

在數(shù)組的定義格式中有顯式地寫出該數(shù)組中存儲的數(shù)據(jù)類型,所以一個(gè)數(shù)組只能存儲同一種數(shù)據(jù)類型。(在多態(tài)的講解后,我們會有新的理解)


1.5.3?數(shù)組運(yùn)行期報(bào)錯(cuò)

在使用數(shù)組時(shí),因?yàn)椴划?dāng)?shù)牟僮?,我們可能會通過編譯,但是在運(yùn)行期間遇到一些程序報(bào)錯(cuò)類似這樣編譯時(shí)不報(bào)錯(cuò),運(yùn)行期報(bào)錯(cuò)的錯(cuò)誤叫運(yùn)行時(shí)錯(cuò)誤

數(shù)組最常見的兩個(gè)運(yùn)行時(shí)錯(cuò)誤:空指針異常和數(shù)組索引越界異常

1.5.3.1?空指針異常

編程語言中對空的處理與我們平常所理解的略有不同。這里我們區(qū)分兩種空的不同

變量完全沒有值:

定義了變量根本沒有值:int a; ?int[] b

這樣根本沒有賦值過的變量是無法使用的。數(shù)組也是一種數(shù)據(jù)類型,可以指定變量,沒有賦值是不能使用的。


變量有值,但值為null:

定義了變量并且賦值了,但是值是空值,是常量。這種情況只針對于引用數(shù)據(jù)類型,基本數(shù)據(jù)類型不成立。

int a = null; 編譯失敗

int[] arr = null; 正常賦值

當(dāng)使用int[] arr = null給arr賦值時(shí),變量arr作為數(shù)組名通過編號訪問數(shù)組元素時(shí)編譯不報(bào)錯(cuò),運(yùn)行時(shí)報(bào)運(yùn)行錯(cuò)誤NullPointerException空指針異常

1.5.3.2?數(shù)組索引越界異常

當(dāng)數(shù)組中不存在該索引卻訪問該索引時(shí),運(yùn)行時(shí)報(bào)錯(cuò):

ArrayIndexOutOfBoundsException?數(shù)組索引越界

/*

數(shù)組的注意事項(xiàng):

1.數(shù)組在創(chuàng)建對象過程當(dāng)中,必須指定數(shù)組長度,否則無法創(chuàng)建對象進(jìn)而無法給變量賦值。

2.在數(shù)組的定義格式中有顯式地寫出該數(shù)組中存儲的數(shù)據(jù)類型,所以一個(gè)數(shù)組只能存儲同一種數(shù)據(jù)類型。(在多態(tài)的講解后,我們會有新的理解)

3.在創(chuàng)建數(shù)組對象后,數(shù)組中元素會被自動賦予一個(gè)默認(rèn)值,這個(gè)過程叫做默認(rèn)初始化。根據(jù)元素類型的不同,默認(rèn)初始化的值也是不一樣的。

數(shù)組運(yùn)行期錯(cuò)誤:

空指針異常:給數(shù)組變量賦值的時(shí)候,賦值成null,數(shù)組不指向一個(gè)堆內(nèi)存的地址,索引會報(bào)NullPointerException

數(shù)組索引越界:訪問了不存在的索引

*/

public class Demo03Array{

public static void main(String[] args){

//1.數(shù)組在創(chuàng)建對象過程當(dāng)中,必須指定數(shù)組長度,否則無法創(chuàng)建對象進(jìn)而無法給變量賦值。

//定義一個(gè)長度為5的int類型數(shù)組

//int[] arr = new int[];//錯(cuò)誤: 缺少數(shù)組維

int[] arr = new int[5];

//2.一個(gè)數(shù)組只能存儲同一種數(shù)據(jù)類型。

//arr[0] = "hello";//錯(cuò)誤: 不兼容的類型

arr[0] = 18;

System.out.println(arr[0]);//18

//int有默認(rèn)的初始化值 0

System.out.println(arr[1]);//0

System.out.println(arr[2]);//0

System.out.println(arr[3]);//0

System.out.println(arr[4]);//0

String[] arr2 = new String[3];

arr2[0] = "詹姆斯";

System.out.println(arr2[0]);//詹姆斯

//String有默認(rèn)的初始化值 null

System.out.println(arr2[1]);//null

System.out.println(arr2[2]);//null

System.out.println(arr2[3]);//ArrayIndexOutOfBoundsException: 3

/*

double[] arr3;

System.out.println(arr3[0]);//錯(cuò)誤: 可能尚未初始化變量arr3

*/

//int a = null;//錯(cuò)誤: 不兼容的類型

//double[] arr3 = null;

//System.out.println(arr3[0]);//NullPointerException

}

}

1.6?數(shù)組的內(nèi)存解釋

1.6.1?內(nèi)存分區(qū)

內(nèi)存是計(jì)算機(jī)臨時(shí)存儲數(shù)據(jù)的區(qū)域,我們會將內(nèi)存在邏輯上分配成不同區(qū)域方便對數(shù)據(jù)進(jìn)行分類高效管理。

寄存器:最快的存儲區(qū)域直接與CPU打交道,是程序員無法控制的計(jì)算區(qū)域。

堆棧:又叫棧,僅次于寄存器。用于存儲局部變量。

堆:通用內(nèi)存池,用于存放所有引用數(shù)據(jù)類型對象。每個(gè)對象均有地址,且有默認(rèn)初始化值。

常量存儲區(qū)域:用于存放永遠(yuǎn)不會被改變的值。


1.7?Java中的內(nèi)存分配

Java程序在運(yùn)行時(shí),需要在內(nèi)存中的分配空間。

為了提高運(yùn)算效率,就對空間進(jìn)行了不同區(qū)域的劃分,因?yàn)槊恳黄瑓^(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式。

內(nèi)存分區(qū):

棧 又叫棧,僅次于寄存器。用于存儲局部變量

局部變量是定義在方法中或者語句中的變量

局部變量使用完畢,立即回收

堆 通用內(nèi)存池,用于存放所有引用數(shù)據(jù)類型對象。每個(gè)對象均有地址,且有默認(rèn)初始化值。New出來的東西。

每一個(gè)對象都有首地址值,是一個(gè)十六進(jìn)制的地址

每一個(gè)對象內(nèi)的數(shù)據(jù)都有默認(rèn)值

byte,short,int,long 0

float,double 0.0

char ‘\u0000’,一個(gè)空格

boolean false

引用類型:null

使用完畢后,會被垃圾回收器空閑的時(shí)候回收。

方法區(qū):(方法區(qū))又叫靜態(tài)區(qū),存放所有的class和靜態(tài)變量,方法區(qū)存放的是整個(gè)程序中唯一的元素,如class和static變量。

本地方法區(qū) (和系統(tǒng)相關(guān))

寄存器 (給CPU使用)最快的存儲區(qū)域直接與CPU打交道,是程序員無法控制的計(jì)算區(qū)域

畫圖說明:數(shù)組的內(nèi)存圖


1.8?數(shù)組內(nèi)存圖解

定義一個(gè)數(shù)組,輸出數(shù)組名及元素。然后給數(shù)組中的元素賦值,再次輸出數(shù)組名及元素


定義兩個(gè)數(shù)組,分別輸出數(shù)組名及元素。然后分別給數(shù)組中的元素賦值,分別再次輸出數(shù)組名及元素。


定義兩個(gè)數(shù)組,先定義一個(gè)數(shù)組賦值,輸出。然后定義第二個(gè)數(shù)組的時(shí)候把第一個(gè)數(shù)組的地址賦值給第二個(gè)數(shù)組。然后給第二個(gè)數(shù)組賦值,再次輸出兩個(gè)數(shù)組的名及元素。


1.9?數(shù)組的初始化(靜態(tài)初始化)

概述

????初始化時(shí)指定每個(gè)數(shù)組元素的初始值,由系統(tǒng)決定數(shù)組長度。

格式

????數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[]{元素1,元素2,…};

舉例

int[] arr = new int[]{1,2,3};

解釋:定義了一個(gè)int類型的數(shù)組,這個(gè)數(shù)組中可以存放3個(gè)int類型的值,并且值分別是1,2,3。

簡化格式

????數(shù)據(jù)類型[] 數(shù)組名 = {元素1,元素2,...};

簡化格式舉例

????int[] arr = {1,2,3};

內(nèi)存圖


1.9.1?引用數(shù)據(jù)類型數(shù)組的內(nèi)存圖

數(shù)組是我們系統(tǒng)介紹的第一個(gè)引用數(shù)據(jù)類型,了解內(nèi)存結(jié)構(gòu)將有助于后期整個(gè)面向?qū)ο蟮膶W(xué)習(xí)。

int[] x = new int[100];


引用變量:數(shù)組屬于引用數(shù)據(jù)類型,引用數(shù)據(jù)類型定義的變量x存儲在棧內(nèi)存當(dāng)中,這個(gè)x變量叫做這個(gè)數(shù)組實(shí)例的引用變量。

=:與數(shù)學(xué)當(dāng)中的意義不同,是賦值的意思,并非相等。

真正的數(shù)組實(shí)例是通過new關(guān)鍵字創(chuàng)建出來,存儲于堆內(nèi)存中,并產(chǎn)生一個(gè)十六進(jìn)制表示的內(nèi)存地址0x3000。

這個(gè)引用變量會指向這個(gè)數(shù)組的內(nèi)存地址

則引用變量的值是這個(gè)數(shù)組實(shí)例的地址值,引用變量通過地址可以表示這個(gè)數(shù)組對象

1.10?數(shù)組遍歷

在操作數(shù)組時(shí),經(jīng)常需要依次訪問數(shù)組中的每個(gè)元素,這種操作稱作數(shù)組的遍歷。如:

public?class?Demo?{

public?static?void?main(String[] args) {

int[] arr = { 1, 2, 3, 4, 5 }; //定義數(shù)組

//使用for循環(huán)遍歷數(shù)組的元素

for?(int?i = 0; i < arr.length; i++) {

System.out.println(arr[i]); //通過索引訪問元素

}

}

}

運(yùn)行結(jié)果如下圖所示。

圖1-1運(yùn)行結(jié)果

上述代碼中,定義一個(gè)長度為5的數(shù)組arr,數(shù)組的角標(biāo)為0~4。由于for循環(huán)中定義的變量i的值在循環(huán)過程中為0~4,因此可以作為索引,依次去訪問數(shù)組中的元素,并將元素的值打印出來。

/*

數(shù)組遍歷:依次訪問數(shù)組中的每一次元素

*/

public class Demo04Array{

public static void main(String[] args){

String[] arr = {"柳巖","唐嫣","賈玲","韓紅","楊冪"};

System.out.println(arr[0]);

System.out.println(arr[1]);

System.out.println(arr[2]);

System.out.println(arr[3]);

System.out.println(arr[4]);

System.out.println("---------------------------");

for(int i=0; i<5; i++){//i = 0,1,2,3,4

System.out.println(arr[i]);

}

System.out.println("---------------------------");

for(int i=0; i

System.out.println(arr[i]);

}

/*

3:一個(gè)String數(shù)組中存儲一些人名,奇偶報(bào)數(shù)

String[] arr = {“張三”,”李四”,”王五”,”趙六”};

奇數(shù)同學(xué)為:張三, 王五

偶數(shù)同學(xué)為:李四, 趙六

*/

String name1 = "奇數(shù)同學(xué)為:";

String name2 = "偶數(shù)同學(xué)為:";

for(int i=0; i

if(i % 2 == 0){

name2 = name2 +"" + arr[i];//"偶數(shù)同學(xué)為:" + ""+ "柳巖" + "賈玲"

}else{

name1 = name1 +"" + arr[i];//"偶數(shù)同學(xué)為: " + "" + "唐嫣"

}

}

System.out.println(name1);

System.out.println(name2);

}

}

1.11?數(shù)組的參數(shù)傳遞

1.11.1?基本類型作為參數(shù)傳遞:

/*

基本類型作為參數(shù)傳遞:

當(dāng)調(diào)用方法時(shí),如果傳入的數(shù)值為基本數(shù)據(jù)類型(包含String類型),形式參數(shù)的改變對實(shí)際參數(shù)不影響

*/

public class Demo01{

public static void main(String[] args){

int a = 10;

int b = 20;

System.out.println("a = " + a);//10

System.out.println("b = " + b);//20

change(a,b);

System.out.println("a = " + a);//10

System.out.println("b = " + b);//20

}

//替換方法

public static void change(int a,int b){

a = 100;

b = 200;

System.out.println("a = " + a);//100

System.out.println("b = " + b);//200

}

}

1.11.2?引用數(shù)據(jù)類型作為參數(shù)傳遞:數(shù)組

/*

引用數(shù)據(jù)類型作為參數(shù)傳遞:數(shù)組

當(dāng)調(diào)用方法時(shí),如果傳入的數(shù)值為引用數(shù)據(jù)類型(String類型除外),形式參數(shù)的改變對實(shí)際參數(shù)有影響


*/

public class Demo02{

public static void main(String[] args){

int[] arr = {10,20};

System.out.println("arr[0] = " + arr[0]);//10

System.out.println("arr[1] = " + arr[1]);//20

change(arr);

System.out.println("arr[0] = " + arr[0]);//100

System.out.println("arr[1] = " + arr[1]);//200

}

//替換方法

public static void change(int[] arr){

arr[0] = 100;

arr[1] = 200;

System.out.println("arr[0] = " + arr[0]);//100

System.out.println("arr[1] = " + arr[1]);//200

}

}

1.12?練習(xí)

1.12.1?遍歷數(shù)組

依次輸出數(shù)組中的每一個(gè)元素

獲取數(shù)值長度:數(shù)值名.length

public?class?Demo07ArrayTest {

public?static?void?main(String[] args) {

//定義數(shù)組

int[] arr?= { 11, 22, 33, 44, 55 };


//原始做法

System.out.println(arr[0]);

System.out.println(arr[1]);

System.out.println(arr[2]);

System.out.println(arr[3]);

System.out.println(arr[4]);

System.out.println("--------------------");


//用for循環(huán)改進(jìn)

for?(int?x?= 0; x?< 5; x++) {

System.out.println(arr[x]);

}

System.out.println("--------------------");

//為了解決我們?nèi)?shù)數(shù)組中元素個(gè)數(shù)的問題,數(shù)組就提供了一個(gè)屬性:length

//用于獲取數(shù)組的長度

//格式:數(shù)組名.length

System.out.println("數(shù)組共有:"+arr.length+"個(gè)元素");

System.out.println("--------------------");

for(int?x=0; x

System.out.println(arr[x]);

}

}

}

1.12.2?獲取最值

獲取數(shù)組中的最大值最小值

public?class?Demo08ArrayTest {

public?static?void?main(String[] args) {

//定義數(shù)組

int[] arr?= {12,98,45,73,60};

//定義參照物

int?max?= arr[0];

//遍歷數(shù)組,獲取除了0以外的所有元素,進(jìn)行比較

for(int?x=1; x

if(arr[x] > max) {

max?= arr[x];

}

}

System.out.println("數(shù)組中的最大值是:"+max);

}

}


1.13?二維數(shù)組

1.13.1?二維數(shù)組概念

當(dāng)數(shù)組中存儲的元素類型仍然為數(shù)組時(shí),該數(shù)組稱為二維數(shù)組。

1.13.2?二維數(shù)組定義和使用格式

二維數(shù)組定義格式

數(shù)據(jù)類型[][] 數(shù)組名;

數(shù)據(jù)類型 數(shù)組名[][]; 不推薦

數(shù)據(jù)類型[] 數(shù)組名[]; 不推薦

初始化方式

數(shù)據(jù)類型[][] 變量名 = new 數(shù)據(jù)類型[m][n];

數(shù)據(jù)類型[][] 變量名 = new 數(shù)據(jù)類型[][]{{元素…},{元素…},{元素…}};

簡化版格式:數(shù)據(jù)類型[][] 變量名 = {{元素…},{元素…},{元素…}};

public?class?Demo01ArrayArray {

public?static?void?main(String[] args) {

//數(shù)據(jù)類型[][] 數(shù)組名 = {{元素...},{元素...},{元素...},...};

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


System.out.println(arr); // [[I@104c575

System.out.println(arr.length); //二維數(shù)組中的一維數(shù)組的個(gè)數(shù)

System.out.println(arr[0]);// [I@3fa5ac

System.out.println(arr[0].length);

System.out.println(arr[1]);// [I@95cfbe

System.out.println(arr[2]);// [I@179dce4

//我如何獲取到一個(gè)二維數(shù)組的元素呢?

System.out.println(arr[0][0]);

System.out.println(arr[1][1]);

System.out.println(arr[2][0]);

}

}?

二維數(shù)組定義方式展示。

a)?第一種方式

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

?上面的代碼相當(dāng)于定義了一個(gè)3*4的二維數(shù)組,即二維數(shù)組的長度為3,二維數(shù)組中的每個(gè)元素又是一個(gè)長度為4的數(shù)組,接下來通過一個(gè)圖來表示這種情況,如下圖所示。

圖1-2二維數(shù)組

b)?第二種方式

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

第二種方式和第一種類似,只是數(shù)組中每個(gè)元素的長度不確定,接下來通過一個(gè)圖來表示這種情況,如下圖所示。

圖1-3?二維數(shù)組

c)?第三種方式

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

上面的二維數(shù)組中定義了三個(gè)元素,這三個(gè)元素都是數(shù)組,分別為{1,2}、{3,4,5,6}、{7,8,9},接下來通過一個(gè)圖來表示這種情況,如圖2-54所示。

圖1-4?二維數(shù)組



1.13.3?二維數(shù)組的元素訪問

對二維數(shù)組中元素的訪問也是通過索引的方式,如需訪問二維數(shù)組中第一個(gè)元素?cái)?shù)組的第二個(gè)元素,具體代碼如下:

arr[0][1]; ?//訪問的為二維數(shù)組中第1個(gè)一維數(shù)組的第2個(gè)元素


請參照以為數(shù)組的遍歷求和,完成二維數(shù)組的遍歷求和。

/*

二維數(shù)組:數(shù)組中的元素仍為一個(gè)一維數(shù)組

*/

public class Demo05ArrayArray{

public static void main(String[] args){

//定義一個(gè)長度為3,每個(gè)數(shù)組元素都是一個(gè)長度為4的數(shù)組的二維數(shù)組

int[][] a = new int[3][4];

System.out.println(a);//[[I@32784a

System.out.println(a.length);//3

System.out.println(a[0]);//[I@104c575

System.out.println(a[1]);//[I@3fa5ac

System.out.println(a[2]);//[I@95cfbe

//訪問二維數(shù)組中的第一個(gè)元素的第一個(gè)值

System.out.println(a[0][0]);//0

//賦值

a[0][0] = 100;

System.out.println(a[0][0]);//100

System.out.println("-------------------------");

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

System.out.println(b);//[[I@95cfbe

System.out.println(b.length);//3

System.out.println(b[0]);//[I@179dce4

System.out.println(b[1]);//[I@1950198

System.out.println(b[2]);//[I@19bb25a

System.out.println(b[0][0]);//1

System.out.println(b[2][2]);//9

//賦值

b[0][0] = 100;

System.out.println(b[0][0]);//100

System.out.println("-------------------------");

int[][] c = new int[3][];

System.out.println(c);//[[I@179935d

System.out.println(c.length);//3

System.out.println(c[0]);//null

System.out.println(c[1]);//null

System.out.println(c[2]);//null

//System.out.println(c[0][0]);//NullPointerException

c[0] = new int[]{1,2,3};

System.out.println(c[0][0]);//1

}

}

1.13.4?二維數(shù)組的遍歷

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

public?class?Demo02ArrayArrayTest {

public?static?void?main(String[] args) {

//定義二維數(shù)組

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

//二維數(shù)組中的一維數(shù)組名稱:二維數(shù)組名[索引]

// arr[0]其實(shí)就是二維數(shù)組中的第一個(gè)一維數(shù)組的名稱

// arr[1]其實(shí)就是二維數(shù)組中的第二個(gè)一維數(shù)組的名稱

// arr[2]其實(shí)就是二維數(shù)組中的第三個(gè)一維數(shù)組的名稱

// for (int?x = 0; x < arr[0].length; x++) {

// System.out.println(arr[0][x]);

// }

// System.out.println("hello");//輸出內(nèi)容并換行

// System.out.println("world");//輸出內(nèi)容并換行

// System.out.print("hello");//輸出內(nèi)容不換行

// System.out.print("world");//輸出內(nèi)容不換行

/*

//第一個(gè)一維數(shù)組的元素

for (int?x = 0; x < arr[0].length; x++) {

System.out.print(arr[0][x] + " ?");

}

System.out.println();

//第二個(gè)一維數(shù)組的元素

for (int?x = 0; x < arr[1].length; x++) {

System.out.print(arr[1][x] + " ?");

}

System.out.println();

//第三個(gè)一維數(shù)組的元素

for (int?x = 0; x < arr[2].length; x++) {

System.out.print(arr[2][x] + " ?");

}

System.out.println();

*/

/*for(int?y=0; y<3; y++) {

for (int?x = 0; x < arr[y].length; x++) {

System.out.print(arr[y][x] + " ?");

}

System.out.println();

}*/

for(int?y=0; y

for?(int?x?= 0; x?< arr[y].length; x++) {

System.out.print(arr[y][x] + " ?");

}

System.out.println();//換行

}

}

}


1.14?數(shù)組案例---隨機(jī)點(diǎn)名器案例

1.14.1?案例介紹與演示

隨機(jī)點(diǎn)名器,即在全班同學(xué)中隨機(jī)的打印出一名同學(xué)名字。

要做的隨機(jī)點(diǎn)名器,它具備以下3個(gè)內(nèi)容:

存儲所有同學(xué)姓名

總覽全班同學(xué)姓名

隨機(jī)點(diǎn)名其中一人,打印到控制臺

1.14.2?案例分析

在全班同學(xué)中隨機(jī)的打印出一名同學(xué)名字。

我們對本案例進(jìn)行分析,得出如下分析結(jié)果,共可以設(shè)計(jì)出三個(gè)步驟:

1.存儲全班同學(xué)名字

2.打印全班同學(xué)每一個(gè)人的名字

3.在班級總?cè)藬?shù)范圍內(nèi),隨機(jī)產(chǎn)生一個(gè)隨機(jī)數(shù)索引,查找該隨機(jī)數(shù)索引所對應(yīng)的同學(xué)名字

a)?存儲所有同學(xué)姓名

在main方法中定義字符串?dāng)?shù)組類型的變量并創(chuàng)建對象(長度為5)為變量賦值,再向數(shù)組中添加5名同學(xué)姓名。

String[] names = new String[5];

b)?總覽全班同學(xué)姓名

數(shù)組中存儲了所有同學(xué)的姓名。在總覽全班同學(xué)姓名的方法中只要做到遍歷數(shù)組中的每一個(gè)名稱即可。

names[0] = “Lucy”;

names[1] = ”Lily”;

...

c)?隨機(jī)點(diǎn)名

通過隨機(jī)數(shù)類Random產(chǎn)生一個(gè)從0到數(shù)組長度的隨機(jī)索引。而該索引對應(yīng)的值便是所求的隨機(jī)姓名。

導(dǎo)包:所屬包java.util.?Random??

創(chuàng)建實(shí)例格式:Random ?random = new Random ();

調(diào)用方法,生成隨機(jī)索引:int ?randomIndex = random.nextInt(數(shù)組長度);

通過數(shù)組名[索引]的方式獲取該元素并打印。

/*

隨機(jī)點(diǎn)名器:


分析:

要做的隨機(jī)點(diǎn)名器,它具備以下3個(gè)內(nèi)容:

存儲所有同學(xué)姓名--> String[]

總覽全班同學(xué)姓名-->遍歷數(shù)組

隨機(jī)點(diǎn)名其中一人,打印到控制臺--> Random類

*/

import java.util.Random;


public class RandomName{

public static void main(String[] args){

//存儲所有同學(xué)姓名 --> String[]

String[] names = {"柳巖","唐嫣","賈玲","韓紅","楊冪"};

//總覽全班同學(xué)姓名 --> 遍歷數(shù)組

System.out.println("=============全班同學(xué)姓名==================");

for(int i=0; i

System.out.println("第"+(i+1)+"個(gè)同學(xué)的姓名是: " + names[i]);

}

/*

System.out.print("全班同學(xué)姓名: ");

for(int i=0; i

System.out.print("" + names[i]);

}

*/

//隨機(jī)點(diǎn)名其中一人,打印到控制臺 --> Random類

Random r = new Random();

//System.out.println(r);//java.util.Random@1e58cb8

//在數(shù)組的范圍內(nèi)隨機(jī)產(chǎn)生一個(gè)數(shù)

int number = r.nextInt(names.length);//names.length = 5

//通過產(chǎn)生的隨機(jī)數(shù),在數(shù)組中查找對應(yīng)的元素(索引)

String name = names[number];//number 0,1,2,3,4

System.out.println("============================================");

System.out.println("隨機(jī)到的同學(xué)姓名是: " + name);

}

}


1.15?案例:一維數(shù)組所有元素求和&二維數(shù)組所有元素求和

/*

練習(xí)1:一維數(shù)組所有元素求和

練習(xí)2:二維數(shù)組所有元素求和

*/

public class Demo06Test{

public static void main(String[] args){

//練習(xí)1:一維數(shù)組所有元素求和

int[] a = {1,2,3,4,5};


int sum1 = 0;

//遍歷數(shù)組

for(int i=0; i

//System.out.println(i);

sum1 += a[i];

}

System.out.println("sum1 = " + sum1);

//練習(xí)2:二維數(shù)組所有元素求和

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

//b[0] = {1,2};

//b[1] = {3,4,5,6};

//b[2] = {7,8,9};?

int sum2 = 0;

/*

//遍歷二維數(shù)組

for(int j=0; j

//定義一個(gè)一維數(shù)組用來接收二維數(shù)組中的元素

int[] c = b[j];

//遍歷一維數(shù)組

for(int k=0; k

sum2 += c[k];

}

}

System.out.println("sum2 = " + sum2);

*/

//簡化寫法

for(int j=0; j

for(int k=0;k

sum2 += b[j][k];

}

}

System.out.println("sum2 = " + sum2);

}

}


第2章本日自習(xí)作業(yè):

1.求一個(gè)int數(shù)組中所有偶數(shù)的和

2.一個(gè)String數(shù)組中存儲一些人名,奇偶報(bào)數(shù),將所有奇數(shù)的同學(xué)分配到一個(gè)數(shù)組中,偶數(shù)的同學(xué)分配到另外數(shù)組中,并遍歷(兩種理解,兩種解法)(較復(fù)雜)

3.二維數(shù)組求和

4.簡單理解引用類型內(nèi)

5.模擬空指針異常與數(shù)組索引越界異常

6.什么是數(shù)組

7.是否可以不給數(shù)組中的元素賦值

8.直接打印數(shù)組變量,結(jié)果是什么,怎么理解?


2.1?知識點(diǎn)相關(guān)題

2.1.1?一維數(shù)組,定義三種數(shù)組,并遍歷

要求:

1)?熟練掌握一維數(shù)組的定義;

2)?熟練遍歷,匯總一維數(shù)組;

題目:

定義類:Test4,定義main()方法,按以下要求編寫代碼:

A.請使用三種格式定義三個(gè)數(shù)組,都存儲5個(gè)數(shù)字:10,20,30,40,50

B.分別遍歷這三個(gè)數(shù)組,打印每個(gè)元素;


public?class?Test4 {

public?static?void?main(String[] args) {

int[] arr1 = new?int[5];

arr1[0] = 10;

arr1[1] = 20;

arr1[2] = 30;

arr1[3] = 40;

arr1[4] = 50;

int[] arr2 = new?int[]{10,20,30,40,50};

int[] arr3 = {10,20,30,40,50};

for?(int?i = 0; i < arr1.length; i++) {

System.out.println(arr1[i]);

}

for?(int?i = 0; i < arr2.length; i++) {

System.out.println(arr2[i]);

}

for?(int?i = 0; i < arr3.length; i++) {

System.out.println(arr3[i]);

}

}

}


2.1.2?計(jì)算這個(gè)數(shù)組中所有元素的和

定義類:Test5,定義main()方法,按以下要求編寫代碼:

A.請定義一個(gè)數(shù)組,任意存儲幾個(gè)數(shù)字;

B.計(jì)算這個(gè)數(shù)組中所有元素的和,并打印這個(gè)和;

public?class?Test05 {

public?static?void?main(String[] args) {

int[] arr = {10,20,30,40,50};

int?sum = 0;

for?(int?i = 0; i < arr.length; i++) {

sum+=arr[i];

}

System.out.println("數(shù)組中元素和為:"+sum);

}

}

2.1.3?定義數(shù)組,存儲學(xué)員成績

定義類:Test6,定義main()方法,按以下要求編寫代碼:

A.定義一個(gè)數(shù)組,存儲幾個(gè)學(xué)員的考試分?jǐn)?shù):

88.5 ??96 ??97 ??74 ??88.2 ???58.5 ???77.9 ??90 ??99

B.計(jì)算這幾個(gè)學(xué)員的平均分;

C.統(tǒng)計(jì):成績在80分以上的一共有多少人

public?class?Test06 {

public?static?void?main(String[] args) {

double[] d = {88.5,96,97,74,88.2,58.5,77.9,90,99};

double?sum = 0;

int?count = 0;

for?(int?i = 0; i < d.length; i++) {

sum+= d[i];

if(d[i] >= 80){

count++;

}

}

System.out.println("平均分為:"+(sum/d.length));

System.out.println("成績在80分以上的一共有"+count+"人");

}

}


2.1.4?求數(shù)組中所有偶數(shù)和數(shù)組中偶數(shù)的數(shù)量

定義類:Test7,定義main()方法,按以下要求編寫代碼:

A.定義一個(gè)數(shù)組,存儲以下信息:

78 23 56 89 88 84 72 99 56 72 100 53 28

B.求數(shù)組中所有偶數(shù)的和

求數(shù)組中偶數(shù)的數(shù)量;

public?class?Test7 {

public?static?void?main(String[] args) {

int[] arr = {78,23,56,89,88,84,72,99,56,72,100,53,28};

int?sum = 0;

int?count = 0;

for?(int?i = 0; i < arr.length; i++) {

if(arr[i] % 2 == 0){

sum += arr[i];

count++;

}

}

System.out.println("數(shù)組中偶數(shù)和為:"+sum+"偶數(shù)數(shù)量為:"+count);

}

}


2.1.5?打印數(shù)組中所有偶數(shù)索引位置上的值

定義類:Test8,定義main()方法,按以下要求編寫代碼:

A.定義一個(gè)數(shù)組,存儲以下信息:

java ?oracle ?php ?mysql ?HTML ?android ?IOS ?JSP

B.打印數(shù)組中所有偶數(shù)索引位置上的值;


package?StudyJavaSEday04;

/**

*定義一個(gè)數(shù)組,存儲以下信息:

?* java ?oracle ?php??mysql??HTML ?android ?IOS ?JSP

*打印數(shù)組中所有偶數(shù)索引位置上的值;

?* @author奮斗蒙

?*

?*/

public?class?OuShusouyin {


public?static?void?main(String[] args) {

String [] s?= {"java","oracle","php","mysql","HTML","android","IOS","JSP"};

for?(int?i?= 0; i?< s.length; i++) {

if?(i%2==0) {

System.out.println(s[i]);

}

}

}

}


2.1.6?定義數(shù)組并打印,求所有數(shù)的累加和雨平均值

1?知識點(diǎn):二維數(shù)組

要求:

1)?熟練掌握二維數(shù)組的定義;

2)?熟練遍歷,匯總二維數(shù)組;

題目:

1)?定義類:Test9,定義main()方法,按以下要求編寫代碼:

A.?定義二維數(shù)組存儲以下值:

10 11 12 13 14

20 21 22 23 24

30 31 32 33 34

40 41 42 43 44

50 51 52 53 54

B.?按上面的格式打印這個(gè)二維數(shù)組;

C.?求所有數(shù)的累加和;

D.?求所有數(shù)的平均值;

public?class?Test9 {

public?static?void?main(String[] args) {

int[][] arr = { { 10, 11, 12, 13, 14 }, { 20, 21, 22, 23, 24 },

{ 30, 31, 32, 33, 34 }, { 40, 41, 42, 43, 44 },

{ 50, 51, 52, 53, 54 } };

int?sum = 0;

int?count = 0;

for?(int?i = 0; i < arr.length; i++) {

for?(int?j = 0; j < arr[i].length; j++) {

sum += arr[i][j];

count++;

System.out.print(arr[i][j]+" ?");

}

System.out.println();

}

System.out.println("二維數(shù)組中所有元素累加和為:"+sum);

System.out.println("所有數(shù)的累加和為:"+(sum/count));

}

}

2.1.7?按照格式打印數(shù)組

2)?定義類:Test10,定義main()方法,按以下要求編寫代碼:

A.?定義二維數(shù)組存儲以下值(注:只對非0位置賦值):

0 ?0 ?12 ?5 ?0

1 ?0 ?7 ??0 ?8

0 ?6 ?0 ??0 ?0

9 ?0 ?4 ??2 ?1

B.?按上述格式打印數(shù)組;

public?class?Test10 {

public?static?void?main(String[] args) {

int[][] arr = new?int[4][5];

arr[0][2] = 12;

arr[0][3] = 5;

arr[1][0] = 1;

arr[1][2] = 7;

arr[1][4] = 8;

arr[2][1] = 6;

arr[3][0] = 9;

arr[3][2] = 4;

arr[3][3] = 2;

arr[3][4] = 1;

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();

}

}

}


2.2?代碼題

2.2.1?鍵盤錄入班級人數(shù),并用隨機(jī)數(shù)產(chǎn)生成績

第一題:分析以下需求,并用代碼實(shí)現(xiàn)

1.鍵盤錄入班級人數(shù)

2.根據(jù)錄入的班級人數(shù)創(chuàng)建數(shù)組

3.利用隨機(jī)數(shù)產(chǎn)生0-100的成績(包含0和100)

4.要求:

(1)打印該班級的不及格人數(shù)

(2)打印該班級的平均分

(3)演示格式如下:

請輸入班級人數(shù):

鍵盤錄入:100

控制臺輸出:

不及格人數(shù):19

班級平均分:87

import?java.util.Random;

import?java.util.Scanner;


public?class?Demo01 {

public?static?void?main(String[] args) {

Scanner sc = new?Scanner(System.in);

System.out.println("請輸入班級人數(shù):");

int?nextInt = sc.nextInt();

int[] arr = new?int[nextInt];

int?count = 0;

int?source = 0;

int?avg?= 0;

Random random = new?Random();

for(int?i = 0 ; i < arr.length; i++){

arr[i] = random.nextInt(101);

System.out.println(arr[i]);

if(arr[i] < 60){

count++;

}

source += arr[i];

}

System.out.println("不及格人數(shù):"+count);

System.out.println("班級平均分:"+(source/arr.length));

}

}

2.2.2?鍵盤錄入班級總共多少組?以及每組的學(xué)生數(shù)量?

第二題:分析以下需求,并用代碼實(shí)現(xiàn)

1.基礎(chǔ)班考試要進(jìn)行分組,鍵盤錄入該班級總共多少組?以及每組的學(xué)生數(shù)量?

2.根據(jù)錄入的組數(shù)及每組學(xué)員的數(shù)量創(chuàng)建二維數(shù)組

3.利用隨機(jī)數(shù)產(chǎn)生0-100的成績(包含0和100)

4.要求:

(1)打印該班級中每組的不及格人數(shù)

(2)打印該班級中每組的平均分

(3)打印組的最高平均分

(4)打印班級中的不及格人數(shù)

(5)打印班級平均分

(6)演示格式如下:

請輸入班級總組數(shù):3

請輸入班級中每組的人數(shù):10

控制臺輸出:

第1組不及格人數(shù)為: 6 人

第1組平均分為: 52

第2組不及格人數(shù)為: 7 人

第2組平均分為: 46

第3組不及格人數(shù)為: 3 人

第3組平均分為: 69

班級中單組最高平均分為:69

班級中不及格人數(shù)為: 16人

班級總平均分為: 56

import?java.util.Random;

import?java.util.Scanner;


public?class?Demo02 {

public?static?void?main(String[] args) {

Scanner sc = new?Scanner(System.in);

System.out.println("請輸入班級總組數(shù):");

int?a = sc.nextInt();

System.out.println("請輸入班級中每組的人數(shù):");

int?b = sc.nextInt();

int[][] arr = new?int[a][b];

Random r = new?Random();

int?avg = 0;

for?(int?i = 0; i < arr.length; i++) {

int?count = 0;

int?source = 0;

for?(int?j = 0; j < arr[i].length; j++) {

arr[i][j] = r.nextInt(101);

if(arr[i][j]<60){

count++;

}

source+=arr[i][j];

}

int?avg1 = source/arr[i].length;

System.out.println("第"+(i+1)+"組不及格人數(shù)為:"+count+"人");

System.out.println("第"+(i+1)+"組平均分為:"+avg1);

if(avg1>avg){

avg = avg1;

}

}

System.out.println("班級中單組最高平均分為:"+avg);

}

}


2.2.3?第三題:看程序說結(jié)果,請不要提前運(yùn)行?

public class Test03_01 {

public static void main(String[] args) {

int[] arr1 = {1,2,3,4,5};

int[] temp1 = arr1;

int[] temp2 = arr1;

System.out.println("通過temp1取出數(shù)組值: ");

for(int i = 0;i

System.out.print(temp1[i]+" ");

}

System.out.println();

System.out.println("通過temp2取出數(shù)組值: ");

for(int i = 0;i

System.out.print(temp2[i]+" ");

}

System.out.println();

temp1[2] = 9;

System.out.println("通過temp1取出數(shù)組值: ");

for(int i = 0;i

System.out.print(temp1[i]+" ");

}

System.out.println();

System.out.println("通過temp2取出數(shù)組值: ");

for(int i = 0;i

System.out.print(temp2[i]+" ");

}

System.out.println();

}

}

public class Test03_02 {

public static void main(String[] args) {

int[] arr1 = {1,2,3,4,5};

int[] arr2 = {5,6,7};

int[] temp = arr1;

System.out.println("通過temp取出arr1中的元素: ");

for(int i = 0;i

System.out.print(temp[i]+" ");

}

temp = arr2;

System.out.println("通過temp取出arr2中的元素: ");

for(int i = 0;i

System.out.print(temp[i]+" ");

}

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個(gè)月起每個(gè)月都生一對兔子,小兔子長到第三個(gè)月后每個(gè)月又生一...
    阿里高級軟件架構(gòu)師閱讀 3,390評論 0 19
  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個(gè)月起每個(gè)月都生一對兔子,小兔子長到第三個(gè)月后每個(gè)月又生一對兔...
    葉總韓閱讀 5,227評論 0 41
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 每日橙思 要想保持內(nèi)心的寧靜專注的做一件事,那就不能太注重結(jié)果,如果急功近利會在看不到未來的情況下放棄目前所做的事...
    cf85ea560887閱讀 156評論 0 0
  • 寫給自己得日記 和平常一樣,六點(diǎn)鐘睜開了雙眼,無精打采,內(nèi)心很空??粗赃吺焖娜藘?,不由得發(fā)起了呆。 這個(gè)時(shí)候,...
    d6d9e65c61fa閱讀 160評論 0 0

友情鏈接更多精彩內(nèi)容