●迭代是取出集合中元素的一種方式。
●因為Collection中有iterator方法,所以每一個子類集合對象都具備迭代器。
●用法:
第一種
for (iterator iter=iterator(); iter.hasNext();) //老外比較喜歡用這種,省內存(iter的內存),開發時用這個 { System.out.println(iter.next()); }
第二種
Iterator iter = l.iterator(); while(iter.hasNext()) { System.out.println(iter.next()); }
●迭代器在Collection接口中是通用的,它替代了Vector類中的Enumeration(枚舉)。
●迭代器的next方法是自動向下取元素,要避免出現NoSuchElementException。
●迭代器的next方法返回值類型是Object,所以要記得類型轉換。
Collection接口有兩個子接口:List(列表),Set(集)
List:可以存放重復元素,元素存取是有序的(存入和取出的順序一致)。
Set:不可以存放重復元素,元素存取是無序的。
List特有的常見方法:有一個共同特點就是都可以操作角標。
1、添加
void add(int index , E element);
void add(int index , Collection<? extends E> c);
boolean addAll(int index , Collection<? extends E> c);
1 import java.util.ArrayList; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 ArrayList al = new ArrayList(); 7 al.add("dfsdf"); 8 al.add("ere"); 9 al.add("fgf"); 10 11 ArrayList a2 = new ArrayList(); 12 a2.add("dfsdf"); 13 a2.add("ere"); 14 a2.add("fgf"); 15 16 17 al.addAll(1, a2); 18 19 System.out.println(al); 20 21 al.add(1, a2); 22 System.out.println(al); 23 24 } 25 26 }
2、刪除:
E remove(int index);
3、修改:
E set(int index, E element);
4、獲取:
E get(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
List subList(from , to); //不包尾
List集合是可以完成對元素的增刪改查。
Vector:內部是數組數據結構,是同步的。增刪,查詢都很慢。
ArrayList:內部是數組數據結構,是不同步的。替代了Vector。查詢的速度快。
LinkedList:內部是鏈表數據結構,是不同步的,增刪元素的速度很快。
void addFirst(E e);
void addLast(E e);
jdk1.6
boolean offerFirst(E e);
boolean offerLast(E e);
E getFirst(); //獲取但不移除,如果鏈表為空,拋出NoSuchElementException
E getLast();
jdk1.6
E peekFirst(); //獲取但不移除,如果鏈表為空,返回null。
E peekLast();
E removeFirst(); //獲取但不移除,如果鏈表為空,拋出NoSuchElementException
E removeLast();
jdk1.6
E pollFirst(); //獲取但不移除,如果鏈表為空,返回null。
E pollLast();
元素不可以重復,是無序的。
Set接口中的方法和Collection一致。
內部數據結構是哈希表,是不同步的。
如何保證集合的元素唯一性呢?
是通過對象的hashCode和equals方法來完成對象的唯一性的。
如果對象hashCode值不同,那麼不用判斷equals方法,就直接存儲到哈希表中。
如果對象的hashCode值相同,那麼要再次判斷對象的equals方法是否為true。
如果為true,視為相同元素,不存。如果為false,那麼視為不同元素,就進行存儲。
記住:如果元素要存儲到HashSet集合中,必須覆蓋hashCode方法和equals方法。
一般情況下,如果定義的類會產生很多對象,比如人,學生,書,通常都需要覆蓋hashCode,equals方法。
可以對Set集合中的元素進行排序,是不同步的。
判斷元素唯一性的方式:就是根據比較方法的返回結果是否是0,是0,就是相同元素,不存。
TreeSet對元素進行排序的方式一:
讓元素自身具備比較功能,元素就需要實現Comparable接口,覆蓋ComparaTo方法。
如果不要按照對象中具備的自然順序進行排序,如果對象中不具備自然排序,怎麼辦?
那就使用方式二。
方式二:
讓集合自身具備比較功能,定義一個類實現Comparator接口,覆蓋compare方法。
將該對象作為參數傳遞給TreeSet集合的構造函數。
需要唯一性嗎?
需要:Set
需要制定順序嗎?
需要:TreeSet
不需要:HashSet
但是想要一個和存儲一致的順序(有序):LinkedHashSet
不需要:List
需要頻繁增刪嗎?
需要:LinkedList
不需要:ArrayList
如何記住每一個容器的結構和所屬體系呢?
看名字!!!
List
--ArrayList
--LinkedList
Set
--HashSet
--TreeSet
後綴名就是該集合所屬的體系。
前綴名就是該集合的數據結構。
看到array:就要想到數組,就要想到查詢快,有角標。
看到link:就要想到鏈表,就要想到增刪快,就要想到 add/get/remove + First/Last的方法。
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆蓋hashCode和equals方法。
看到tree:就要想到二叉樹,就要想到排序,就要想到兩個接口Comparable,Comparator。
而且通常這些常用的集合容器都是不同步的。