程序員:一文掌握java集合框架的Collection接口

程序員:一文掌握java集合框架的Collection接口

集合可以看作是一種容器,用來存儲對象信息。所有集合類都位於java.util包下,但支持多線程的集合類位於java.util.concurrent包下。

集合和數組的區別

(1)數組長度不可變化而且無法保存具有映射關係的數據;

集合類用於保存數量不確定的數據,以及保存具有映射關係的數據。

(2)數組元素既可以是基本類型的值,也可以是對象;集合只能保存對象。

為什麼要用到集合

數組的特點:

(1)長度固定,如果要擴容需要程序員自己維護,插入和刪除效率很低

(2)數組只支持"有序,可重複"的特點,但是實際開發中,可能需要無序,不可重複的需求

集合的特點:

(1)長度不固定,是可擴容的(可變的)

(2)支持多種數據的存儲結構:有序的,無序的,可重複的,不可重複的,一對一的,一對多的

(3)JDK在數組和鏈式的基礎上設計了很多有用的容器


集合

集合的分類

(1)Collection:一組對象(“單身趴”)----都沒有和他對應的,只有自己.(Collection在哭泣)

(2)Map:鍵值對(key,value)(“情侶約會”,“家庭聚會”)----- 成對出現.

容器都有的特徵:可以進行增刪改查

Collection

接口:java.util.Collection

Collection概述

Collection 層次結構 中的根接口。Collection 表示一組對象,這些對象也稱為 collection 的元素。

一些 collection 允許有重複的元素,而另一些則不允許。

一些 collection 是有序的,而另一些則是無序的。

JDK 不提供此接口的任何直接 實現:它提供更具體的子接口(如 Set 和 List)實現。

此接口通常用來傳遞 collection,並在需要最大普遍性的地方操作這些 collection。

Collection方法

1.添加方法

(1)add(Object obj) 一次添加一個元素


注意add方法的參數的類型是Object的,所以如果用add方法添加other,那麼other會被當成一個集合元素(當成一個元素)

(2)addAll(Collection other) 一次添加多個元素,把other中的元素都添加到當前集合中來.


注:範圍:this =this∪()並other

<code>\t@Test
\tpublic void test1() {
\t\t//多態引入,為的是生成一個Collection的對象c,而對象c就只能使用collection的方法而不受到ArrayList的干擾
\t\tCollection c = new ArrayList();
\t\tc.add("張三");
\t\tc.add("李四");
\t\tc.add("王五");
\t\t
\t\tCollection other = new ArrayList();
\t\tother.add("趙柳");
\t\tother.add("趙四");
\t\t
\t//\t測試add()方法的參數是Object類型的

\t// int[] array1 = {1,2,3};
\t//\tother.add(array1);
\t\tSystem.out.println(other);
\t\t
\t\t//這裡要對比c.add()方法和c.addAll()方法的不同
\t//\tc.addAll(other);
\t//\tc.add(other);
\t\tSystem.out.println(c.size());
\t\tObject[] array= c.toArray();
\t\tfor (int i = 0; i < array.length; i++) {
\t\t\tSystem.out.println(array[i]);
\t\t}
\t\t
\t}/<code>


2.刪除remove

(1)remove(Object obj) 一次刪除一個


(2)remove(Collection other) 一次刪除多個


注:範圍 this = this-(this ∩(交) other)

(3)clear() 清空,消除所有


<code>\t@Test 
\tpublic void test2() {
\t\t//多態引入,為的是生成一個Collection的對象c,而對象c就只能使用collection的方法而不受到ArrayList的干擾
\t\tCollection c = new ArrayList();
\t\tc.add("張三");
\t\tc.add("李四");

\t\tc.add("王五");
\t\tc.add("錢七");
\t\t
\t\tCollection other = new ArrayList();
\t\tother.add("趙柳");
\t\tother.add("李四");
\t\tother.add("王五");
\t\t
\t\t//測試remove()方法
\t\t
\t\tc.remove("張三");\t\t
\t\tObject[] array= c.toArray();
\t\tfor (int i = 0; i < array.length; i++) {
\t\t\tSystem.out.println(array[i]);
\t\t}
\t\t
\t\tSystem.out.println("..............");
\t\tc.removeAll(other);
\t\tObject[] array1= c.toArray();
\t\tfor (int i = 0; i < array1.length; i++) {
\t\t\tSystem.out.println(array1[i]);
\t\t}
\t}/<code>


