JAVASE—java集合框架

一個集合(Collection)就是一個存儲一組對象的容器,我們將這些對象稱之爲元素。Java支持三種類型的集合:規則集(Set)、線性表(List)和圖(Map)。Set的實例存儲一組互不相同的元素,List的實例存儲一組順序排列的元素,Map實例存儲一組對象。Java集合框架的結構如下圖所示:


Java集合的設計使用了接口、抽象類和具體類。接口定義了架構,抽象類提供了接口一部分功能的實現,具體類通過具體的數據結構實現了整個接口。

1.根接口Collection

Collection接口定義瞭如下方法:
public class MyCollection implements Collection {

	// 返回該集合中元素的個數
	@Override
	public int size() {
		return 0;
	}

	// 判斷集合是否沒有元素
	@Override
	public boolean isEmpty() {
		return false;
	}

	// 集合包含元素o,則返回true
	@Override
	public boolean contains(Object o) {
		return false;
	}

	// 返回集合的迭代探子
	@Override
	public Iterator iterator() {
		return null;
	}

	// 返回集合元素的對象數組
	@Override
	public Object[] toArray() {
		return null;
	}

	// 返回集合元素的對象數組
	@Override
	public Object[] toArray(Object[] a) {
		return null;
	}

	// 將元素e添加進集合
	@Override
	public boolean add(Object e) {
		return false;
	}

	// 刪除集合中的元素o
	@Override
	public boolean remove(Object o) {
		return false;
	}

	// 判斷集合c中的元素是否都在該集合中
	@Override
	public boolean containsAll(Collection c) {
		return false;
	}

	// 將集合c中的所有元素添加進該集合
	@Override
	public boolean addAll(Collection c) {
		return false;
	}

	// 移除集合c中的所有元素
	@Override
	public boolean removeAll(Collection c) {
		return false;
	}

	// 返回該集合與c的交集
	@Override
	public boolean retainAll(Collection c) {
		return false;
	}

	// 刪除集合中的所有元素
	@Override
	public void clear() {

	}
}

2.規則集Set

      Set接口擴展Collection接口。它沒有引進新的方法和常量,只是規定其中不能包含相同的元素。HashSet與LinkedHashSet,在hashSet中元素是沒有順序的,而在LinkedHashSet中,可以按照插入的順序進行提取。

3.線性表List

      規則集內只能存儲不重複的元素。爲了允許在一個集合中存儲重複的元素,可以使用線性表。線性表不僅支持重複元素的存儲,而且支持用戶指定它們的存儲位置,用戶可以用下標來訪問元素。 List 接口擴展 Collection 接口,定義了一個支持元素重複的有序集合。相比Collection接口,List接口中新增了以下方法:
public abstract class MyList implements List {

	// 返回該線性表中指定下標處的元素
	@Override
	public Object get(int index) {
		return null;
	}

	// 設置指定下標的元素
	@Override
	public Object set(int index, Object element) {
		return null;
	}

	// 向指定下標位置添加一個元素
	@Override
	public void add(int index, Object element) {

	}

	// 在指定下標位置將集合c中的所有元素添加到該線性表
	@Override
	public boolean addAll(int index, Collection c) {
		return false;
	}

	// 刪除指定下標的元素
	@Override
	public Object remove(int index) {
		return null;
	}

	// 返回與指定元素匹配的第一個元素的下標
	@Override
	public int indexOf(Object o) {
		return 0;
	}

	// 返回與指定元素匹配的最後一個元素的下標
	@Override
	public int lastIndexOf(Object o) {
		return 0;
	}

	// 返回該線性表所有元素的迭代探子
	@Override
	public ListIterator listIterator() {
		return null;
	}

	// 返回該線性表中下標從index開始的元素的迭代探子
	@Override
	public ListIterator listIterator(int index) {
		return null;
	}

	// 返回下標從fromIndex到toIndex的元素構成的子線性表
	@Override
	public List subList(int fromIndex, int toIndex) {
		return null;
	}

}

