容器,就是能夠容納其餘Java對象的對象。Java Collections Framework(JCF)爲Java開發者提供了通用的容器html
java集合主要劃分爲四個部分:java
Collection(List列表、Set集合)、Map映射、迭代器(Iterator、Enumeration)、工具類(Arrays、Collections)程序員
數組的優點:是一種簡單的線性序列,能夠快速地訪問數組元素,效率高。若是從效率和類型檢查的角度講,數組是最好的。
數組的劣勢:不靈活。容量須要事先定義好,不能隨着需求的變化而擴容。
因爲數組的這些劣勢,咱們須要一種更強大、更靈活、容量隨時可擴大的集合(Collection)來存儲對象。(擴容)面試
Java容器裏只能放對象,對於基本類型(int, long, float, double等),須要將其包裝成對象類型後(Integer, Long, Float, Double等)才能放到容器裏。不少時候拆包裝和解包裝可以自動完成。這雖然會致使額外的性能和空間開銷,但簡化了設計和編程。算法
全部容器的內部存放的都是Object對象,泛型機制(語法糖,編譯器)只是簡化了編程,由編譯器自動幫咱們完成了強制類型轉換而已。JDK 1.4以及以前版本不支持泛型,類型轉換須要程序員顯式完成。編程
ArrayList<String> list = new ArrayList<String>();//泛型,參數化類型數組
泛型的通配符(?):安全
上限限定:public void getFunc(List<? extends Animal> an),
那麼表示這裏的參數能夠傳入Animal,或者 Animal的子類框架
下限限定: public void getFunc(Set<? super Animal> an ),
那麼表示這裏的參數能夠傳入Animal,或者Animal的父類工具
使用泛型的注意點:
一、泛型不支持基本數據類型
二、泛型不支持繼承,必須保持先後一致(好比這樣是錯誤的:List<Object> list = new ArrayList<String>();
因爲Java裏對象都在堆上,且對象只能經過引用訪問,容器裏放的實際上是對象的引用而不是對象自己
是Collection的子接口,裏面的內容容許重複。
List的特色:線性。即:有序。元素放入的順序和元素的存儲順序保持一致。
表象上:List最大的特色就是有下標。
ArrayList: 就是做爲一個數組的封裝出現的,底層就是數組。
LinkedList:底層封裝的是一個雙向鏈表。
一、查找、修改用的多的時候用ArrayList。
二、增長、刪除用的多的時候(特別是往中間增長、刪除)用LinkedList。
三、線程安全,數據量大的時候考慮用vector。
泛型<>:用來控制集合只能操做某一種數據類型。
遍歷:一、普通for循環遍歷。
二、使用迭代器Iterator完成遍歷。——沒有下標從頭至尾走一遍,不能操做數組。
三、for-each循環語句,底層封裝的就是迭代器,語法簡單,還能夠操做數組。推薦使用。
是collection的子接口,裏面的內容不容許重複。
特色:不能放置重複元素,無序存放元素。
表象上:Set沒有下標。
HashSet判斷兩元素不重複:一、調用equals方法比較兩對象
二、兩元素的hashcode值保持一致
只有這兩個條件同時知足,java才認爲是同一對象。
全部重寫了equals方法通常要重寫hashcode方法,讓equals返回true的時候,hashcode返回的值應該同樣。
hashSet只有增、刪、求長度和遍歷等操做。
遍歷:一、迭代器
二、for-each
是存放一對值的最大接口,全部的元素都以鍵和值的方式存儲。
特色:鍵值對——鍵要求惟一,值能夠重複
經常使用子類:HashMap、Properties(專用於操做屬性文件)
HashMap
經常使用操做:增、刪、改、查、容、遍歷
遍歷的時候:不能同時遍歷全部的鍵和值,只能單獨遍歷鍵與值。
鍵在遍歷的時候用Set類型來接。
值在遍歷的時候用Collection來接。
hashMap與hashTable比較:一、hashMap非線性安全,hashTable是線性安全的。
二、hashMap容許null來作鍵/值,hashTable不容許。
Properties
經常使用操做:增、刪、查、改、容、存、取。
存的時候,調用的是.store方法存文件,
取的時候,調用.load方法取文件。
文件類型:.properties——固定格式的文本文件,將是工做中使用率第二的配置文件。
Map.Entry
Map.Entry的內部接口,每一個
Map.Entry對象都保存着一對key——value的內容,每一個map接口中都保存有多個Map.Entry接口實例。
集合的輸出接口,從前到後輸出指定集合中的內容。不能遍歷Map,只用來遍歷Collection。
ListIterator
是Iterator的子接口,能夠進行雙向輸出。專門用來便利List.
Enumeration
是最先的輸出接口,用於輸出指定集合中的內容。
集合操做的算法類
包括排序、求最大、最小、反轉、隨機混排等操做
排序的時候,由於是對對象排序,因此應按必定的業務邏輯的天然順序排序。
comparable接口:內部比較器
可對任意數組排序,java泛型技術,二叉樹排序原理
一、類實現comparable接口
二、重寫compareTo方法
compareTo方法返回的是int類型數據:1表示大於,-1表示小於,0表示相等。
comparator接口:外部比較器
補救的作法
此接口同樣須要重寫方法,但方法接收兩個對象,返回值依然是一、-一、0;
SortedSet
單值的排序接口,實現此接口的集合類,裏面的內容可使用比較器排序。
SortedMap
存放一對值的排序接口,裏面內容按照key排序,使用比較器排序。
隊列接口,此接口的子類能夠實現隊列操做。
抄錄網址