爲何會有棧內存和堆內存之分呢?java
當一個方法執行時,每一個方法都會創建本身的內存棧,在這個方法內定義的變量將會逐個放入這塊棧內存裏,隨着方法的執行結束,這個方法的內存棧也將天然銷燬。所以,全部在方法中定義的局部變量都是放在棧內存中的;在程序中建立一個對象時,這個對象將被保存到運行時數據庫中,以便反覆利用(由於對象建立成本一般較大),這個·運行時的數據區就是堆內存。算法
堆內存中的對象不會隨方法的結束而銷燬,即便方法結束後,這個對象還可能被另外一個引用變量所引用(在參數傳遞時很常見),則這個對象依然不會被銷燬。只有當一個對象沒有任何引用變量引用它時,系統的垃圾回收器纔會在合適的時候回收它。數據庫
所以,爲了讓垃圾回收機制回收一個數組所佔空間,能夠將該數組變量賦爲null,也就切斷了數組引用變量和實際數組之間的引用關係,實際數組也就成了垃圾。編程
定義並初始化一個數組後,在內存中分配了兩個空間,一個用於存放數組的引用變量,另外一個用於存放數組自己。數組
Java沒有多維數組!!!工具
type [] [] arrName;性能
Java語言採用上面的語法格式來定義二維數組,但它的實質仍是一維數組,只是其數組元素也是引用,數組元素裏保存的引用指向一維數組。對象
接着對這個「二維數組」執行初始化,一樣能夠把這個數組當成一維數組來初始化,把這個「二維數組」當成一個一維數組,其元素的類型是type[]類型,則能夠採用以下語法進行初始化:排序
arrName = new type[length] [];索引
上面的初始化語法至關於初始了一個一維數組,這個一維數組的長度是length。一樣,由於這個一維數組的數組元素是引用類型的,因此係統爲每一個數組元素都分配初始值:null。
是否可讓灰色覆蓋的數組元素再指向另外一個數組?以此拓展爲多維數組?
不能(至少在這個程序中不能)!,由於Java是強類型語言,當定義a數組的數組元素是int[]類型,則a[]數組元素只能是int類型因此只能存儲int類型的變量。
Java 8加強的工具類:Arrays(java.util)
Search:
int binarySearch(type[] a, type key);使用二分法查詢key元素在a數組中出現的索引;數組不包含key元素值,則返回負數。調用該方法時要求數組元素已經按升序排列,才能獲得正確結果。
int binarySearch(type[] a, int fromIdex, int toIndex, type key);
Copy:
type[] copyOf(type[] original, int length);這個方法將會把original數組複製成一個新數組,其中length是新數組的長度。若是length小於original數組的長度,則新數組元素就是原數組的前面length個元素;若是length大於original數組的長度,則新數組的後面的元素補充0、false或者null。
type[] copyOfRange(type original, int from, int to);
Equals:
boolean equals(type[] a,type a2);a數組和a2數組長度相等,元素一一相同,則返回true。
Fill:
void fill(type[] a, type val);該方法會把a數組全部元素賦值爲val。
void fill(type[] a,int fromIndex, int toIndex, type val);
Sort:
void sort(type[] a);對a數組排序。
void sort(type[] a, int fromIndex, int toIndex);
String toString(type[] a);該方法將一個數組轉換成一個字符串。該方法按順序把多個數組元素連綴在一塊兒,多個數組元素使用英文逗號(,)和空格隔開。
此外,在System類裏也包含了一個static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)方法,該方法能夠將src數組裏元素賦給dest數組的元素,其中srcPos(destPos)指定從src(destPos)數組的第幾個元素開始賦值,length參數指定將src數組的多少個元素值付給dest數組元素。
Parallel:
parallelPrefix(xxx[] array, XxxBinaryOperator op);該方法使用op參數指定的計算公式計算獲得的結果做爲新元素。op計算公式包括left、right兩個形參,其中left表明中前一個索引處的元素,right表明數組中當前索引處的元素,當計算第一個新數組元素時,left默認值爲1。
void parallelPrefix(xxx[] array, int fromIndex, int toIndex, XxxBinaryOperator op);
void setAll(xxx[] array, IntToXxxFunction generator);該方法使用指定生成器(generator)爲全部數組元素設置值,該生成器控制數組值的生成算法。
void parallelsetAll(xxx[] array, IntToXxxFunction generator);
void parallelSort(xxx[] a);該方法的功能與Arrays類之前的sort相似,只是增長了並行能力,能夠利用多CPU並行提升性能。
void parallelSort(xxx[] a, int fromIndex, int toIndex);
Spliterator:
Spliterator.OfXxx spliterator(xxx[] array);將該數組全部元素轉換成Spliterator對象。
Spliterator.OfXxx spliterator(xxx[] array, int stratInclusive, int endExclusive);
XxxStream stream(xxx[] array);該方法將數組轉換成爲Stream(Java8新增的流式編程的API)。
XxxStream stream(xxx[] array, int stratInclusive, int endExclusive);