1.集合的概念:
Java集合類存放於 java.util 包中,是一個用來存放對象的容器。集合的長度不定,數組在定義的時候長度便已經固定。
注意:①、集合只能存放對象。比如你存一個 int 型數據 1放入集合中,其實它是自動轉換成 Integer 類後存入的,Java中每一種基本類型都有對應的引用類型。
②、集合存放的是多個對象的引用,對象本身還是放在堆內存中。
③、集合可以存放不同類型,不限數量的數據類型。
Java 集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。Collection 接口又有 3 種子類型,List、Set 和 Queue,再下面是一些抽象類,最後是具體實現類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
Collection:
list:有序可重複,包括 Arraylist、Linkedlist、Vector、Stack,有公用的方法包括add、remove、size、 contains
Set:無序不可重複,包括 Hashset、Treeset
Map<K,V> :
Map 存儲一組鍵值對象,提供key(鍵)到value(值)的映射,包括 Hashmap、Hashtable
Collections:
collections是java提供的一個集合工具類,提供排序、遍歷等方法
2.arraylist的使用
arraylist有序可重複,可包含多個null元素,默認容量爲10,可自動擴容縮容,每次默認自增50%。arraylist遍歷和隨機訪問方便,具有3個構造方法,分別是1.默認構造方法 2.參數爲集合的構造方法 3.指定長度的構造方法。
arraylist常用方法:
- add(index,object)在指定位置放入元素
- get(index)根據下標獲取元素
- clear()清空集合、
- add(list)將集合放入集合是集合的拷貝而不是放引用
- remove之後立即縮容 容易出現數組下標越界
注意:遍歷過程中不允許刪除元素除非使用迭代器
3.linkedlist的使用
linklist是鏈表式存儲,無序不重複,插入、刪除時效率較高,主要方法包括Addfirst 、addlast、getfirst、getlast,上轉型之後只能調用轉型後對象的方法
4. Vector的使用
vector有索引,能夠自動擴容縮容,擴容默認增長一倍,
與arraylist的區別:
實現原理相同,都是基於動態數組,很多情況下可互用
Arraylist:線程非安全的,重速度輕安全
Vector:線程安全
5.集合的遍歷方式和泛型的使用
泛型:指定該集合只能存放某種類型的元素
list的遍歷通過迭代器實現,通過list.Iterator()得到迭代器對象
Iterator it = list.Iterator();
While(it.hasnext){
Student stu = (Student)it.next();
}
注意:
- 在迭代的過程當中,索引會被自動維護,即如果當前對象被刪除則迭代器後退
- 不能在next()之前iterator.Remove()
- 不能在迭代器遍歷過程中調用集合的remove()
6.迭代器模式:
- 迭代器模式提供一種方法順序訪問一個聚合對象的各個元素而又不暴露該對象的內部結構。
- 通過Collection接口的iterator()方法 返回一個迭代器
- 實現了collection接口的所有集合都可以有一個指向自己的迭代器
- 所有實現了collection的集合都可以使用迭代器進行遍歷
- 不同集合有不同iterator實現類
7.stack的使用
規則:先進後出 後進先出
Push壓入 pop出 peek得到棧頂對象但不移除它
8.Hashset的使用
hashset是collection接口的完全實現,hashset無序不重複。
關於如何定義元素是否重複:
- 基本類型數據:值相同
- 引用類型數據:比較堆地址
- Hashcode equals tostring重寫
Hashset在比較對象時會使用hashcode和equels方法
先比較hashcode再equels
- equels相等時,hashcode一定相等
- equels不等時,hashcode可能相等
- hashcode不等,equels一定不等
- hashcode相等,equels可能不等
重寫equels時一定要重寫hashcode 否則會違背上面4大原則
9.treeset的使用
有序不重複 ,使用元素的自然順序 ,結構是基於紅黑樹
10.元素的比較
元素的比較通過實現comparable接口並重寫compareTo方法來實現 即 implement comparable<Emp>
Treeset在做add存放元素時就要開始比較了
comparable<Emp>表示只能比較Emp類型的對象
實現comparator接口 重寫compare方法
Set<Emp> set = new TreeSet<Emp>(new MyCpmpare)//將一把稱交給集合
Comparable接口:元素自身具備比較的特性
Comparator接口:集合自身具備比較的特性
11.Hashmap的使用
常用方法:
放put 鍵不允許重複,如果重複,後面的會把前面的覆蓋
得到get(key)
得到長度size()
得到鍵的集合map.keySet() 得到值的集合collection<> c = map.values()
entrySet()返回一個set集合 裏面放entry對象 相當於將key和value放到一個對象裏面
entry代表map中的映射關係 entry提供getKey和getValue方法
hashmap、treemap、hashtable的比較:
hashmap 哈希表 非線程安全 key允許null
treemap 紅黑樹 線程安全
hashtable 哈希表 非線程安全 key不允許null
12.集合的比較
數據結構
Arraylist 動態數組(遍歷)
Linklist 鏈表(增、刪)
Vector 動態數組 同步的 線程安全
Collections.binarySearch(要查找的集合,要查找的元素)
Arrays.asList(數組);將數組轉換爲一個List集合
System.currentTimeMillis得到系統時間
Arraylist:新容量=(舊容量*3)/2+1
Vector 翻倍增長
Hashmap 不同步,線程不安全
Hashtable 同步,線程安全,繼承於dictionary
Hashmap
Hashset 基於hashmap實現 基於hashmap的鍵
13.集合工具類
Collections常用方法:
binarysearch二分查找默認 調用之前必須進行升序排序
Sort排序
Min/max
Reverse反轉
Replaceall替換 Copy
aslist 將數組轉換爲列表
對於基本數據類型數組,整個數組轉換成一個元素
對象數組中的元素轉換成集合中的元素
14.泛型類
可以代表多種類型 泛型的本質是參數化類型
Class 類名<T> T在類中可以使用作爲類型來用
真正使用類的對象的時候,可以給T賦值
類中T所出現的地方都變成了賦值的類型
15.泛型方法
使用了泛型的方法:在泛型類中的方法
Public <T> T test(T t){return t } 使用時值和類型一併賦值
16.泛型接口
接口繼承多參數泛型
1.默認objec
2.實現接口時就確定類型是什麼
3.使用時才確定 class 類名 <T> implements inter<T>{ }
多參數泛型類
例如:class Myclass<T,K>{ }
17.泛型限定
T type, K key, V value, E element, ? 不確定的Java類型
限定:泛型能夠代表的類型被限定
默認可以接受泛型類型的子類
現在泛型的上限是fruit,所以現在泛型所等代表的只能是fruit類及其子類
集合中泛型限定的使用 集合中不能使用泛型上限
集合中泛型下限的使用
?extends T:上限:類型是T及其子類
?super T:下限:類型是T及其父類