——Collection集合的概述

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

集合類

爲什麼出現集合類?

面對對象語言對事物的描述都是以對象的形式,

所以爲了方便對多個對象操作,就對對象進行

存儲,集合存儲對象最常用的一種方式。


數組和集合類同時容器,有何不同?

1,數組雖然也可以存儲對象,但長度是固定的;

2,集合長度是可變的。

3,數組中可以存儲基本數據類型和引用類型,集合只能存儲對象。

集合類的特點:

1,集合只用於存儲對象;

2,集合長度是可變的;

3,集合可以存儲不同類型的對象。

              注:集合中存儲的都是對象的引用(地址)。

   Iterator迭代器:(類似於玩具城的一個投幣抓取玩具的機器,它們內部都有一個夾子用於取玩具,這個夾子相當於迭代器)

用於取出集合中元素的方式。

集合框架:

   爲什麼會出現這些集合框架呢?

因爲每個容器對數據的存儲方式都有不同。

這個存儲方式稱之爲:數據結構。

集合框架圖:


   各個集合的特點:

     List(元素有序,帶下標的,可重複)

         |--ArrayList:

        底層的數據結構使用的是數組結構,特點是查詢的效率高,但是增刪稍慢。

   注:線程不同步

   初始化默認容量爲10的空列表,且每次增加50%的容量。

         |--LinkedList:

        底層使用的是鏈表結構,增刪效率高,遍歷效率低。

         |--Vector:

        底層是數組的數據結構。線程時同步的,所以查詢效率低。功能和ArrayList一樣。

        注:初始化默認容量爲10的空列表,且每次增加100%的容量。

    Set(元素無序,不帶下標的,不可重複)操作和Collection方法一樣

         |--HashSet:

             底層數據結構是哈希表。按照哈希值存儲。哈希表在存儲時先判斷哈希值是否一樣,

             若哈希值不一樣則直接存儲,若哈希值一樣,則在比較是否是同一對象。如果是,則返回false。

             HashSet是如何保證元素的唯一性呢?

             是通過元素的兩個方法:hashCode() 和 equals()兩個方法。

             如果元素的哈希值不相同,不會判斷equals是否爲true。

             當哈希值不同的時候纔會調用equals方法進行判斷。

         |--TreeSet:可以對Set集合中的元素進行自然排序。

                   底層數據結構是二叉樹。

                   保證元素唯一性的依據是:compareTo方法返回值爲0;

 步驟:

1,元素類實現Compareable接口,實現compareTo方法。

 特點:

     一,TreeSet:在存儲數據的時候要求元素對象必須具有比較性,即實現Compareable接口。

並實現其中的compareTo方法;其返回值爲正整數,0,負整數。零表示相等。

     二,當主要條件比較之後,還要比較次要條件。

     三,如果compareTo方法返回值是0,則不添加元素。

     四,輸出的時候是按照二叉樹的由小到大輸出的,如果要按順序輸出,則compareTo方法要返回都是正整數。

 倒序輸出則是,要compareTo方法返回是負整數。

     五,TreeSet的第二種排序方式。

 當元素自身不具備比較性時,或者具備的比較性不是所需要的。

 這時就需要集合自身具備比較性。TreeSet的構造函數初始化時給定比較性

 步驟:
1,定義一個類實現Comparetor接口,重寫compare方法。

2,將定義的類對象,作爲TreeSet初始化時,構造函數的參數。

 
集合中常用的基本方法:

   1,添加:

1.1,boolean add(E e):用於向集合紅在哪個添加當元素。

1.2,boolean addAll(Collection<? extends E> c) 

             將指定 collection 中的所有元素都添加到此 collection 中(可選操作)。


   2,獲取:

2.1,int size():返回該集合中的元素個數

2.2, boolean contains(Object o) 

              如果此 collection 包含指定的元素,則返回 true。

2.3, boolean isEmpty() 

              如果此 collection 不包含元素,則返回 true。

2.4, boolean containsAll(Collection<?> c) 

          如果此 collection 包含指定 collection 中的所有元素,則返回 true。  

   3,修改:

3.1, boolean retainAll(Collection<?> c) 

              獲得該集合與指定集合元素的交集,耳朵沒有則該集合返回爲0個元素的集合。 

   4,刪除:

4.1,boolean remove(Object o) 

             從此 collection 中移除指定元素的單個元素,如果存在的話(可選操作)。 

4.2,boolean removeAll(Collection<?> c) 

             移除此 collection 中那些也包含在指定 collection 中的所有元素(可選操作)。 

4.3,void clear() 

             移除此 collection 中的所有元素(可選操作)。

   5,比較:

List集合中元素的比較會自動調用equals()來進行比較,所以如果集合中的元素爲自定義類型時,要重寫equals方法。

集合共性方法的示例代碼:

package com.itheima.collectiondemos.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;


/**
 * 集合的共性方法演示類
 * 共性的方法是:
 * 1,add(Object obj);//添加一個元素
 * 2,remove(Object obj);//刪除一個元素
 * 3,clear();//清空集合
 * 4,iterator();獲取集合的迭代器
 * @author wuyong
 *
 */
