淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景
前言
對(duì)于數(shù)組,在C語(yǔ)言中就有過(guò)學(xué)習(xí),但是,并沒(méi)有怎么進(jìn)行總結(jié)過(guò),所以,筆者在Java中,對(duì)數(shù)組的幾個(gè)簡(jiǎn)單的應(yīng)用場(chǎng)景進(jìn)行總結(jié)一下:
1.保存數(shù)據(jù)
public static void main(String[] args) { int[] array = {1, 2, 3}; for(int i = 0; i < array.length; ++i){ System.out.println(array[i] + " "); } }
代碼的運(yùn)行結(jié)果為:
2.. 參數(shù)傳基本數(shù)據(jù)類型
public static void main(String[] args) { int num = 0; func(num); System.out.println("num = " + num); } public static void func(int x) { x = 10; System.out.println("x = " + x); }
代碼的運(yùn)行結(jié)果為:
發(fā)現(xiàn)在func方法中修改形參 x 的值, 不影響實(shí)參的 num 值.
3.. 參數(shù)傳數(shù)組類型(引用數(shù)據(jù)類型)
public static void main(String[] args) { int[] arr = {1, 2, 3}; func(arr); System.out.println("arr[0] = " + arr[0]); } public static void func(int[] a) { a[0] = 10; System.out.println("a[0] = " + a[0]); }
代碼的運(yùn)行結(jié)果為:
發(fā)現(xiàn)在func方法內(nèi)部修改數(shù)組的內(nèi)容, 方法外部的數(shù)組內(nèi)容也發(fā)生改變. 因?yàn)閿?shù)組是引用類型,按照引用類型來(lái)進(jìn)行傳遞,是可以修改其中存放的內(nèi)容的。
總結(jié): 所謂的 "引用" 本質(zhì)上只是存了一個(gè)地址. Java 將數(shù)組設(shè)定成引用類型, 這樣的話后續(xù)進(jìn)行數(shù)組參數(shù)傳參, 其實(shí) 只是將數(shù)組的地址傳入到函數(shù)形參中. 這樣可以避免對(duì)整個(gè)數(shù)組的拷貝(數(shù)組可能比較長(zhǎng), 那么拷貝開(kāi)銷就會(huì)很大).
4. 作為函數(shù)的返回值
比如:獲取斐波那契數(shù)列的前N項(xiàng)
public class Main { public static int[] fib(int n){ if(n <= 0){ return null; } int[] array = new int[n]; array[0] = 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) { int[] array = fib(10); for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } }
代碼的運(yùn)行結(jié)果為:
拓展講解:
1.作為函數(shù)的返回值部分:
public static void func1(int[] array) { array=new int[]{15,16,17}; } public static void func2(int[] array) { array[0]=99; } public static void main(String[] args) { int[] array1={1,2,3,4}; func1(array1); //打印結(jié)果: [1,2,3,4] // func2(array1); //打印結(jié)果: [99,2,3,4] }
在上述代碼中:對(duì)func1進(jìn)行分析:
形參的改變,不會(huì)影響實(shí)參!!
在上述代碼中:func1僅僅是改變了形參的指向,并沒(méi)有影響的實(shí)參!
對(duì)func2進(jìn)行分析:
在func2函數(shù)中,傳遞的是引用,我們可以通過(guò)引用來(lái)改變?cè)瓉?lái)的值??!
總結(jié)一下:
當(dāng)數(shù)組作為參數(shù)進(jìn)行傳遞的時(shí)候,其實(shí)還是按值傳遞的,此時(shí)的值是一個(gè)地址!!那么就會(huì)出現(xiàn)兩種情況:
情況1:形參修改指向,array=new int[10]; 只會(huì)影響形參的指向!
比如:
public static void func1(int[] array) { array=new int[]{15,16,17}; } public static void main(String[] args) { int[] array1={1,2,3,4}; func1(array1); //打印結(jié)果: [1,2,3,4] }
情況2:形參修改指向?qū)ο蟮闹?/strong>: array[0]=99,此時(shí)才會(huì)影響到實(shí)參!
public static void func2(int[] array) { array[0]=99; } public static void main(String[] args) { int[] array1={1,2,3,4}; // func2(array1); //打印結(jié)果: [99,2,3,4] }
2.數(shù)組作為函數(shù)的返回值!
public static int[] func10() { int[] tmpArr={11,22,33}; return tmpArr; } public static void main(String[] args) { int[] array=func10(); System.out.println(Arrays.toString(array)); //[11,22,33] }
上述代碼的運(yùn)行結(jié)果為:
畫(huà)圖分析為:
解析:tmpArr 是在函數(shù)里面創(chuàng)建的局部變量!當(dāng)遇見(jiàn)return 的時(shí)候,這個(gè)方法就結(jié)束了,那么tmpArr 就會(huì)被回收掉了(銷毀),那么,就意味著,tmpArr把值傳遞給array后,就被回收了!!
3.方法內(nèi)部接收數(shù)組,并且返回?cái)?shù)組!
public static int[] grow(int[] array) { for (int i = 0; i < array.length; i++) { array[i]=array[i]*2; } return array; } public static void main(String[] args) { int[] array={1,2,3,4,5,6,7,8}; int[] ret=grow(array); System.out.println(Arrays.toString(array)); //[2, 4, 6, 8, 10, 12, 14, 16] System.out.println(Arrays.toString(ret)); //[2, 4, 6, 8, 10, 12, 14, 16] }
上述代碼的運(yùn)行結(jié)果為:
畫(huà)圖解析一下:
但是,另外一種寫(xiě)法: 我們需要簡(jiǎn)單思考一下喲??!
public static int[] grow(int[] array) { int[] tmpArray =new int[array.length];//java支持這種數(shù)組的創(chuàng)建??!里面可以是變量! for (int i = 0; i < array.length; i++) { tmpArray[i]=array[i]*2; } return tmpArray; } public static void main(String[] args) { int[] array={1,2,3,4,5,6,7,8}; int[] ret=grow(array); System.out.println(Arrays.toString(array)); //[1, 2, 3, 4, 5, 6, 7, 8] System.out.println(Arrays.toString(ret)); //[2, 4, 6, 8, 10, 12, 14, 16] }
代碼的運(yùn)行結(jié)果為:
畫(huà)圖解析為:
總結(jié)
到此這篇關(guān)于Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景的文章就介紹到這了,更多相關(guān)Java數(shù)組應(yīng)用場(chǎng)景內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java數(shù)組(Array)最全匯總(中篇)
- Java數(shù)組(Array)最全匯總(上篇)
- Java之?dāng)?shù)組在指定位置插入元素實(shí)現(xiàn)
- Java自定義一個(gè)變長(zhǎng)數(shù)組的思路與代碼
- Java中如何將?int[]?數(shù)組轉(zhuǎn)換為?ArrayList(list)
- Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List分享
- java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組
- 計(jì)算Java數(shù)組長(zhǎng)度函數(shù)的方法以及代碼分析
- Java C++題解leetcode915分割數(shù)組示例
- Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法
- Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用
- Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例
- Java postgresql數(shù)組字段類型處理方法詳解
- Java中數(shù)組的常見(jiàn)操作合集
- 關(guān)于Java?SE數(shù)組的深入理解
- Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解
- Java數(shù)組隊(duì)列及環(huán)形數(shù)組隊(duì)列超詳細(xì)講解
- Java數(shù)組(Array)最全匯總(下篇)
相關(guān)文章
application.yml的格式寫(xiě)法和pom.xml讀取配置插件方式
這篇文章主要介紹了application.yml的格式寫(xiě)法和pom.xml讀取配置插件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java遞歸讀取文件例子_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文通過(guò)一段示例代碼給大家介紹了java遞歸讀取文件的方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-05-05說(shuō)說(shuō)字符串轉(zhuǎn) OffSetDateTime 你真的會(huì)用嗎
這篇文章主要介紹了字符串轉(zhuǎn) OffSetDateTime 你真的會(huì)用嗎?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08springboot遠(yuǎn)程debug調(diào)試全過(guò)程
這篇文章主要介紹了springboot遠(yuǎn)程debug調(diào)試全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05hibernate存取json數(shù)據(jù)的代碼分析
這篇文章主要介紹了hibernate存取json數(shù)據(jù)的代碼分析,需要的朋友可以參考下2017-09-09Springboot使用zxing實(shí)現(xiàn)二維碼生成和解析
ZXing支持各種條形碼,二維碼掃描,由多個(gè)模塊組成,?而且支持PC端,移動(dòng)端,本文將利用zxing實(shí)現(xiàn)二維碼生成和解析,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10