集合類
集合就是一個只能用以存儲對象的容器
特點:
1, 只能存儲對象
2, 長度可變的容器
集合和數組的區別:
1, 集合長度可變,數組長度不可變
2, 數組可以用於存儲基本數據類型和對象,集合只能存儲對象。
集合有多種體現,是因爲每一個容器的內部數據結構不同(存儲數據的方式)導致的。
Collection:
集合的最頂層容器。
增刪改查
1, 添加
boolean add(Object):添加一個元素
boolean addAll(Collection):添加一個指定容器中的所有元素
2, 刪除
void clear() :清空容器
boolean remove(Object) :刪除指定元素
booleanremoveAll(Collection):刪除與指定容器中相等的元素
3, 判斷
boolean IsEmpty():判斷容器是否爲空。
boolean contains(Object):是否包含指定元素
booleancontainsAll(Collection):是否包含指定容器中的所有內容
4, 獲取
Int size():獲取容器中元素的個數。
Iteratoriterator():得到一個迭代器
booleanretainAll(Collection):保留交集
5, 將集合變成數組
Object[] toArray():返回容器中所有元素的數組
只有List可以對元素進行增刪改查。
集合細節:
1, 創建容器其實就是在堆內存中定義了一個可以存儲對象的對象
集合中存儲的是對象的地址值(引用)
2, add方法什麼類型都可以接收。
原因:因爲add方法的參數類型是Object,所有的元素在存儲時都被自動提升
爲了Object類。取出對象時,取出類型是Object。
3,對於remove contains方法。
其實內部都是用到了一個對對象進行判斷相等的方法equals。
4,coll.add(4):可以不可以?
在jdk1.4 版本,不可以,必須寫成coll.add(new Integer(4));
在jdk1.5版本,可以,因爲有自動裝箱。
Collection:
|--List:有序(存入的順序和取出的順序一致),元素都有索引,元素可以重複。
|--Set:元素不可以重複,無序(存入的順序和取出的順序不一定一致)。
瞭解一下List子接口的常見特有方法:
因爲List集合是由索引的,所以它的特有的方法都是圍繞索引定義的。
1,添加
add(index,element):在指定位置插入元素。
addAll(index,colletion):在指定位置插入一堆元素。
2,獲取
Objectget(index):根據索引獲取元素。
intindexOf(object):獲取指定元素的索引。
intlastIndexOf(Object)
ListsubList(startIndex,endIndex);
3,刪除
remove(index):根據索引刪除元素。
4,修改
set(index,element):修改指定位置上的元素,用指定的元素進行替換。
這就是傳說中的增刪改查(c-create,u-update,r-read,d-delete).
記住:只有list可以對元素進行增刪改查。
List:常見的子類對象。
|--Vector:內部是數組數據結構。
而且是一個可變長度的數組(無非就是新建數組並將原數組元素複製到新數組中)
jdk1.0版本就存在了,jdk1.2版本才加入了java集合框架中。
是同步。因爲效率很低,所以很少用。
該集合支持枚舉接口Enumeration,但是被Iterator替代。
|--ArrayList:內部也是數組數據結構,是不同步的。替代了Vector.查詢元素的速度很快。
|--LinkedList:內部是鏈表數據結構,是不同步的。該數據結構的特點:對元素的增刪速度很快。
LinkedList:
addFirst();
addLast();
jdk1.6時,
offerFirst()
offerLast();
獲取元素,但不刪除。集合長度不改變。如果集合中沒有元素會出現NoSuchElementException
getFirst():
getLast();
jdk1.6時,獲取元素,但不刪除。集合長度不改變。如果集合中沒有元素會返回null。
peekFirst()
peekLast();
獲取元素,但是會將該元素刪除,集合長度改變。如果集合中沒有元素會出現NoSuchElementException
removeLast();
removeFirst();
jdk1.6時,獲取元素,但是會將該元素刪除,集合長度改變。如果集合中沒有元素會返回null。
pollFirst()
pollLast();
介紹兩個常見的簡單數據結構:
堆棧:先進後出。firstin last out FILO
隊列:先進先出。firstin first out FIFO
面試:請使用LinkedList模擬一個堆棧或者隊列。
對於ArrayList判斷元素是否相同,依據的是元素的equals方法。
對於contains,或者remove內部都是使用equals來判斷是否有相同的元素。
所以存儲自定義元素時,必須覆蓋equals方法,建立自定義元素的比較相同的方式,通常都依據自定義元素的屬性。
迭代器:
是一種取出元素的方式。
迭代器的基本使用:
Iterator接口:
iterator():返回一個Iterator接口類型的對象。
NoSuchElementException(常見的異常)
hasNext():對於迭代器取出元素,先要進行判斷是否有元素,有就取。
如果元素很多,會判斷多次並取出多次。
while和for循環的比較:
for好些:迭代器變量在元素取完以後就釋放了。
循環中不要寫多個next()方法
迭代器的基本原理:
數據結構不同,取出元素方式不同。
爲了方便於對每一個容器進行取出的操作,對容器進行共性的抽取。
每一個去出方式都包含:
hasNext()
{
code
}
next()
{
}
好處:降低了數據結構的耦合性。
List集合取出元素有兩種方式:1,迭代;2,遍歷
listIterator:列表迭代器
ConcurrentModification:併發修改,不允許時發生的異常。
在迭代中操作集合中的元素:引用迭代器中的方法。
Iterator中的方法較少,只能判斷、獲取、刪除
List中的listIterator方法,具備更多的操作。可以增刪改查。因爲list集合具備索引的屬性。
侷限性:只能用在List派系中。
該方法返回ListIterator列表迭代器。