3.1ArrayList與LinkedList

  • ArrayList將元素存儲在一個數組中,該數組是動態創建的。超過數組的容量時,則會創建一個更大的數組並將當前數組中的所有元素複製到新的數組中。
  • LinkedList將元素存放在鏈表中。
  • 如果只是簡單的查詢操作,ArrayList效率較高,如果要在線性表的任意位置上插入或者刪除數據,應該使用LinkedList。

4.向量類Vector

      Vector是在Java 2中引入的,除了包含訪問和修改向量的同步方法之外,它與ArrayList是相同的。同步方法用於防止多線程同時訪問向量時引起數據衝突。Vector實現了List接口。但是還包含Java 2中Vector類的方法。
public class MyVector {

	public static void main(String[] args) {
		
		Vector<Object> vector = new Vector<Object>();

		vector.capacity(); // 返回vector的容量

		vector.addElement("1"); // 向vector中添加元素

		Object o = vector.elementAt(0); // 返回指定下標的元素

		Enumeration<Object> enumer = vector.elements(); // 返回該向量的枚舉值

		vector.ensureCapacity(10); // 增加向量的容量

		vector.firstElement(); // 返回向量的第一個元素

		vector.lastElement(); // 返回向量的最後一個元素

		vector.insertElementAt("ok", 2); // 向指定位置插入元素

		vector.removeAllElements(); // 刪除所有元素

		vector.trimToSize(); // 將向量的容量縮減爲向量的大小

		// 省略......

	}

}

5.棧類Stack

      在Java集合框架中,Stack是作爲Vector類的擴展類實現的。
public class MyStack extends Vector<Object> {

	public static void main(String[] args) {

		Stack<Object> stack = new Stack<Object>();

		stack.empty(); // 判斷是否爲空棧
		
		stack.peek(); // 返回棧頂元素
		
		stack.pop(); // 返回並刪除棧頂元素
		
		stack.push(1); // 向棧頂壓入新元素
		
		stack.search(1); // 返回指定元素在棧中的位置
	}
}

6.圖Map

      Map接口建立元素與鍵值得一個映射關係。Map中不能存在重複的鍵,每一個鍵對應一個值。
public class MyMap implements Map<Object, Object> {

	// 返回該圖中映像的個數
	@Override
	public int size() {
		return 0;
	}

	// 如果該圖沒有映像,返回true
	@Override
	public boolean isEmpty() {
		return false;
	}

	// map中是否包含該建
	@Override
	public boolean containsKey(Object key) {
		return false;
	}

	// map中是否包含該值
	@Override
	public boolean containsValue(Object value) {
		return false;
	}

	// 返回該圖中指定鍵對應的值
	@Override
	public Object get(Object key) {
		return null;
	}

	// 給該圖添加一個映像
	@Override
	public Object put(Object key, Object value) {
		return null;
	}

	// 刪除指定鍵的映像
	@Override
	public Object remove(Object key) {
		return null;
	}

	// 將圖m中的映像全部添加到該圖中
	@Override
	public void putAll(Map<? extends Object, ? extends Object> m) {

	}

	// 從該圖中刪除所有的映像
	@Override
	public void clear() {

	}

	// 返回該圖中鍵構成的規則集
	@Override
	public Set<Object> keySet() {
		return null;
	}

	// 返回由該圖中的值構成的集合
	@Override
	public Collection<Object> values() {
		return null;
	}

	// 返回該圖中實體構成的規則集
	@Override
	public Set<java.util.Map.Entry<Object, Object>> entrySet() {
		return null;
	}

}
      散列圖 HashMap 、鏈式散列圖 LinkedHashMap 和樹形圖 TreeMap 三種圖是實現Map接口的具體類。對於定位查找一個值、插入一個映像或刪除一個映像, HashMap 類的效率是很高的。在HashMap中元素是沒有順序的,但是在LinkedHashMap中,元素既可以按照它們插入的順序訪問,也可以按照他們最後一次訪問的順序從早到晚排列。TreeMap可以很好的按照鍵來順序遍歷圖。

7.迭代器Iterator

public class MyIterator {

	public static void main(String[] args) {
		List list = new ArrayList<Object>();
		
		Iterator<Object> it = list.iterator(); //遍歷ArrayList
		
		while(it.hasNext()){
			it.next();
		}
	}
}





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章