public class CollectionGenericMethodsTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		sop("=============添加=============");
		methods_add();
		sop("=============刪除=============");
		methods_del();
		sop("=============查看=============");
		methods_read();
		sop("=============修改=============");
		methods_update();
	}

	public static void methods_add() {
		Collection coll = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		ArrayList al = new ArrayList();
		al.add("123");
		al.add("456");
		//通過addAll(Collevtion col)方法向集合中添加另一個集合中的元素。
		coll.addAll(al);
		
		sop("coll集合添加對象後的長度是:" + coll.size());
	}
	public static void methods_del() {
		Collection coll = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		
		sop("刪除前的coll是:" + coll);
		
		coll.remove("abc2");//刪除指定元素
		sop("刪除後的coll是:" + coll);
	}
	public static void methods_update() {
		Collection coll1 = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		coll1.add("abc1");
		coll1.add("abc2");
		coll1.add("abc3");
		coll1.add("abc4");
		Collection coll2 = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		coll2.add("abc5");
		coll2.add("abc2");
		coll2.add("abc8");
		coll2.add("abc4");
		sop("coll1在retainAll操作取交集之前的值:" + coll1);
		
		coll1.retainAll(coll2);//取得兩個集合中相同的元素,若沒有則調用方法的集合元素變爲0;
		sop("coll1在retainAll操作取交集之後的值:" + coll1);
		
		coll1.clear();//清空集合
		sop("coll1清空後:" + coll1);
	}
	public static void methods_read() {
		Collection coll = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		sop("集合coll的元素是:");
//		Iterator it = coll.iterator();//迭代器遍歷
//		while(it.hasNext())
//			sop(it.next());
		//簡寫方法:
		for(Iterator it2 = coll.iterator(); it2.hasNext();){
			sop(it2.next());
		}
	}
	
	/**
	 * 自定義輸出方法
	 * @param obj
	 */
	public static void sop(Object obj) {
		System.out.println(obj);
	}
}


List:

   List接口中的特有方法:

   1,增:

    1.1,add(int index,Object element);在集合指定位置插入元素

      1.2,add(int index,alection<E> al);在指定位置插入一個集合的元素

   2,查:

    2.1,int get(int index);獲得指定位置的元素

    2.2,List sublist(int offset,int end);獲得從offset(包含)位置到end(不包含)位置的子集合

    2.3,int indexOf(Object obj)//獲取元素在集合中的索引。

    2.4,listIterator listIterator();//獲得list迭代器,該迭代器是List中特有的迭代器,是iterator的子接口。

    //且可以對集合的元素進行添加,刪除,獲取,修改。
   3,刪:

    remove(int index);刪除指定位置的元素

   4,改:

    set(int index,Object element);設置指定位置的元素爲element。

  注:List中的listIterator()方法的特殊之處。

   ListIterator是List集合特有的迭代器,是Iterator的子接口。

   在迭代時,不可以通過集合對象的方法操作集合中的元素。

   因爲會發生ConcurrentModificationException異常。


   所以,在迭代器時,只能用迭代器的方式操作元素,可是Iterator方法的功能時有限的。

   只能對元素進行判斷,取出,刪除的操作。

   如果要再迭代時,執行添加,修改等,就需要使用其子接口,ListIterator.

   注:該接口只能通過List集合的listIterator()方法獲取。所以,只有List及其子類可以使用。 


List集合特有方法的示例代碼:

package com.itheima.collectiondemos.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 * List接口中的特有方法示例
 * @author wuyong
 *
 */
public class ListMethodTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// TODO Auto-generated method stub
		sop("=============添加=============");
		methods_add();
		sop("=============刪除=============");
		methods_del();
		sop("=============查看=============");
		methods_read();
		sop("=============修改=============");
		methods_update();
	}
	
	public static void methods_add() {
		List list = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		list.add("abc1");
		list.add("abc2");
		list.add("abc3");
		list.add("abc4");

		//通過add(int index,Object obj)方法添加單個元素
		list.add(2,"123");
		list.add(3,"456");
		
		sop("list集合添加對象後的長度是:" + list.size());
	}
	public static void methods_del() {
		List list = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		list.add("abc1");
		list.add("abc2");
		list.add("abc3");
		list.add("abc4");
		
		sop("刪除前的list是:" + list);
		
		list.remove("abc2");//刪除指定元素
		list.remove(0);//刪除指定位置的元素
		sop("刪除後的list是:" + list);
	}
	public static void methods_update() {
		List list = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		list.add("abc1");
		list.add("abc2");
		list.add("abc3");
		list.add("abc4");
		sop("修改前的list是:" + list);
		list.set(2, "QQ");//用set(int index,Object element)修改指定位置的元素
		sop("修改後的list是:" + list);
	}
	public static void methods_read() {
		List list = new ArrayList();
		//通過add(Object obj)方法添加單個元素
		list.add("abc1");
		list.add("abc2");
		list.add("abc3");
		list.add("abc4");
		
		sop("索引2位置的元素時:" + list.get(2));
		
		//使用Iterator迭代器時,只能對集合進行判斷,取出,刪除操作。
		for(Iterator it2 = list.iterator(); it2.hasNext();){
			Object obj = it2.next();
			if (obj.equals("abc2")) {
				it2.remove();//可以進行刪除操作
//				list.add("WW");//次操作引發異常。
			}
			sop(obj);
		}
		sop("Iterator迭代時刪除後的list集合是:" + list);
		
		for(ListIterator listIt = list.listIterator();listIt.hasNext();){
			Object obj = listIt.next();
			if (obj.equals("abc1")) {
//				listIt.remove();//可以進行刪除操作
				listIt.set("QQ");
				listIt.add("WW");//添加成功!
			}
		}
		sop("ListIterator迭代時,對應的操作後的list集合是:" + list);
	}
	
	/**
	 * 自定義輸出方法
	 * @param obj
	 */
	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

 
發佈了25 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章