1. 程式人生 > 實用技巧 >Java基礎(1)---陣列

Java基礎(1)---陣列

1. 概念

陣列是有序的元素序列,相同型別的有限的元素的集合。陣列的元素儲存在一個連續性的記憶體空間中,並通過索引訪問。

一些零散的知識點:

  1)HashMap底層採用陣列+樹/連結串列結構,是通過元素hashcode的值和陣列大小去計算陣列下標,然後將元素放到相對應的陣列元素裡面(連結串列/樹)。通過索引查詢陣列的時間複雜度為O(1)。

  2)針對陣列,JDK1.8提供了一些並行方法,比如parallelXX;還提供了Spliterator(可分割迭代器)

3.使用範例

    public static void main(String[] args){
Integer[] a = new Integer[5];//建立陣列
a[0] = 1; a[1] = 2;a[2] = 6;a[3] = 4;a[4] = 7;//設定
// a[7] = 1;//陣列越界,執行時異常
System.out.println("a陣列列印:" + Arrays.toString(a));
Arrays.parallelPrefix(a, (pre, local) -> pre + local);//當前的元素與前一個元素(有計算過後,那麼取計算過後的值)進行操作
System.out.println("a陣列,parallelPrefix操作結果:" + Arrays.toString(a));
Arrays.sort(a);//null物件會導致排序異常
Arrays.parallelSort(a);//並行排序,支援大資料量,具體看原始碼分析
System.out.println("a陣列parallelSort:" + Arrays.toString(a));
int i = Arrays.binarySearch(a, 9);//有序陣列的二分法查詢,返回陣列下標
System.out.println("a陣列二分法查詢9,返回值:" + i);
int[] c = new int[10];
Arrays.fill(c, 11);//填充所有陣列元素,值為11
System.out.println("c陣列 fill:" + Arrays.toString(c));
List<Integer> list = Arrays.stream(a)//陣列支援流操作
.distinct()
.collect(Collectors.toList());//去重
System.out.println("a陣列stream操作去重轉list:" + list.toString());
Integer[] b = Arrays.copyOf(a,8);//陣列無法進行擴容,只能通過建立新的陣列,將舊的陣列複製到新的陣列中
b[6] = 10;b[7] = 9;
System.out.println("陣列擴容,生成新陣列b:" + Arrays.toString(b));
Arrays.setAll(a, x -> x * 10);//函數語言程式設計,對每個元素做賦值操作
System.out.println("a陣列setAll:" + Arrays.toString(a));
Spliterator<Integer> spliteraror1 = Arrays.spliterator(a);//平行迭代器
Spliterator<Integer> spliteraror2 = spliteraror1.trySplit();//平行迭代器,將迭代器再切割
spliteraror1.forEachRemaining( item -> System.out.println("a陣列spliteraror1:" + item));
spliteraror2.forEachRemaining(item -> System.out.println("a陣列spliteraror2:" + item));
}

4.原始碼分析,針對parallelSort方法

   //排序演算法是一種並行排序合併,它將陣列分解為子陣列,這些子陣列本身被排序,然後再進行合併。當子陣列長度達到最小粒度時,使用適當的方法對子陣列進行排序。
  //如果指定陣列的長度小於最小粒度,則使用適當的方法對其排序。該演算法需要一個不大於原始陣列大小的工作空間。用於執行任何並行任務。
//遞迴呼叫方法,分解陣列到最小粒度,再進行排序。然後將結果從下往上合併排序。
//雖然是這麼理解,不過還是不懂演算法具體實現~~ 詳見ArraysParallelSortHelpers
  public static void parallelSort(int[] a) { int n = a.length, p, g; if (n <= MIN_ARRAY_SORT_GRAN || (p = ForkJoinPool.getCommonPoolParallelism()) == 1)//如果單核或者陣列長度小於2的13次數或者是單核處理器,則採用雙樞軸快速排序演算法 DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0); else//否則採用平行排序演算法 new ArraysParallelSortHelpers.FJInt.Sorter (null, a, new int[n], 0, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ? MIN_ARRAY_SORT_GRAN : g).invoke(); }