3.修改

Collection根接口中沒有提供修改的方法


4.查詢:

(1)contains(Object obj) : 判斷obj是否在當前集合中 返回布爾值


(2)contains(Collection> c)判斷c中的元素是否都在集合中,即判斷c是否是this的子集


(3)isEmpty() 判斷是否為空的集合


5.獲取有效元素的個數:

int size()


Collection 中,沒有提供一個獲取具體元素的方法

16.其他方法:

retainAll(Collection> c) 保留this和c的交集

注:範圍 this =this ∩(交) other

7.遍歷

(1)老方法

Object[] toArray():如果該集合的底層實現就是數組,那麼比較簡單,但是如果該

集合的底層不是數組,那麼就比較麻煩.無論底層怎麼樣,


都會返回一個size長度的數組,所以比較浪費空間


<code>\t@Test
\tpublic void test3() {
\t\t//多態引入,為的是生成一個Collection的對象c,而對象c就只能使用collection的方法而不受到ArrayList的干擾
\t\tCollection c = new ArrayList();
\t\tc.add("張三");
\t\tc.add("李四");
\t\tc.add("王五");
\t\tc.add("錢七");
\t\t
\t\tCollection other = new ArrayList();
\t\tother.add("趙柳");
\t\tother.add("李四");
\t\tother.add("王五");
\t\t
\t\tc.retainAll(other);
\t\tObject[] array= c.toArray();
\t\tfor (int i = 0; i < array.length; i++) {
\t\t\tSystem.out.println(array[i]);
\t\t}
\t}/<code>

(2)foreach

foreach語法:

foreach:稱為增強版的for循環

語法結構:

for(元素類型 元素名:可迭代的容器){

}


foreach 只能用來訪問集合或者數組中的元素,但是不能對其進行修改

可以把元素名理解為形參,沒循環一次就把數組或者集合的元素依次賦值給形參,所以他不能修改

即如果元素是基本數據類型,那麼把數組或集合的元素的數據值賦值給它那麼對它怎麼修改和實參無關

如果元素是引用數據類型,那麼把數組或者集合的元素的"地址值"賦值給它,那麼對它的屬性修改和它有關,對它的地址修改和實參無關.

*


結論:

如果你只是查看數組或集合的元素,用foreach比較方便.但是如果要修改,那麼用foreach不是很方便.

<code>\t@Test
\tpublic void test3() {
\t\tCollection c = new ArrayList();
\t\tc.add("張三");
\t\tc.add("李四");
\t\tc.add("王五");
\t\tfor (Object object : c) {
\t\t\tSystem.out.println(object);
\t\t}
\t\t
\t}/<code>


(3)Iterator

步驟:

1.先通過Collection系列集合.對象拿到迭代器對象

2.在通過Iterator的方法進行迭代


<code>\t@Test
\tpublic void test1() {
\t\tCollection c = new ArrayList();
\t\tc.add("張三");
\t\tc.add("李四");
\t\tc.add("王五");
\t\tc.add("錢七");
\t
\t\t//1.先通過Collection系列集合.對象拿到迭代器對象
\t\tIterator it = c.iterator();
\t\t
\t\t//2.在通過Iterator的方法進行迭代
\t\twhile(it.hasNext()) {//判斷集合中是否有元素需要迭代
\t\t\tObject next = it.next();
\t\t\tSystem.out.println(next);
\t\t}
\t\t
\t\t
\t}/<code>


分享到:


相關文章: