🌀🌀🌀作者:@小魚不會騎車
🍁🍁🍁專欄:《java練級之旅》
🎀🎀🎀個人簡介:一名專科大一在讀的小比特,努力學習程式設計是我唯一的出路😎😎😎
🙈🙈🙈作者心裡話![]()
《java練級之路之數組的應用場景》非常細緻,小白也能看懂!!!
小魚一直都是秉承着“開開心心看部落格,快快樂樂學知識”這個觀點來給大家用一些接地氣的話進行講解,可能會有人覺得小魚太墨迹了,小魚這裡也很樂意接受大家的意見,會進行采納,大家也可以指出小魚的不足,小魚也會積極的進行改變,總之,願我們越來越優秀
前言
😎 emmm,這篇是關于java中《初識數組》的,關于前兩章大家可以去我首頁檢視,當然我也會給這三篇文章單獨分一類以便于大家更好的觀看,我們經過了前兩章有些枯燥的理論知識後是不是各位也都想上手實戰一下,好的!我們這篇文章就是帶大家鞏固知識,不過你們應該懂小魚吧,那必須會留下一些坑啊(大家可不要跳進坑裡呦),在此基礎還是會摻雜一些理論知識的,不過小魚盡量找個大家更容易了解的方式進行講解,好的廢話不多說,我們進入正題
介紹
來讓小魚給大家介紹一些今天的任務,
- 任務1️⃣:儲存資料(特别簡單可以跳過)
- 任務2️⃣:作為函數的參數
- 任務3️⃣:作為函數的傳回值
- 任務4️⃣:數組練習(大家期待已久的!!!)
我們的任務規劃好了,現在開始
(💫數組的應用場景)
😺1. 儲存資料
public static void main(String[] args) {
int[]array={1,2,3};
for (int i = 0; i <array.length ; i++) {
System.out.print(array[i]+" ");
}
}
将數組的值列印出來,簡稱儲存資料
😸2. 作為函數的參數
🍒 前言
大家應該很熟悉吧,咱們的阿七,當然,咱們的重點不是這個,理發店大家是不是都很常見,也有一句特别有意思的話,當然小魚也是親身經曆的,我以為剪了頭發,就可以了無牽挂,相信大家都是耳熟能詳吧。不過我們先奔入正題,我們在理發時,一般就會有理發師A給你理發,但是理發之前呢,會先去洗頭,這個時候就是理發師B的任務了,也就是理發師B和理發師A都可以對你進行改變(兩種情況),
情況一這時候吧又有一個人特别着急,于是便讓這個理發師B先給他洗了頭,那麼你呢,就隻是幹坐着,什麼都沒變,後來理發師A就又把你從理發師B的手裡接了回來,你現在就是什麼都沒有改變的狀态,
情況二就是理發師B給你把頭洗了,等到理發師A再把你接回來的時候,你就是已經變化了的狀态(頭洗了和沒洗是兩種狀态),
注意!!!先說明,理發師A和理發師B能做的事情都是一樣的。
可能大家聽這個會感覺一些疑惑,咦,這都什麼是什麼啊,小魚想說,大家别急,等會咱們跟進着問題,疑惑也就漸漸的消散了。
🍒 題目一
public static void fun(int x) {
x=20;
System.out.println("x="+x);
}
public static void main(String[] args) {
int a=10;
fun(a);
System.out.println("a="+a);
}
// 執行結果
//a = 10
//x = 20
我給大家畫圖解釋一下
1️⃣大家看,我們的x最開始接受的值是10,并且在棧上給fun方法開辟了一個空間,該空間存儲的是f方法内部的變量。
🔔這裡涉及到了形參和實參,形參是實參的臨時拷貝,改變形參不會影響實參,大家就可以認為,x是形參,a是實參,我們把實參a的值傳遞到形參x,這樣我們的x變量裡面存的值就是整形10.
2️⃣接下來我們修改我們的x,将x指派為20,前面講到了,形參是實參的一個臨時拷貝,他的改變不會影響實參,是以我們就可以得到,雖然我們的x改成了20,但是我們的a依舊是10,
大家看箭頭指向的地方,我們的x被修改成20了,但是我們的a依舊沒變。這個就是基本資料類型傳參
🍒 題目二
注意下面的才是重點❗️❗️❗️
public static void fun1(int[]array) {
array=new int[]{1,2,3};
}
public static void fun2(int[]array) {
array[0]=100;
}
public static void main(String[] args) {
int[]array1={1,2,3,4};
fun1(array1);我們先進行fun1這個方法
//fun2(array1);
System.out.println(Arrays.toString(array1));
}
💡這裡就涉及到了之前講到的剪頭發問題了,
🌲fun1方法
大家認為我們經過了fun1方法之後列印的會是什麼?
大家思考一下
想必大家都會有一些疑惑吧,怎麼就沒有改變呢?
💡小魚給大家進行細緻講解
老規矩,畫圖示範
1️⃣在這裡呢,我們進入了fun方法中,在fun方法内建立了一個變量array,這時候呢,因為我們的array1是array的一份臨時拷貝,是以我們的array存放的值也是在堆中給數組開辟的記憶體的位址。我們可以通過這兩個變量都去找到這個位址,
🔔這時候呢,就涉及到咱們講到的理發的問題了,兩個理發師都可以對這個人進行改變,
2️⃣但是呢我們的理發師2(array)沒有對這個客戶負責,他去給别的人洗剪吹去了,就如下圖
那麼這個時候我們的理發師2還能對這個客戶進行改變嘛?不能了,你都去服務别的客人了,還怎麼對我進行改造啊,是以我們就可以結合實際,推導出我們的array1對應的那塊數組沒有被進行改變,是以呢我們最後的列印,也就是原數組{1,2,3,4}
🌲fun2方法
public static void fun1(int[]array) {
array=new int[]{1,2,3};
}
public static void fun2(int[]array) {
array[0]=100;
}
public static void main(String[] args) {
int[]array1={1,2,3,4};
// fun1(array1);
fun2(array1);//這次對fun2進行解答
System.out.println(Arrays.toString(array1));
}
還是老規矩,大家思考一下我們的array1最終會輸出什麼呢❓
各位猜對了嗎?
接下來小魚再給大家細緻的講解這個題
1️⃣我們大家來看第一步
依舊是先進行拷貝,将我們的array1變量中儲存的位址拷貝給了array
這時候大概意思就是,我們的理發師1和理發師2都可以對這個人進行改變,
2️⃣我們的理發師2這次沒有别的事情了,專心的給客戶洗了頭,對吧,等到我們的理發師1(array1)再去接收到這個客戶時,也就是被洗完了頭的客戶,結合實際,大家看我們的圖,array其實就像是理發師2,對數組進行了修改,因為他們存的位址都一樣,都可以通過這個位址來找到這塊在堆上開辟的數組,就這樣我們的數組被修改了,那麼我們的最後列印的也自然就是被修改後的數{100,2,3,4}
是以我們發現
發現在func方法内部修改數組的内容, 方法外部的數組内容也發生改變.
因為數組是引用類型,按照引用類型來進行傳遞,是可以修改其中存放的内容的。
✅總結
所謂的 "引用" 本質上隻是存了一個位址. Java 将數組設定成引用類型, 這樣的話後續進行數組參數傳參, 其實
隻是将數組的位址傳入到函數形參中. 這樣可以避免對整個數組的拷貝(數組可能比較長, 那麼拷貝開銷就會很大).
😺3.作為方法的傳回值
🔎可能有人知道我們在C語言中建立的函數是可以有傳回值的,根據要傳回值的類型,來決定傳回的類型
擷取斐波那契的前N項
public static int[] Fib(int n) {
if(n <= 0){
return null;
}
int []array=new int[n];
array[0]=1;
array[1]=1;
for (int i = 2; i <n ; i++) {
array[i]=array[i-1]+array[i-2];
}
return array;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int[]array= Fib(a);
System.out.println(Arrays.toString(array));
}
public static int[] fun3() {
int[]p=new int[]{1,2,3,4};
return p;
}
public static void main(String[] args) {
int[]array1=fun3();
System.out.println(Arrays.toString(array1));//列印
}