由快速排序引發對Java方法參數的思考
一直認為Java的方法參數都是傳遞值,調用後對本身不影響。
Java不存在C/C++中的指針,在快速排序中,傳入的數組,卻發生了值的改變。由此引發的思考:
//為方便舉例,以下為部分快速排序偽代碼
傳入的數組,在遞歸中,數組值被操作。
void quickSort(int s[], int l, int r){ if (l < r){ quickSort(s, l, i - 1); quickSort(s, i + 1, r); } }
結論:Java方法參數中傳遞的是值,在參數是引用類型(如數組),傳入的是數組的記憶體地址的值,可以對其進行操作。
原理:
Java中的機制如下:
(---Java核心技術·捲1 中的解釋)
基本數據類型(byte、int、char、long、float、double、boolean和short)
引用類型(reference type)指向一個對象,不是原始值,指向對象的變數是引用變數。
(類似C/C++中的指針,以特殊的方式指向對象實體(具體的值),存儲一個記憶體地址)
註意:String 、數組 、 介面 、 類都是引用類型。
數組的討論:
int[] a=new int[3]; double[] b=new double[3];
String[] s=new String[3]; example[] e=new example[3];
無論哪種類型的數組(),數組標識符(a,b,s,e)其實只是一個引用,指向在堆中創建的一個真實對象。
對象數組(s, e)和基本類型數組(a, b)在使用上是相同的,唯一的區別(數組中保存的值)是對象數組保存的是引用,基本類型數組直接保存基本類型的值。
(參考 Java編程思想 16.2節 數組為什麼特殊)
Java中的引用,相當於一個受限指針,在new創建對象時,獲得一個引用。
如 String ex=new String(“example”);
故,在快速排序的遞歸操作中,傳入了數組的地址值,在每次遞歸中,對數組進行操作,會實際改變數組的值。
//才疏學淺,不當之處,望不吝指正。
參考: <Java核心技術·捲1> 章節4.2 方法參數
進階閱讀:<Java編程思想> 第16章 數組為什麼特殊