java集合总结_java集合小总结
java集合就是一個(gè)容器。
1.???? 集合概述
l???????為了保存不確定的數(shù)據(jù),或者對(duì)象,以及保存具有映射關(guān)系的數(shù)據(jù)。
l???????所有的集合類(lèi)都位于java.util包下。
1.1.?什么是集合,有什么特點(diǎn)?
面向?qū)ο笳Z(yǔ)言對(duì)事物的體現(xiàn)都是以對(duì)象的形式存在,所以為了方便對(duì)多個(gè)對(duì)象的操作,就對(duì)對(duì)象進(jìn)行存儲(chǔ),集合就是存儲(chǔ)對(duì)象最常用的一種方式。
集合只用于存儲(chǔ)對(duì)象,集合長(zhǎng)度是可變的,集合可以存儲(chǔ)不同類(lèi)型的對(duì)象。
1.2.?集合與數(shù)組的區(qū)別(集合特點(diǎn))
首先我們要知道集合與數(shù)組是不同:
其中集合是可變長(zhǎng)度的,集合中用size();
而數(shù)組是固定長(zhǎng)度的,數(shù)組中是用length();
集合是用來(lái)放對(duì)象的,數(shù)組可以存儲(chǔ)基本數(shù)據(jù)也可以存儲(chǔ)引用數(shù)據(jù)類(lèi)型;
有一點(diǎn)需要注意下,如果集合存放基本數(shù)據(jù)類(lèi)型,在存取過(guò)程中會(huì)有個(gè)自動(dòng)裝箱和拆箱
集合可以放任意對(duì)象(引用嘛),但是數(shù)組只能放相同的數(shù)據(jù)類(lèi)型;
對(duì)于如何使用集合,我們先看頂層的方法,然后去調(diào)用底層的子類(lèi)來(lái)實(shí)現(xiàn)具體的功能。
1.3.?集合框架
由于集合內(nèi)部的數(shù)據(jù)結(jié)構(gòu)不同,集合分為多種容器。這些容器不斷的向上抽取,就形成了集合框架。
Collection
|----------List(有序,,元素都有索引(角標(biāo)),元素可以重復(fù))
|--------Vector:基于數(shù)組實(shí)現(xiàn),同步,線程安全。增刪,查詢都慢。
|--------ArrayList:基于數(shù)組實(shí)現(xiàn),不同步,線程不安全,需要手動(dòng)同步,查詢的速度快
|--------LinkedList:基于鏈表實(shí)現(xiàn),不同步,線程不安全,需要手動(dòng)同步,增刪都很快
|----------Set(無(wú)序,元素不可以重復(fù))
|--------HsahSet:基于哈希表實(shí)現(xiàn),不同步的。
|--------LinkedHsahSet
|--------TreeSet:基于二叉樹(shù)實(shí)現(xiàn),不同步的。自然排序,定制排序
Map集合(鍵值對(duì))
|----------TreeMap基于二叉樹(shù),可以排序
|----------HashMap哈希表實(shí)現(xiàn)
Iterator迭代器
|----------Collection每個(gè)集合都有迭代器
|----------ListIterator主要用于List集合迭代,迭代過(guò)程可以操作元素
1.4.?集合常見(jiàn)方法
Collection的常見(jiàn)方法:
1,添加:boolean add(Object obj)://添加元素
booleanaddAll(Collectioncoll)://添加給定集合到當(dāng)前集合
2,刪除:boolean remove(object obj)://刪除元素
booleanremoveAll(Collectioncoll);
void clear();//清空集合
3,判斷:boolean contains(object obj)://是否包含指定元素
booleancontainsAll(Colllectioncoll);//是否包含給定集合
booleanisEmpty():判斷集合中是否有元素。
4,獲取:int size():
Iterator iterator():取出元素的方式:迭代器。
5,其他:booleanretainAll(Collection coll);取交集。
Object[] toArray():將集合轉(zhuǎn)成數(shù)組。
1.5.遍歷集合:迭代器Iterator:
也是集合框架的成員,但它主要用于遍歷集合中的對(duì)象,封裝了各種集合的底層細(xì)節(jié),給集合框架提供了統(tǒng)一的接口。比如,這里舉個(gè)例子。主要有3個(gè)方法:
booleanhashnext();如果仍有元素可以迭代,則返回true
E next()返回迭代的下一個(gè)元素
void remove()移除迭代器返回的最后一個(gè)元素
而對(duì)于map類(lèi)集合有2中方式來(lái)遍歷:
1:keySet()獲取鍵對(duì)應(yīng)的Set集合,然后在用Iterator配合get(Object key)獲取每一個(gè)鍵所對(duì)應(yīng)的值。
2:entrySet()獲取鍵值對(duì)集合,存入Map.Entry集合中,Iterator對(duì)其進(jìn)行迭代,在用getKey()取出鍵,getValue()取出值。
1.6.?集合的一些技巧:
需要唯一嗎?
需要:Set
需要制定順序:
需要:TreeSet
不需要:HashSet
但是想要一個(gè)和存儲(chǔ)一致的順序(有序):LinkedHashSet
不需要:List
需要頻繁增刪嗎?
需要:LinkedList
不需要:ArrayList
l???????看到array:就要想到數(shù)組,就要想到查詢快,有角標(biāo).
l???????看到link:就要想到鏈表,就要想到增刪快,就要想要 add get remove+frist last的方法
l???????看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆蓋hashcode方法和equals方法。
l???????看到tree:就要想到二叉樹(shù),就要想要排序,就要想到兩個(gè)接口Comparable,Comparator 。
2.???????List集合
l???有序(存入和取出的順序一致),元素都有索引(角標(biāo)),元素可以重復(fù)。
l???對(duì)于List,根據(jù)其內(nèi)部結(jié)構(gòu)不同又分為Arraylist、LinkedList、Vector
l???共性特點(diǎn):可以操作角標(biāo)
2.1.List子系
List:
|----Vector:數(shù)組數(shù)據(jù)結(jié)構(gòu),是同步的。增刪,查詢都很慢!已經(jīng)唄ArrayList替代了
|----ArrayList:數(shù)組數(shù)據(jù)結(jié)構(gòu),是不同步的。。查詢的速很度快。
|----LinkedList:鏈表數(shù)據(jù)結(jié)構(gòu),是不同步的。增刪的速度很快。
2.2.List常用共性方法
1添加元素:
voidadd(intindex,Eelement);? //指定位置插入元素
void add(index,collection);????? //將給定的集合添加到末尾
2刪除元素:
Object remove(index):????? //刪除指定交表的元素,返被背刪除的
3修改元素:
Objectset(intindex,Eelement);?????? //用指定元素替換列表中指定位置的元素
4獲取元素:
Object get(index);????? //返回列表中指定位置的元素
intindexOf(object);?????????? //返回此列表中第一次出現(xiàn)的指定元素的索引,沒(méi)有返回-1
intlastIndexOf(object);???? //返回此列表中最后一次出現(xiàn)的指定元素的索引,沒(méi)有返回-1
ListsubList(intfrom,intto);????? //獲取子集包含頭不包含尾。
3.???????Set集合
Set集合與Collection基本上一樣,只不過(guò)內(nèi)部元素是無(wú)序的,不允許重復(fù)。Add之前,會(huì)判斷(equals方法)集合中是否包含此元素,如果包含返回true丙存入集合,如果不包含,返回false,不存。
n???????1:HashSet:按hash算法來(lái)存儲(chǔ)集合中的元素,因此具有良好的存取和查找功能。
l???????特點(diǎn):
????????不保證順序。
????????不是同步的
????????集合元素可以是null
l???????判斷元素是否相等
????????判斷hash值是否相等
????????Equals判斷內(nèi)容是否相等
n???????1:TreeSet:按存儲(chǔ)集合中的元素的compare或者比較器,來(lái)判斷是否需添加到集合。
l???????特點(diǎn):
????????自然順序或指定順序。
????????不是同步的
????????集合元素可以是null
l???????判斷元素是否相等
????????判斷hash值是否相等
????????Equals判斷內(nèi)容是否相等
3.1.LinkedHashSet的集合特點(diǎn)
是HashSet的一個(gè)子類(lèi),也是根據(jù)元素的hash值來(lái)判斷元素位置,但同時(shí)使用鏈表維護(hù)元素次序。由于需要維護(hù)次序,所以性能略低于hashSet,但在迭代訪問(wèn)集合元素時(shí),將有很好的性能。【有序不許重復(fù)】
3.2.?常用共性方法
1:增加元素:
booleanadd(Object obj);//添加一個(gè)元素,在末尾位置
booleanaddAll(Collection c);//添加一個(gè)集合,在末尾位置
2:刪除元素:
booleanremove(Object obj);//刪除一個(gè)元素。
booleanremoveAll(Collection c)//刪除包含c的元素。
voidclear();//移除此集合的的所有元素
3:判斷元素:
booleancontains(Object obj)//判斷是否包含某個(gè)元素。
booleancontainsAll(Collection c);//在此集合中包含集合c中的所有元素
booleanisEmpty();//判斷是否為空集合。
4:獲取元素:
intsize();//獲取size大小。
Iteratoriterator();//迭代器,用于取出元素的。配合it.next()和hasNext()組合使用。
3.3.Hash表確定元素是否相同
1:判斷兩個(gè)原素的hash值是否相同,如果相同個(gè),判斷兩個(gè)內(nèi)容是否相同
2:判斷hash值相同,之前這塊不是很理解,后來(lái)java培訓(xùn)學(xué)習(xí)時(shí)突然就想通了,其實(shí)是判斷hashCode()是否相同,判斷內(nèi)容用equals()方法。
n???????hashCode規(guī)則:
l???????同一個(gè)對(duì)象多次調(diào)用返回的hashCode值相等。
l???????2個(gè)對(duì)象euqals方法比較返回true時(shí),他們hashCode也應(yīng)相等。
l???????對(duì)象中用作equals方法比較標(biāo)準(zhǔn)的field都應(yīng)用來(lái)計(jì)算hashCode值
n???????重寫(xiě)hashDode規(guī)則:
l???????把每個(gè)對(duì)象的有意義的field,計(jì)算出一個(gè)hashcode值。
l???????用第一步計(jì)算出來(lái)的多個(gè)hashCode來(lái)組合成一個(gè)值返回。
l???????為了避免相加產(chǎn)生偶然相等。可以通過(guò)hashcode*一個(gè)質(zhì)數(shù)相加返回。
例如:
Return name.hashCode*11 + age.hashCode*7;
練習(xí):請(qǐng)定義ArryaList集合,并存儲(chǔ)Person對(duì)象。如newPerson("lisi",20);
并取出。將姓名和年齡打印出來(lái)。
3.4.TreeeSet排序的2種方式
1,??讓對(duì)象本身具備可比性。實(shí)現(xiàn)comparable接口的comparTo()方法。
2,??創(chuàng)建比較器。比較器實(shí)現(xiàn)Compartor接口,Compar()方法作為T(mén)reeSet對(duì)象的構(gòu)造參數(shù)象傳入。注意泛型。
3,??建議用第二種,使用靈活
·???publicstaticvoidmain(String[] args) {
TreeSet? ts=?newTreeSet(newComparator() {
publicintcompare(Person o1, Person o2) {
returno1.getAge()-o2.getAge();
}
});
ts.add(newPerson("mike",28));
ts.add(newPerson("lisi",21));
ts.add(newPerson("zhouqi",29));
ts.add(newPerson("zhaoliu",25));
ts.add(newPerson("wangu",24));
for(Object o: ts) {
Person p = (Person) o;
System.out.println(p.getName() +"\t"+ p.getAge());
}
}
3.5.?選擇HashSet還是TreeSet?
HashSet的性能總是比TreeSet好,(主要表現(xiàn)在添加、刪除、查詢等),因?yàn)門(mén)reeSet需要二外的紅黑樹(shù)來(lái)維護(hù)次序。只有當(dāng)需要排序時(shí)才使用TreeSet。
HashSet有一個(gè)子類(lèi),LinkedSet對(duì)于普通測(cè)插入刪除這個(gè)要比HashSet要慢些。因?yàn)橐S護(hù)鏈表。
3.6.?安全問(wèn)題解決
通常在創(chuàng)建是就調(diào)用Collections工具類(lèi)的synchronizedSortedSet方法來(lái)包裝集合。
例如
Sorted s =new Collections.synchronizedSortedSet(new Treeset(…))
4.???????Map集合
Map集合用于存儲(chǔ)那些有映射關(guān)系的數(shù)據(jù);
Map也成為雙列集合。
Map存的是一對(duì)元素:一個(gè)Key,一個(gè)Value。Key、Value可以使任何引用類(lèi)型的數(shù)據(jù)。其中Map的Key不允許重復(fù)。
4.1.Map集合子體系
Map:
|----HashMap:哈希表結(jié)構(gòu);Key唯一;不同步;允許null作為鍵,值。hashCode()、equals()確定唯一
|----HashTable:哈希表結(jié)構(gòu);數(shù)據(jù)唯一;同步低效的。不允許null作為鍵,null作為值。
|----TreeMap:二叉樹(shù)結(jié)構(gòu);Key唯一;可排序;不同步但高效;允許null作為鍵,null作為值。
補(bǔ)充:
4.2.Map常用方法
1添加元素:
·value put(key,value):返回前一個(gè)和key關(guān)聯(lián)的值,如果沒(méi)有返回null.
2,刪除元素。
void? clear():清空集合。
value remove(key):根據(jù)指定的key翻出這個(gè)鍵值對(duì)。
3,判斷元素。
boolean containsKey(key):判斷是否包含給定的key
boolean containsValue(value):判斷是否包含給定的value
boolean isEmpty();判斷集合是否為空
4獲取元素。
value get(key):通過(guò)鍵獲取值,如果沒(méi)有該鍵返回null。可以用來(lái)來(lái)判斷是否包含指定鍵。
int size():獲取鍵值對(duì)的個(gè)數(shù)。
4.3.Collection和Collections
collection是集合框架的頂層接口,集成了一些集合的共性方法;添加、刪除、修改、查詢、判斷等。下分為list和set兩個(gè)分支,其又各自有體系,其
中l(wèi)ist有序,可以重復(fù)的,有分為vector arraylistlinkedlist(各個(gè)數(shù)據(jù)結(jié)構(gòu),特點(diǎn))
其中set是無(wú)序不許重復(fù)的,有分為。hashset和treeset(各個(gè)數(shù)據(jù)結(jié)構(gòu),特點(diǎn))
Collections是一個(gè)對(duì)collection操作的工具類(lèi),提供的都是靜態(tài)方法(查找,排序,反轉(zhuǎn),加鎖)
總結(jié)
以上是生活随笔為你收集整理的java集合总结_java集合小总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php orm 链式,关于php:雄辩的
- 下一篇: c语言 为什么i%3cn 1,c语言中n