圖學java基礎篇之集合工具
java基礎復習鞏固。由于是總結,并不會細講知識點,每篇都會放出該部分知識結構圖,之后有必要的話進行一些文字說明。
兩個工具類
java.utils下又兩個集合相關(準確來說其中一個是數組的)的工具類:Arrays和Collections,其中提供了很多針對集合的操作,其中涵蓋了一下幾個方面:
- 拷貝、填充、反轉等常用的基本操作
- 排序、查找等算法相關處理
- 安全性相關處理
- 類型轉換 </ul>
- DualPivotQuicksort
- 所有數值基本類型均用此排序,JDK7中新增
- 雙基準快速排,改進的多路快排算法 </ul> </li>
- ComparableTimSort
- 默認引用類型均用此排序,JDK7中新增
- 基于TimSort,該算法是優化版本的歸并排序,混合使用了歸并和插入排序 </ul> </li>
- LegacyMergeSort
- 老版本中的排序算法,JDK7中為兼容仍保留,若想使用可通過-Djava.util.Arrays.useLegacyMergeSort=true
- 優化的歸并排序,但是性能較TimSort差 </ul> </li> </ul>
asList需注意的點
asList是我們經常使用的一個方法,可以將一組值直接轉成list,但是看下如下代碼:
int[] arr = new int[3]{1,2,3}; List list = Arrays.asList(arr);
相信大部分同學初看起來沒什么問題吧(反正我一直沒覺得有問題),把數組轉成list,然后結果打印list,你會發現其中只有一個元素,這個元素就是arr指向的數組。 所以該方法并不能把數組轉為list,list的構造函數本身就支持數組,沒必要在提供方法
還要注意的一個點是asList返回了一個ArrayList對象,這個對象并不是我們常用的java.utils下的那個,而是Arrays的一個內部類,它是只讀的,因此我們要想獲得一個不殘疾的list,要這樣寫:List list = new ArrayListArrays.asList(1,2,3);
hashCode
這個倒沒啥好說的,這里直接貼代碼吧,主要看下集合的hashCode是怎么計算的。
public static int hashCode(Object[] var0) { if(var0 == null) { return 0; } else { int var1 = 1; Object[] var2 = var0; int var3 = var0.length; for(int var4 = 0; var4 < var3; ++var4) { Object var5 = var2[var4]; var1 = 31 * var1 + (var5 == null?0:var5.hashCode()); } return var1; } }
deepXXX
就如同拷貝分為深拷貝和淺拷貝一樣,由于集合可能是多層的,集合內的元素可能還是一個集合,因此對于集合的很多操作默認是只處理一層,如 hashCode、equals、toString,這樣對于多層的處理就不是我們期望的結果了。因此Arrays還提供了deepXXX的方法,其會遞 歸的逐層處理。
Collections
unmodifiableXXXX、synchronizedXXX、checkedXXXX
這三個方法功能各不相同,unmodifiableXXXX返回一個不可修改的副本,synchronizedXXX范圍一個線程安全的副 本,checkedXXXX返回的副本會對添加操作進行類型檢查(這里說副本并不準確,其實操作的還是原對象),這里之所以要放在一起說,因為他們有很多 共同之處:
- 均使用包裝模式實現,將傳入對象作為私有屬性,然后通過對其操作進行包裝實現對應功能
- 操作的都是原對象,原對象的修改也會體現在包裝的對象上
- 都支持list、set、map </ul>
(原圖和相關xmind文件見:github)
來自:http://my.oschina.net/goodtemper/blog/524298
下邊直接用兩個圖來說明(其中三言兩語說不清的會標紅,并在后邊打上標記,在圖后有對應說明):
Arrays
sort中的多種排序算法
印象中JDK很多地方都是快排和歸并,這里也不例外,不過這里用的都是優化的算法,并且根據排序元素類型策略不同:
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!