簡述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 + " ");
}
}
}