第四天 數(shù)組【悟空教程】
第04天 Java基礎(chǔ)
第1章?數(shù)組
1.1?數(shù)組概念
軟件的基本功能是處理數(shù)據(jù)舌剂,而在處理數(shù)據(jù)時气破,必須先進行數(shù)據(jù)持有聊浅,將數(shù)據(jù)持有之后,再對數(shù)據(jù)進行處理现使。我們將程序中可以臨時存儲數(shù)據(jù)的部分叫做容器低匙。
Java當(dāng)中具有持有數(shù)據(jù)功能的容器中,數(shù)組是最基本的碳锈,也是運算速度最快的顽冶。
1.2?數(shù)組的定義格式
數(shù)組是引用類型的一種,其使用方式與引用類型類似售碳,均使用new關(guān)鍵字創(chuàng)建對象為變量賦值强重。
格式1:數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[元素個數(shù)或數(shù)組長度];
格式2:數(shù)據(jù)類型 數(shù)組名[]?= new 數(shù)據(jù)類型[元素個數(shù)或數(shù)組長度];
注意:這兩種定義做完了,數(shù)組中是沒有元素值的贸人。如何對數(shù)組的元素進行初始化呢?
示例: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)存空間,并為每個數(shù)組元素賦值艺智。
數(shù)組的初始化方式
動態(tài)初始化:初始化時只指定數(shù)組長度倘要,由系統(tǒng)為數(shù)組分配初始值。
靜態(tài)初始化:初始化時指定每個數(shù)組元素的初始值十拣,由系統(tǒng)決定數(shù)組長度封拧。
1.3.1?數(shù)組內(nèi)元素均有默認初始化值
在創(chuàng)建數(shù)組對象后志鹃,數(shù)組中元素會被自動賦予一個默認值,這個過程叫做默認初始化泽西。根據(jù)元素類型的不同曹铃,默認初始化的值也是不一樣的。具體如下表所示尝苇。
表2-1元素默認值
數(shù)據(jù)類型默認初始化值
byte、short埠胖、int糠溜、long0
float、double0.0
char一個空字符(空格)直撤,即’\u0000’
booleanfalse
引用數(shù)據(jù)類型null非竿,表示變量不引用任何對象
1.3.2?數(shù)組的初始化(動態(tài)初始化)
動態(tài)初始化:初始化時只指定數(shù)組長度,由系統(tǒng)為數(shù)組分配初始值谋竖。
格式:數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組長度];
數(shù)組長度其實就是數(shù)組中元素的個數(shù)红柱。
舉例:
int[] arr = new int[3];
解釋:定義了一個int類型的數(shù)組,這個數(shù)組中可以存放3個int類型的值
1.4?訪問數(shù)組元素
直接打印數(shù)組名,打印的是數(shù)組堆內(nèi)存中的地址
數(shù)組中的每個元素都是有編號的蓖乘,編號是從0開始的锤悄,最大的編號就是數(shù)組的長度-1
用數(shù)組名和編號的配合我們就可以獲取數(shù)組中的指定編號的元素
數(shù)組底層是依次將數(shù)據(jù)進行編號后直接通過編號訪問(線性序列)的。這個編號叫做索引嘉抒。
格式:數(shù)組名[編號] -- 數(shù)組名[索引]
數(shù)組名稱為arr,索引為0,1,2
獲取數(shù)組中元素的格式:
arr[0]獲取數(shù)組中的第一個元素
arr[1]獲取數(shù)組中的第二個元素
arr[2]獲取數(shù)組中的第三個元素
如:
int[] arr = {20,5,100,30,5};
arr[0]訪問的為20零聚,arr[2]訪問的100。
這里的”訪問”包含以下兩個動作:獲取值與賦值些侍。如:
為元素賦值: arr[1] = 33; ?則第2個元素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ù)長度/元素個數(shù)];
訪問數(shù)組中指定編號的元素:數(shù)組名[索引]
給數(shù)組中的元素賦值: 數(shù)組名[索引] = 數(shù)據(jù)值;
使用數(shù)組名.length可以獲取數(shù)組長度蚂会。
直接打印數(shù)組名是獲取了數(shù)組的堆內(nèi)存地址值(內(nèi)存圖詳細了解)
*/
public class Demo02Array{
public static void main(String[] args){
//定義一個長度為3的整數(shù)數(shù)組
int[] arr1 = new int[3];
//int[] arr2 = new int[]{1,2,3,4,5};//有幾個元素,長度就為幾
int[] arr2 = {1,2,3,4,5};
// ????索引 ??0 1 2 3 4
//訪問arr2數(shù)組中第一個元素
//System.out.println("數(shù)組的第一個元素: " +arr2[0]);
int x = arr2[0];
System.out.println("數(shù)組的第一個元素: " + 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
//定義一個長度為10的String類型數(shù)組
//String[] arr2 = new String[10];
}
}
直接打印數(shù)組名是獲取了數(shù)組的堆內(nèi)存地址值(內(nèi)存圖詳細了解)
1.5?數(shù)組的注意事項
1.5.1?數(shù)組的長度是固定的
數(shù)組在創(chuàng)建對象過程當(dāng)中,必須指定數(shù)組長度耗式,無法創(chuàng)建對象進而無法給變量賦值胁住。
1.5.2?一個數(shù)組中只能存儲一種類型的數(shù)據(jù)
在數(shù)組的定義格式中有顯式地寫出該數(shù)組中存儲的數(shù)據(jù)類型,所以一個數(shù)組只能存儲同一種數(shù)據(jù)類型刊咳。(在多態(tài)的講解后措嵌,我們會有新的理解)
1.5.3?數(shù)組運行期報錯
在使用數(shù)組時,因為不當(dāng)?shù)牟僮髀郑覀兛赡軙ㄟ^編譯企巢,但是在運行期間遇到一些程序報錯類似這樣編譯時不報錯,運行期報錯的錯誤叫運行時錯誤
數(shù)組最常見的兩個運行時錯誤:空指針異常和數(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賦值時斩跌,變量arr作為數(shù)組名通過編號訪問數(shù)組元素時編譯不報錯,運行時報運行錯誤NullPointerException空指針異常
1.5.3.2?數(shù)組索引越界異常
當(dāng)數(shù)組中不存在該索引卻訪問該索引時捞慌,運行時報錯:
ArrayIndexOutOfBoundsException?數(shù)組索引越界
/*
數(shù)組的注意事項:
1.數(shù)組在創(chuàng)建對象過程當(dāng)中耀鸦,必須指定數(shù)組長度,否則無法創(chuàng)建對象進而無法給變量賦值啸澡。
2.在數(shù)組的定義格式中有顯式地寫出該數(shù)組中存儲的數(shù)據(jù)類型袖订,所以一個數(shù)組只能存儲同一種數(shù)據(jù)類型。(在多態(tài)的講解后嗅虏,我們會有新的理解)
3.在創(chuàng)建數(shù)組對象后洛姑,數(shù)組中元素會被自動賦予一個默認值,這個過程叫做默認初始化皮服。根據(jù)元素類型的不同吏口,默認初始化的值也是不一樣的。
數(shù)組運行期錯誤:
空指針異常:給數(shù)組變量賦值的時候,賦值成null,數(shù)組不指向一個堆內(nèi)存的地址,索引會報NullPointerException
數(shù)組索引越界:訪問了不存在的索引
*/
public class Demo03Array{
public static void main(String[] args){
//1.數(shù)組在創(chuàng)建對象過程當(dāng)中冰更,必須指定數(shù)組長度产徊,否則無法創(chuàng)建對象進而無法給變量賦值。
//定義一個長度為5的int類型數(shù)組
//int[] arr = new int[];//錯誤: 缺少數(shù)組維
int[] arr = new int[5];
//2.一個數(shù)組只能存儲同一種數(shù)據(jù)類型蜀细。
//arr[0] = "hello";//錯誤: 不兼容的類型
arr[0] = 18;
System.out.println(arr[0]);//18
//int有默認的初始化值 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有默認的初始化值 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]);//錯誤: 可能尚未初始化變量arr3
*/
//int a = null;//錯誤: 不兼容的類型
//double[] arr3 = null;
//System.out.println(arr3[0]);//NullPointerException
}
}
1.6?數(shù)組的內(nèi)存解釋
1.6.1?內(nèi)存分區(qū)
內(nèi)存是計算機臨時存儲數(shù)據(jù)的區(qū)域舟铜,我們會將內(nèi)存在邏輯上分配成不同區(qū)域方便對數(shù)據(jù)進行分類高效管理。
寄存器:最快的存儲區(qū)域直接與CPU打交道奠衔,是程序員無法控制的計算區(qū)域谆刨。
堆棧:又叫棧,僅次于寄存器归斤。用于存儲局部變量痊夭。
堆:通用內(nèi)存池,用于存放所有引用數(shù)據(jù)類型對象脏里。每個對象均有地址她我,且有默認初始化值。
常量存儲區(qū)域:用于存放永遠不會被改變的值。
1.7?Java中的內(nèi)存分配
Java程序在運行時番舆,需要在內(nèi)存中的分配空間酝碳。
為了提高運算效率,就對空間進行了不同區(qū)域的劃分恨狈,因為每一片區(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式疏哗。
內(nèi)存分區(qū):
棧 又叫棧,僅次于寄存器禾怠。用于存儲局部變量
局部變量是定義在方法中或者語句中的變量
局部變量使用完畢返奉,立即回收
堆 通用內(nèi)存池,用于存放所有引用數(shù)據(jù)類型對象吗氏。每個對象均有地址芽偏,且有默認初始化值。New出來的東西牲证。
每一個對象都有首地址值,是一個十六進制的地址
每一個對象內(nèi)的數(shù)據(jù)都有默認值
byte,short,int,long 0
float,double 0.0
char ‘\u0000’,一個空格
boolean false
引用類型:null
使用完畢后哮针,會被垃圾回收器空閑的時候回收关面。
方法區(qū):(方法區(qū))又叫靜態(tài)區(qū)坦袍,存放所有的class和靜態(tài)變量,方法區(qū)存放的是整個程序中唯一的元素等太,如class和static變量捂齐。
本地方法區(qū) (和系統(tǒng)相關(guān))
寄存器 (給CPU使用)最快的存儲區(qū)域直接與CPU打交道,是程序員無法控制的計算區(qū)域
畫圖說明:數(shù)組的內(nèi)存圖
1.8?數(shù)組內(nèi)存圖解
定義一個數(shù)組缩抡,輸出數(shù)組名及元素奠宜。然后給數(shù)組中的元素賦值,再次輸出數(shù)組名及元素
定義兩個數(shù)組瞻想,分別輸出數(shù)組名及元素压真。然后分別給數(shù)組中的元素賦值,分別再次輸出數(shù)組名及元素蘑险。
定義兩個數(shù)組滴肿,先定義一個數(shù)組賦值,輸出佃迄。然后定義第二個數(shù)組的時候把第一個數(shù)組的地址賦值給第二個數(shù)組泼差。然后給第二個數(shù)組賦值,再次輸出兩個數(shù)組的名及元素呵俏。
1.9?數(shù)組的初始化(靜態(tài)初始化)
概述
????初始化時指定每個數(shù)組元素的初始值堆缘,由系統(tǒng)決定數(shù)組長度。
格式
????數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[]{元素1,元素2,…};
舉例
int[] arr = new int[]{1,2,3};
解釋:定義了一個int類型的數(shù)組普碎,這個數(shù)組中可以存放3個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)介紹的第一個引用數(shù)據(jù)類型,了解內(nèi)存結(jié)構(gòu)將有助于后期整個面向?qū)ο蟮膶W(xué)習(xí)潜沦。
int[] x = new int[100];
引用變量:數(shù)組屬于引用數(shù)據(jù)類型萄涯,引用數(shù)據(jù)類型定義的變量x存儲在棧內(nèi)存當(dāng)中,這個x變量叫做這個數(shù)組實例的引用變量唆鸡。
=:與數(shù)學(xué)當(dāng)中的意義不同涝影,是賦值的意思,并非相等争占。
真正的數(shù)組實例是通過new關(guān)鍵字創(chuàng)建出來燃逻,存儲于堆內(nèi)存中,并產(chǎn)生一個十六進制表示的內(nèi)存地址0x3000臂痕。
這個引用變量會指向這個數(shù)組的內(nèi)存地址
則引用變量的值是這個數(shù)組實例的地址值伯襟,引用變量通過地址可以表示這個數(shù)組對象
1.10?數(shù)組遍歷
在操作數(shù)組時,經(jīng)常需要依次訪問數(shù)組中的每個元素握童,這種操作稱作數(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]); //通過索引訪問元素
}
}
}
運行結(jié)果如下圖所示。
圖1-1運行結(jié)果
上述代碼中澡绩,定義一個長度為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:一個String數(shù)組中存儲一些人名揪胃,奇偶報數(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ù)據(jù)類型(包含String類型)氛琢,形式參數(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ù)據(jù)類型(String類型除外),形式參數(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ù)組中的每一個元素
獲取數(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)改進
for?(int?x?= 0; x?< 5; x++) {
System.out.println(arr[x]);
}
System.out.println("--------------------");
//為了解決我們?nèi)?shù)數(shù)組中元素個數(shù)的問題阳似,數(shù)組就提供了一個屬性:length
//用于獲取數(shù)組的長度
//格式:數(shù)組名.length
System.out.println("數(shù)組共有:"+arr.length+"個元素");
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以外的所有元素,進行比較
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ù)組调鲸。
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ù)組的個數(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
//我如何獲取到一個二維數(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)于定義了一個3*4的二維數(shù)組挽荡,即二維數(shù)組的長度為3藐石,二維數(shù)組中的每個元素又是一個長度為4的數(shù)組,接下來通過一個圖來表示這種情況定拟,如下圖所示于微。
圖1-2二維數(shù)組
b)?第二種方式
int[][] arr = new int[3][];
第二種方式和第一種類似逗嫡,只是數(shù)組中每個元素的長度不確定,接下來通過一個圖來表示這種情況株依,如下圖所示驱证。
圖1-3?二維數(shù)組
c)?第三種方式
int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
上面的二維數(shù)組中定義了三個元素,這三個元素都是數(shù)組恋腕,分別為{1,2}抹锄、{3,4,5,6}、{7,8,9}荠藤,接下來通過一個圖來表示這種情況伙单,如圖2-54所示。
圖1-4?二維數(shù)組
1.13.3?二維數(shù)組的元素訪問
對二維數(shù)組中元素的訪問也是通過索引的方式哈肖,如需訪問二維數(shù)組中第一個元素數(shù)組的第二個元素吻育,具體代碼如下:
arr[0][1]; ?//訪問的為二維數(shù)組中第1個一維數(shù)組的第2個元素
請參照以為數(shù)組的遍歷求和,完成二維數(shù)組的遍歷求和淤井。
/*
二維數(shù)組:數(shù)組中的元素仍為一個一維數(shù)組
*/
public class Demo05ArrayArray{
public static void main(String[] args){
//定義一個長度為3,每個數(shù)組元素都是一個長度為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ù)組中的第一個元素的第一個值
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ù)組的名稱
// arr[1]其實就是二維數(shù)組中的第二個一維數(shù)組的名稱
// arr[2]其實就是二維數(shù)組中的第三個一維數(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)容不換行
/*
//第一個一維數(shù)組的元素
for (int?x = 0; x < arr[0].length; x++) {
System.out.print(arr[0][x] + " ?");
}
System.out.println();
//第二個一維數(shù)組的元素
for (int?x = 0; x < arr[1].length; x++) {
System.out.print(arr[1][x] + " ?");
}
System.out.println();
//第三個一維數(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ù)組案例---隨機點名器案例
1.14.1?案例介紹與演示
隨機點名器布疼,即在全班同學(xué)中隨機的打印出一名同學(xué)名字。
要做的隨機點名器币狠,它具備以下3個內(nèi)容:
存儲所有同學(xué)姓名
總覽全班同學(xué)姓名
隨機點名其中一人游两,打印到控制臺
1.14.2?案例分析
在全班同學(xué)中隨機的打印出一名同學(xué)名字。
我們對本案例進行分析总寻,得出如下分析結(jié)果器罐,共可以設(shè)計出三個步驟:
1.存儲全班同學(xué)名字
2.打印全班同學(xué)每一個人的名字
3.在班級總?cè)藬?shù)范圍內(nèi)梢为,隨機產(chǎn)生一個隨機數(shù)索引渐行,查找該隨機數(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ù)組中的每一個名稱即可。
names[0] = “Lucy”;
names[1] = ”Lily”;
...
c)?隨機點名
通過隨機數(shù)類Random產(chǎn)生一個從0到數(shù)組長度的隨機索引粟害。而該索引對應(yīng)的值便是所求的隨機姓名蕴忆。
導(dǎo)包:所屬包java.util.?Random??
創(chuàng)建實例格式:Random ?random = new Random ();
調(diào)用方法,生成隨機索引:int ?randomIndex = random.nextInt(數(shù)組長度);
通過數(shù)組名[索引]的方式獲取該元素并打印悲幅。
/*
隨機點名器:
分析:
要做的隨機點名器套鹅,它具備以下3個內(nèi)容:
存儲所有同學(xué)姓名--> String[]
總覽全班同學(xué)姓名-->遍歷數(shù)組
隨機點名其中一人,打印到控制臺--> 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)+"個同學(xué)的姓名是: " + names[i]);
}
/*
System.out.print("全班同學(xué)姓名: ");
for(int i=0; i
System.out.print("" + names[i]);
}
*/
//隨機點名其中一人汰具,打印到控制臺 --> Random類
Random r = new Random();
//System.out.println(r);//java.util.Random@1e58cb8
//在數(shù)組的范圍內(nèi)隨機產(chǎn)生一個數(shù)
int number = r.nextInt(names.length);//names.length = 5
//通過產(chǎn)生的隨機數(shù),在數(shù)組中查找對應(yīng)的元素(索引)
String name = names[number];//number 0,1,2,3,4
System.out.println("============================================");
System.out.println("隨機到的同學(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
//定義一個一維數(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.求一個int數(shù)組中所有偶數(shù)的和
2.一個String數(shù)組中存儲一些人名卓鹿,奇偶報數(shù),將所有奇數(shù)的同學(xué)分配到一個數(shù)組中留荔,偶數(shù)的同學(xué)分配到另外數(shù)組中吟孙,并遍歷(兩種理解,兩種解法)(較復(fù)雜)
3.二維數(shù)組求和
4.簡單理解引用類型內(nèi)
5.模擬空指針異常與數(shù)組索引越界異常
6.什么是數(shù)組
7.是否可以不給數(shù)組中的元素賦值
8.直接打印數(shù)組變量,結(jié)果是什么杰妓,怎么理解藻治?
2.1?知識點相關(guān)題
2.1.1?一維數(shù)組,定義三種數(shù)組巷挥,并遍歷
要求:
1)?熟練掌握一維數(shù)組的定義桩卵;
2)?熟練遍歷,匯總一維數(shù)組倍宾;
題目:
定義類:Test4吸占,定義main()方法,按以下要求編寫代碼:
A.請使用三種格式定義三個數(shù)組凿宾,都存儲5個數(shù)字:10,20,30,40,50
B.分別遍歷這三個數(shù)組矾屯,打印每個元素;
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?計算這個數(shù)組中所有元素的和
定義類:Test5初厚,定義main()方法件蚕,按以下要求編寫代碼:
A.請定義一個數(shù)組,任意存儲幾個數(shù)字产禾;
B.計算這個數(shù)組中所有元素的和排作,并打印這個和;
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.定義一個數(shù)組楞件,存儲幾個學(xué)員的考試分數(shù):
88.5 ??96 ??97 ??74 ??88.2 ???58.5 ???77.9 ??90 ??99
B.計算這幾個學(xué)員的平均分衫生;
C.統(tǒng)計:成績在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.定義一個數(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.定義一個數(shù)組,存儲以下信息:
java ?oracle ?php ?mysql ?HTML ?android ?IOS ?JSP
B.打印數(shù)組中所有偶數(shù)索引位置上的值还最;
package?StudyJavaSEday04;
/**
*定義一個數(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?知識點:二維數(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.?按上面的格式打印這個二維數(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ù),并用隨機數(shù)產(chǎn)生成績
第一題:分析以下需求乌庶,并用代碼實現(xiàn)
1.鍵盤錄入班級人數(shù)
2.根據(jù)錄入的班級人數(shù)創(chuàng)建數(shù)組
3.利用隨機數(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ù)量?
第二題:分析以下需求种蝶,并用代碼實現(xiàn)
1.基礎(chǔ)班考試要進行分組,鍵盤錄入該班級總共多少組?以及每組的學(xué)生數(shù)量?
2.根據(jù)錄入的組數(shù)及每組學(xué)員的數(shù)量創(chuàng)建二維數(shù)組
3.利用隨機數(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é)果,請不要提前運行瞒大?
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]+" ");
}
}
}