關(guān)于Java中的集合
集合是什么,為什么要使用集合?
集合是一種容器,集合只存儲(chǔ)對(duì)象,不存儲(chǔ)基本屬類型,集合長(zhǎng)度可變。在JDK1.2版本開(kāi)始,出現(xiàn)了集合框架
?
至于為什么要用集合就涉及到數(shù)據(jù)存儲(chǔ)了。涉及到數(shù)組長(zhǎng)度的問(wèn)題,所以我們比較一下
集合和數(shù)組的區(qū)別:
數(shù)組定長(zhǎng),集合變長(zhǎng)
數(shù)組存儲(chǔ)對(duì)象,基本類型。
集合只存儲(chǔ)對(duì)象
?
//===================================================
2.如何學(xué)習(xí)集合
既然集合是一種容器。必須要掌握如何將對(duì)象存儲(chǔ)到集合中,將對(duì)象從集合中獲取出來(lái) ,?存儲(chǔ)對(duì)象到集合中,以及了解每個(gè)集合同期的特點(diǎn)。
//===================================================
3.集合框架中頂層接口Collection
(目前是,貌似后面的java工程師又給加了Iterable接口。反正不影響)
集合中的方法很多有以下幾種;
? ?add(Object e) 將對(duì)象存儲(chǔ)到集合的方法 (最基本的存取方法)
? ?參數(shù)是Object類型,集合存儲(chǔ)對(duì)象,存儲(chǔ)什么對(duì)象不一定
? ?addAll(Collection c)將一個(gè)集合存儲(chǔ)到另一個(gè)集合
? ?存儲(chǔ)的是另一個(gè)集合中存儲(chǔ)的對(duì)象
? ?clear()清除集合中存儲(chǔ)的所有對(duì)象
? ?boolean contains(Object o)判斷一個(gè)對(duì)象,是否存在于集合中
? ?集合中是否包含這個(gè)對(duì)象
? ?boolean containsAll(Collection c)判斷一個(gè)集合,是否包含另一個(gè)集合
? ?其實(shí)判斷的是兩個(gè)集合中存儲(chǔ)的對(duì)象是否完全包含
? ?int size()返回集合中存儲(chǔ)對(duì)象的個(gè)數(shù)
? ?數(shù)組.length屬性
? ?字符串.length()方法
? ?集合.size()方法
? ?boolean isEmpty()當(dāng)集合中的元素的size()==0 結(jié)果返回真
? ?boolean remove(Object o)移除集合中的一個(gè)對(duì)象,如果移除成功返回真
? ?boolean removeAll(Collection c)移除兩個(gè)集合中,相同的對(duì)象
? ?boolean retainAll(Collection c)兩個(gè)集合取交集
? ?將coll和coll2兩個(gè)集合中相同的對(duì)象,保存到coll中,不相同的就舍棄不要
? ?boolean b = coll.retainAll(coll2);
? ?返回值:調(diào)用者coll集合沒(méi)有變化過(guò),結(jié)果就是false
? ?調(diào)用者coll發(fā)生了變化,就是true
我就不貼代碼演示了。在取的過(guò)程中會(huì)貼代碼。畢竟有存才能取啊。至于其他方法知道就OK。忘記的話可以查API
//===================================================
4.集合中的存儲(chǔ)對(duì)象的取出。
??就是取出集合中存儲(chǔ)對(duì)象的一種方式,遍歷數(shù)組很像。我們這里用的是迭代器
? iterator方法,寫(xiě)在了Collection接口中,所有的小弟都具備這個(gè)方法
? Iterator iterator()
? Iterator 接口,迭代器接口 iterator返回的是接口的實(shí)現(xiàn)類的對(duì)象
? hasNext()判斷集合中還有沒(méi)有可以被取出對(duì)象,如果有就返回真
? next()獲取集合中存儲(chǔ)的對(duì)象
? 使用迭代器取出集合中存儲(chǔ)對(duì)象的步驟:
? ? 第一步,使用集合中的方法iterator()獲取Iterator接口對(duì)象(內(nèi)部類對(duì)象),獲取迭代器
? ? 第二步,使用迭代器對(duì)象的hasNext()方法判斷集合中,有沒(méi)有對(duì)象可以被取出
? ? 第三步,使用迭代器對(duì)象的next()方法,獲取集合中對(duì)象
/*
?* 使用迭代器獲取集合中存儲(chǔ)對(duì)象
?* 迭代器創(chuàng)建好,可以使用一次
?*/
import java.util.*;
public class CollectionDemo1 {
?public static void main(String[] args) {
? Collection coll = new ArrayList();
? coll.add("abc1");
? coll.add("abc2");
? coll.add("abc3");
?
? //獲取迭代器對(duì)象,使用集合方法iterator()
? Iterator it = coll.iterator();
? //判斷集合中是否有對(duì)象可以被取出 迭代器方法hasNext()
? while(it.hasNext()){
? ?//使用迭代器方法Object next()獲取集合中存儲(chǔ)的對(duì)象
? ?Object obj = it.next(); //it.next只能使用一次。
? ?System.out.println(obj);
? }????
?}
}
? 使用迭代器的過(guò)程中,出現(xiàn)了一個(gè)異常
? java.util.ConcurrentModificationException--并發(fā)修改異常
? 在迭代器迭代集合的過(guò)程中,不能使用集合的方法,改變集合的長(zhǎng)度?add
remove clrea
? 當(dāng)?shù)饕呀?jīng)移動(dòng)到了最后一位,再次使用next方法獲取,出現(xiàn)
? Exception in thread "main" java.util.NoSuchElementException--沒(méi)有元素被取出異常
it.nxet就像當(dāng)于指針的移動(dòng)。每次使用就會(huì)像下移動(dòng)。所以一次判斷過(guò)程中。對(duì)于一個(gè)集合對(duì)象只能使用一次。這個(gè)一定要記住。而且迭代過(guò)程中不能改變長(zhǎng)度。但是內(nèi)容是可以的
迭代器中一共就3個(gè)方法。
hasNext()
next()
還有一個(gè)方法remove()
/*
?* 迭代器一個(gè)集合
?* 如果集合中有abc2這個(gè)對(duì)象,請(qǐng)你刪除它
?* 迭代器中的一個(gè)方法remove
?*
?* 如果集合中有abc2這個(gè)對(duì)象,請(qǐng)你添加一個(gè)haha
?*/
import java.util.*;
public class CollectionDemo2 {
?public static void main(String[] args) {
? Collection coll = new ArrayList();
? coll.add("abc2");
? coll.add("abc4");
? coll.add("abc4");
? coll.add("abc1");
? coll.add("abc3");
? coll.add("abc3");
?
? //獲取迭代器,使用集合iterator
? Iterator it = coll.iterator();
? while(it.hasNext()){
? ?//迭代過(guò)程中,如何判斷是否存在abc2對(duì)象
? ?Object obj = it.next();
? ?if("abc2".equals(obj))
? ? it.remove();
? ?//it.remove方法,移除的是哪一個(gè)對(duì)象呢,迭代到的是誰(shuí),就移除誰(shuí)
? ?System.out.println(obj);
? }
?
? System.out.println(coll);
?}
}
? ? ? ? ? ? ? ?