集合(一)
為了解決數(shù)組的定長(zhǎng)問題, JDK在1.2版本開發(fā)了集合框架,
集合和數(shù)組的相同點(diǎn)和不同點(diǎn)
集合是容器,存儲(chǔ)數(shù)據(jù)的,集合的長(zhǎng)度是可變的,集合容器只存儲(chǔ)引用數(shù)據(jù)類型
數(shù)組是容器,存儲(chǔ)數(shù)據(jù)的,數(shù)組的長(zhǎng)度是固定的,數(shù)組存儲(chǔ)基本類型和引用類型
數(shù)據(jù)多了存數(shù)組, 對(duì)象多了存集合
集合框架學(xué)習(xí)要素 :
1.向集合容器中存儲(chǔ)元素
2.取出集合容器中的元素
3.每種集合容器的自身特性
Collection集合接口
Collection 層次結(jié)構(gòu)中的根接口,所有的子接口和實(shí)現(xiàn)類都會(huì)具有他的功能
Collection接口的方法 :
添加:add (存儲(chǔ)元素)
移除:boolean remove(元素) 移除集合中指定的元素
??????? removeAll(Collection c) ) 移除兩個(gè)集合中相同元素
包含:boolean contains(元素) 判斷元素是否包含在集合中
集合長(zhǎng)度:集合.size()方法 :
??????????????? 數(shù)組.length 屬性 , 字符串.length() 方法,
清空:void clear() 只清空元素, 集合容器本身依然可以使用
判斷:boolean isEmpty() 判斷集合中是否有元素,無元素true
轉(zhuǎn)換為數(shù)組:Object[] toArray() 集合中的元素轉(zhuǎn)成數(shù)組*
取交集:retainAll(Collection c) 兩個(gè)集合取交集
Collections工具類
java.util.Collections 集合操作的工具類,提供方法來操作集合,方法全部是靜態(tài)方法,不能實(shí)例化
方法 :
static void shuffle(List list) 集合元素隨機(jī)排列
static void sort(List list) 集合中元素的自然順序排序
static void sort(List list,Comparator c) 按照比較器的順序進(jìn)行排序
static 傳遞什么返回什么 synchronized開頭(傳遞集合) 線程不安全集合,變成安全的集合
Comparator 是比較器接口, 需要自定義實(shí)現(xiàn)類,然后重寫方法
集合遍歷的兩個(gè)方法
1.迭代器 Iterator:迭代器是所有的Collection集合的通用遍歷方式.
?獲取迭代器接口Iterator的實(shí)現(xiàn)類對(duì)象 : ? Iterator<String> it = coll.iterator();
遍歷:? while ( it.hasNext() ) { String str = it.next();}
每個(gè)集合容器的內(nèi)部特性不一樣,迭代器是如何做到通用遍歷?
迭代器接口全是內(nèi)部類!迭代器接口實(shí)現(xiàn)類,都是集合的內(nèi)部類實(shí)現(xiàn), 可以完成遍歷的通用性
2.增強(qiáng)for循環(huán)
for(數(shù)據(jù)類型 變量名 : 集合或者數(shù)組) { 方法體 }
弊端 : 無索引,不能修改容器中的元素內(nèi)容
正式講解各個(gè)集合子類之前講一下常見的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu):
棧結(jié)構(gòu) :
內(nèi)存 : 進(jìn)口和出口是同一個(gè).
元素進(jìn)入到內(nèi)存后,必須到達(dá)內(nèi)存的底部.
數(shù)據(jù)先進(jìn)后出
隊(duì)列結(jié)構(gòu) :
內(nèi)存 : 既有入口,也有出口
過安檢, 在你前面的人,先過去
數(shù)據(jù)先進(jìn)去的先出來, 先進(jìn)先出
數(shù)組
數(shù)組也一種最基本的,使用頻率最高的數(shù)據(jù)結(jié)構(gòu).
數(shù)組的地址是連續(xù)的
弊端 : 定長(zhǎng). 需要添加或者是刪除元素,只能利用數(shù)組的復(fù)制方式來實(shí)現(xiàn)
數(shù)組在堆內(nèi)存存儲(chǔ), 堆內(nèi)存中數(shù)組的復(fù)制,非常消耗內(nèi)存資源
數(shù)組特點(diǎn) : 內(nèi)存地址是連續(xù), 數(shù)組的查詢速度快,索引
數(shù)組的增和刪的速度慢
鏈表
鏈表的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu) : 元素和元素之間保存地址的方式存儲(chǔ)
鏈表 : 采用一個(gè)元素,記錄下一個(gè)元素的內(nèi)存地址方式, 單向鏈表
鏈表 : 元素記錄下一個(gè)元素的內(nèi)存地址,同時(shí)也記錄前一個(gè)內(nèi)存地址, 雙向
鏈表特點(diǎn) : 內(nèi)存地址不是連續(xù), 找元素,一個(gè)一個(gè)去找, 查詢速度慢
增刪速度快
List接口
特點(diǎn)就不用多說了吧,三個(gè)
方法很多繼承自collection接口,在操作集合時(shí)可以根據(jù)index值操作
他也有子類,ArrayList和LinketList接口
ArrayList
底層是數(shù)組型結(jié)構(gòu)實(shí)現(xiàn),數(shù)組可復(fù)制,于是有點(diǎn)"可變"數(shù)組那個(gè)味了,線性不安全,有索引查詢速度快,但因?yàn)閺?fù)制數(shù)組增刪速度就慢了
LinketList是雙鏈表結(jié)構(gòu)型
由鏈表結(jié)構(gòu)特點(diǎn)可知,元素與元素之間儲(chǔ)存地址,內(nèi)存不是連續(xù)的,查詢慢,修改快
具有特有方法:(不用索引可以直接操作)
addfirst(元素).addlast(元素).增添
getfirst().getlast():取出值
removefirst()removelast():移除元素
push(元素)壓棧
元素? pop()彈棧