數組是非常基礎的數據結構,本文準備從數組自身與java的Arrays工具類來分析數組:
(Queue系列第二篇難產了,發現要寫清楚得再複習複習併發的知識,所以先寫簡單的)
文章目錄
數組基本概念與特性
數組特點
1:長度固定
2:數組是相同數據類型的有序集合
3:數組也是對象(屬於引用類型)
可以看見,特點1是對數組使用的一個致命性打擊,在大多數編程的情況下,我們需要一個
可伸縮的容器而不是一個定長的容器。那麼數組還有使用的必要麼?答案是肯定的,
時光回到java遠古時代,當時並沒有泛型的說法,數組成了唯一可以控制元素類型的容器。這是數組的第一個優勢。
而在當時,也僅有數組可以持有基本類型,這是數組的第二個優勢。
第三個優勢則是效率,數組是一種效率最高的存儲和隨機訪問對象引用序列的方式《Thinking in java,p433》
當然,到了現在數組也僅有第三點優勢存在了,
泛型的出現使得其他容器也可以持有基本類型(通過自動打包),也可以用泛型約束元素類型。
初始化數組:
1.靜態初始化
簡化格式:
數據類型[] 數組名稱 = {值, 值, …};
int[] arr={1,2,3,6};
完整格式(推薦):
數據類型[] 數組名稱 = new 數據類型[]{值, 值, …};
int[] arr=new int[]{1,2,3,4,5,6,7,22};
2.動態初始化
數組定義與爲數組元素分配空間並賦值的操作分開進行
int[] a1=new int[2];//動態初始化元素,先分配空間
a1[0]=1;//給數組元素賦值
數組內存分配圖:
數組的素敵:泛型
仔細看過前面的讀者肯定知道,數組就是被泛型害的喪失了三個優勢中的兩個,不光如此,
通常,數組與泛型並不能很好的結合,你不能實例化具有參數化類型的數組。
Peel<Banana>[] peels = new Peel<Banana>[10];//Error!
如果你真的需要運用泛型數組,那麼有個奇怪的技巧可以解決問題:
T[] array;
array = new T[10]//這會報錯
array = (T[])new Object[10];//OK
實用的Arrays工具類與System.arraycopy();
System.arraycopy
在說Arrays工具類之前,先說說System.arraycopy方法
此方法只需關注三點
1:效率高,比傳統for循環挨個賦值,不知道高到哪裏去了
2:此爲淺拷貝,只拷貝了引用,新數組與老數組引用對象的內存地址都是一樣的
3:兩個數組的類型要求完全一樣,不支持自動裝箱!
public static void (Object src,int srcPos,Object dest,int destPos, int length)
src:源數組; srcPos:源數組要複製的起始位置;
dest:目的數組; destPos:目的數組放置的起始位置; length:複製的長度。
Arrays工具類
Arrays工具類是JAVA專門用於支持數組操作的工具類,下面介紹幾個比較常用的方法:
1、Arrays.asList(T… data)
注意:該方法返回的是Arrays內部靜態類ArrayList,而不是我們平常使用的ArrayList,,該靜態類ArrayList沒有覆蓋父類的add, remove等方法,所以如果直接調用,會報UnsupportedOperationException異常
2、Arrays.fill()
Arrays.fill(Object[] array, Object obj)
用指定元素填充整個數組(會替換掉數組中原來的元素)
Arrays.fill(Object[] array, int fromIndex, int toIndex, Object obj)
用指定元素填充數組,從起始位置到結束位置,取頭不取尾(會替換掉數組中原來的元素)
3、Arrays.sort()
Arrays.sort(Object[] array)
對數組元素進行排序(串行排序)
Arrays.sort(T[] array, Comparator<? super T> comparator)
使用自定義比較器,對數組元素進行排序(串行排序)
4、Arrays.parallelSort()
注意:其餘重載方法與 sort() 相同
Arrays.parallelSort(T[] array)
對數組元素進行排序(並行排序),當數據規模較大時,會有更好的性能
5、Arrays.binarySearch()
注意:在調用該方法之前,必須先調用sort()方法進行排序,如果數組沒有排序,
那麼結果是不確定的,此外如果數組中包含多個指定元素,則無法保證將找到哪個元素
6、Arrays.equals(Object[] array1, Object[] array2)
判斷兩個數組是否相等,實際上比較的是兩個數組的哈希值,
即 Arrays.hashCode(data1) == Arrays.hashCode(data2)
彩蛋:arraycopy,clone,copyof都是淺拷貝,那麼如何實現對象的深度拷貝呢?
答:
實現Cloneable接口,並重寫clone方法,注意一個類不實現這個接口,直接使用clone方法是編譯通不過的