1. 程式人生 > >簡述Java集合框架

簡述Java集合框架

Java集合框架是Java的基礎,也是工作中最長使用的,那麼就簡單總結下java類庫中一些面試容易遇到的問題,以及這裡集合框架的簡單使用,以及如何使用能達到高效率。

Java中最常用使用的集合類主要有,
Collection、List、Set、Map、Iterator、Enumeration、Query等等
下圖中主要展示一些最常用到的介面、類和常用子類


如圖所示,在最常用的三個集合中,List和Set是繼承與Collection介面的,而Map和Collection毫無關係。

可以看到Collection介面的定義方式:
public interface Collection<E> extends Iterable<E> (JDK1.5後都支援泛型)


一般開發中,基本不直接使用Collection介面進行開發,而是一些繼承於它的子介面,主要有List、Set、Queue等
List和Set介面的定義方式:
public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E> 
Queue佇列(具體使用詳見api)
public interface Queue<E> extends Collection<E> 

boolean add(E e);   // 將指定的元素插入此佇列
boolean offer(E e);  // 將指定的元素插入此佇列,此方法通常要優於 add(E)
E remove();   // 將指定的元素插入此佇列
E poll();   // 獲取並移除此佇列的頭,如果此佇列為空,則返回 null。
E element(); //  獲取,但是不移除此佇列的頭。
E peek();  // 獲取但不移除此佇列的頭;如果此佇列為空,則返回 null。

而Map類直接實現Serializable介面
class Map implements Serializable

至於實現Serializable介面的主要作用,無非就是便於例項化,表示該類可以序列化.序列化的目的是將一個實現了Serializable介面的物件轉換成一個位元組序列。


List介面(可以存放重複的資料)

子類:ArrayList、Vector、LinkedList
List介面的最常使用就是 List list = new ArrayList();還有一種Vector vector = new Vector();(特殊情況下使用)
一些常見的面試題,會問ArrayList、Vector和LinkedList的區別?
Vector是執行緒同步的,安全的(執行效率低,所有方法都加synchronized(如:public synchronized int size()),ArrayList是執行緒不同步的(如:public int size())(效率高)。當元素超出初始大小時,ArrayList增加初始一半的大小,而Vector會增加一倍。兩個都是查詢速度非常快,增加和刪除操作非常慢(和陣列類似)。而LinkedList是一個雙向連結串列,在新增和刪除操作效率高,但是查詢慢。

遍歷list也有3種方式

public class TestList {
	
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		for (int j = 0 ; j <100000; j++) {
			list.add("list"+j);
		}
		
		/**
		 * 1 效率低
		 */
		for(String list1 : list) {
			System.out.println(list1);
		}
		
		/**
		 * 2 迴圈遍歷, 效率高  重要的是先取出list的size,不要每次迴圈都去取
		 */
		int size = list.size();
		for(int i =0 ;i < size; i++) {
			list.get(i);
		}
		
		/**
		 * 3 迭代遍歷,效率高,比第二中稍微慢一點
		 */
		Iterator<String> iter = list.iterator();
		while(iter.hasNext()) {
			iter.next();
		}
		
	}
	
}

Set介面(不能存放重複的內容,所有的重複內容靠hashCode()和equals()兩個方法區分)
子類: 無序存放HashSet  有序存放TreeSet
宣告: Set<String> set = new HashSet<String>();

public class TestSet {
	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		for(int i=0; i< 100000; i++) {
			set.add("testSet"+i);
		}
		
		/** 1 迭代遍歷  */  
        for(Iterator<String> iterator = set.iterator();iterator.hasNext();){  
            System.out.print(iterator.next()+" ");  
        }  
          
        /** 2 for增強迴圈遍歷  */  
        for(String value : set){  
            System.out.print(value+" ");  
        }  
	}
}

Queue 佇列操作介面,採用FIFO(先進先出)的方式。先進先出指的是在一個集合中,會按照順序增加內容


Map介面
Map介面每次操作的是一對物件,成對出現的,即二元偶物件,key--value,而collection、Set、List是單值操作,獨立存在的。
public interface Map<K,V>
常用子類 
HashMap 無序存放,key不可重複(新)
HashTable 無序存放,key不可重複(老)
TreeMap 可以排序,按照key排序,key不可重複


package com.lj.collenction;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TestMap {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("1", "jordan");
		map.put("2", "kobe");
		map.put("3", "T-MAC");
		map.put("4", "paul");
		// 得到全部的key
		Set<String> keys = map.keySet();
		Iterator<String> iter = keys.iterator();
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str + " ");
		}
		
		// 得到全部的value
		Collection<String> values = map.values();
		Iterator<String> iterValue = values.iterator();
		while(iterValue.hasNext()) {
			String str = iterValue.next();
			System.out.println(str + " ");
		}
		
	}
}