Java中集合框架層次結構:
Iterable接口:
Collection接口:
List接口:
Iterator接口:
ListIterator接口:
Collection接口:
List接口:
ArrayList類:
LinkedList類:
Vector類:
Stack
Set接口:
HashSet類:
TreeSet類:
Map接口:
HashMap類:
Hashtable類:
TreeMap類:
Collection和Map沒有關係,
Collection和Collections的區別是Collection是接口,Collections是類
數組:
數組也是容器,它是定長的,不會自動擴容;一塊連續的內存,訪問快;可以存儲基本數據類型和引用數據類型的對象
java.util.*;
集合:變長的,自動擴容,只能存儲引用數據類型的對象
數組或者鏈表
分類:
1)集:Set接口:元素無序且不重複,可以放null,但是隻能存放一個
無序:
元素存入順序和集合內存儲的順序不同,打印結果是按照存儲順序來打印
無重複:
兩個對象e1和e2,如果e1.equals(e2)返回true,則認爲e1和e2重複,在set中只保留一個(先判斷hashCode()方法再用equals()方法進行判斷)
1-1)HashSet:內部對象散列存取,採用哈希技術
線程不安全,不同步的,存取速度比較快,底層實現是用HashMap實現
1)初始容量:默認初始容量16
2)加載因子:默認0.75,
一般情況下,加載因子係數必須<=1,當元素個數超過容量長度*加載因子係數的時候,自動進行擴容
3)擴容增量:原容量的一倍
1-2)TreeSet:存入順序跟存儲順序不同,但存儲按照排序存儲
線程不安全,不同步的,此類保證排序後的set按照升序排列元素
2)列表:List接口:有序的,允許重複,可以放null,且可以放多個
ArrayList:
初始容量:默認初始容量10
加載因子:1???
擴容增量:原容量的0.5倍+1;
Vector:
初始容量:默認初始容量10
加載因子:1
擴容增量:原容量的1倍
ArrayList和LinkedList的區別:
1)ArrayList:線性順序存儲,是一種線性表
底層數據結構是數組,查詢比較快,插入/刪除比較慢
2)LinkedList:數據結構中鏈表的Java實現
底層數據結構是雙向鏈表,查詢用二分查找,所以查詢效率比ArrayList低,插入/刪除效率比ArrayList高
ArrayList和Vector的區別:底層的數據結構都是數組
1)ArrayList:
線程不安全的,不同步的,數據不安全,速度比較快
2)Vector:
線程安全的,同步的,數據安全,速度比較慢
3)字典:Map:鍵值對,鍵是唯一的
1)HashMap:數組+單向鏈表+紅黑樹
初始容量:默認16;
加載因子:默認0.75
擴容增量:原容量的1倍
2)Hashtable:數組+單向鏈表+紅黑樹(平衡二叉樹)
初始容量:默認11
加載因子:默認0.75
擴容增量:原容量的1倍+1
3)TreeMap:按照鍵升序排序,底層數據結構是紅黑樹
HashMap和Hashtable的區別:
1)HashMap:
a)線程不安全,不同步,數據不安全,但是效率高;
b)允許鍵值可以爲null;
2)Hashtable:
a)線程安全,加鎖同步,數據安全,效率比較低;
b)不允許鍵值爲null
HashMap和TreeMap的區別:
1)HashMap:
a):HashMap基於哈比表實現,所以裏面元素不進行排序
b):HashMap可以通過調優初始容量和負載因子,優化HashMap空間的使用
c)HashMap性能優於TreeMap
2)TreeMap:
a):TreeMap基於樹實現,所以裏面的元素按照鍵升序排列
b):TreeMap沒有調優選項,因爲該數總處於平衡狀態
Map中對元素進行修改:
Map中因爲鍵必須是唯一的,所以要對map中的元素進行修改時,重新添加一個元素,鍵與要修改的元素的鍵一致即可,去覆蓋掉原來的數據
如何選擇集合類:
1)Set內存放的元素不允許重複,List存放的元素有一定的順序
2)Map的應用主要在利用鍵/值對進行快速查詢
3)ArrayList和LinkedList的區別在於隨機查詢性能上ArrayList要好,但LinkedList的中間元素的插入與刪除性能好
4)HashSet和TreeSet的區別在於集合內元素是否排序
注意點:
集合中的add()方法接受的是一個Object對象的參數,在獲取集合中的對象時,必須進行造型(強制類型轉換)操作
Iterator接口:單向遍歷,ListInterator:雙向遍歷
1)Iterator對象稱作迭代器,用來方便的實現對容器內的元素進行遍歷操作
2)所有實現了Collection接口的集合類都有一個iterator()方法,返回一個實現了Iterator接口的對象
3)Iterator對象實現了統一的一個用來遍歷Collection中對象的方法
4)Iterator是爲遍歷而設計,能夠從集合中取出元素和刪除元素,但是沒有添加元素的功能
5)Iterator的功能上比較簡單,
5)使用中,只能單向移動
Collections類:
Comparable:java.lang.*;
Comparator:java.util.*;
常用方法:
Object max(collection c):
返回集合中的最大元素,需要考慮比較接口的實現
Object min(Collection c):
返回集合中的最小元素
void reverse(Collection c):
把集合中的元素順序反轉
void copy(List dest,List src):
src集合中元素複製到dest集合,dest集合中的元素數量要比src集合中的多,否則報錯
void fill(List list,Object o):
填充list集合,填充元素爲o
int binarySearch(List list,Object key):
對排序後的集合list進行查詢元素操作
void sort(List list):
對一種List做排序
泛型:參數化的數據類型:數據類型可以像參數傳遞一樣進行傳遞
1)安全的
2)減少了數據類型轉換所帶來的風險,減少了裝箱拆箱
分類:
1)泛型方法:
[訪問修飾符] <T>返回值 方法名([參數列表]){方法體}
2)泛型類:增加泛型類無意中增加了繼承的複雜性
類中的成員的數據類型不確定時,可以做成泛型類
聲明:
[訪問修飾符] class 類名<T>{類的成員}
使用:
類名<T> 引用名 = new 類名<T>();
3)泛型接口:
[訪問修飾符] interface 接口名<T>{接口的成員}
類型T 元素E 鍵K 值V
T:包括Object在內的所有的類型都可以
<T extends Number>:表示把T限定在Number及其子類的類的類型
extends後面只能是一個類
<T extends Number&Comparable&...>
限定在Number類並且實現了Comparable接口的數據類型,接口可以連接多個
通配符:?
上界通配符: ? extends A : A類或者A類的子類
下界通配符: ? super A : A類或者A類的父類
數組:length 字符串:length() 集合:size()
isEmpty():判斷的是集合的長度是否爲0,即集合中是否中存在元素,而不是判斷集合是否爲null
//擴充0次,指定了初始容量直接開闢相應的空間
ArrayList list = new ArrayList(20);
ArrayList進行自動擴容時,是找一個新的內存,把原來的數據拷貝過來,然後加上新的數據,造成內存浪費,所以在明確要存儲多少個元素時,要指定長度,避免擴容