數據結構-數組Array進階攻略

數組是非常基礎的數據結構,本文準備從數組自身與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方法是編譯通不過的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章