* 本節要點
1、Java 框架集合
2、Collection 接口API
3、Iterator 迭代器接口
4、Collection 子接口之一:Set接口
> HashSet LinkedHashSet TreeSet
5、Collection 子接口之二:List接口
> ArrayList LinkedList Vector
6、Map 接口
> HashMap TreeMap Hashtable
7、Collections 工具類
一、Java 集合概述
集合可以存儲數量不等的多個對象,還可用于保存具有映像關系的關聯數組,集合又被簡稱為容器
1、Java 集合分為兩種體系:Collection 和 Map
> Collection 接口
> Set :元素無序、不可重復的集合
> List :元素有序、可重復的集合
> Map 接口 :具有映射關系 "key - value對" 的集合,"key" 是唯一的
二、Collection 接口API
1、Collection 接口繼承樹
2、Collection 中的方法:
> size() -> 返回集合中的元素個數
> add(Object obj) -> 向集合中添加元素(任何類型的元素)
> addAll(Collection coll) -> 將coll中包含的所有元素添加到當前集合中
Collection coll1 = Arrays.asList(1,2,3);
coll.addAll(coll1);
> isEmpty() -> 判斷這個集合是否為空,為空返回 True
> clear() -> 清空集合中的元素
* System.out.PRintln(coll); -> 查看集合中的元素 > contains(Object obj) -> 判斷這個集合中是否包含指定的obj元素,如果包含返回 True
如何存入集合中的元素是自定義類的對象,要求:自定義類重寫 equals() 方法
> containsAll(Collection coll) -> 判斷當前集合中是否包含coll中所有的元素
> retainAll(Collection coll) -> 保留當前集合與coll集合共同的元素,就是求當前集合和coll集合的交集,將結果返回給當前集合
> remove(Object obj) -> 刪除集合中的某一個元素,刪除成功返回True,如果返回False說明里面沒有
> removeAll(Collection coll) -> 刪除當前集合中包含coll集合的所有元素,返回Boolean值
> equals(Object obj) ->判斷兩個集合中的元素是否相同
> hashCode() -> 算一下集合中的hash值,返回一個整數,主要在Set中用的多點,到時候在具體了解這個方法
> toArray() -> 將集合轉換成數組
Object[] obj = coll.toArray();
> iterator() -> 用來遍歷一個集合,返回一個Iterator接口實現類的對象
Iterator iterator = coll.iterator();
Iterator.hasNext(); // 判斷是否有下一次元素
iterator.next(); // 返回集合中的元素,調用幾次,返回幾個
四、Collection 子接口之一:Set接口
HashSet(主要實現類)、LinkedHashSet、TreeSet
> 存儲無序的,Set中常用的方法都是Collection 下定義的 (無序 != 隨機,添加的順序和輸出的順序不一樣,但是運行多少次得到的結果是有序的,
真正的無序性指的是元素在底層存儲的位置是無序的,底層實現如C語言的鏈表)
> 不可重復的元素,當向Set中添加進相同的元素的時候,后面的這個不能添加進去
> 說明:要求添加進Set中的元素所在類,一定要重寫Object的equals() 方法和hashCode() 方法,進而保證Set中的元素的不可重復性
> Set中添加元素時,采用 Hash算法,添加對象時,首先調用此對象所在類的hashCode()方法,計算此對象的哈希值,此哈希值決定了此對象在
Set中的存儲位置。若此位置之前沒有對象存儲,則這個對象直接存儲到此位置,若此位置已有對象存儲,再通過equals()方法比較這兩個對象
是否相同。如果相同,后一個對象就不能再添加進來
> 要求:hashCode() 和 equals() 方法屬性相同
1、HashSet() 中常用的方法都是Collection 中的方法
2、LinkedHashSet:使用鏈表維護了一個添加進集合中的順序,導致當我們遍歷LinkedHashSet 集合元素時,是按照添加進去的順序遍歷的
> 根據元素的 hashCode 值來決定元素的存儲位置,但它同時使用鏈表維護元素的次序,這使得元素看起來是以 插入順序保存的
> 插入性能略低于 HashSet,但在迭代訪問Set里的全部元素時,有很好的性能
> 不允許集合元素重復
3、TreeSet
> 只能添加同一類型的數據或對象
> 無法插入相同的元素,并且插入的數據按照從小到大的順序遍歷
當自定義類沒有實現 Comparable 接口時,當向TreeSet 中添加對象時,會報 ClassCastException異常錯誤
> 當向TreeSet 中添加自定義類的對象時,有兩種排序方法:①自然排序、②定制排序
> 自然排序:要求自定義類實現java.lang.Comparable 接口并重寫其 compareTo(Object obj) 抽象方法,在此方法中,指明按照自定義類的那個屬性進行排序
> 向 TreeSet 中添加元素時,首先按照compareTo() 方法進行比較,一旦返回0,雖然僅是兩個對象的此屬性值相同,但程序會認為這兩個對象是相同的,進
而后一個對象就不能添加進來
> compareTo() & hashCode() & equals() 三者之間保持一致
> 定制排序:要實現Comparator類
/*
* TreeSet的定制排序: 見下面的步驟 compare()與hashCode()以及equals()三者保持一致!
*/
@Test
public void testTreeSet2() {
// 1.創建一個實現了Comparator接口的類對象
Comparator com = new Comparator() {
// 向TreeSet中添加Customer類的對象,在此compare()方法中,指明是按照Customer
// 的哪個屬性排序的。
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Customer && o2 instanceof Customer) {
Customer c1 = (Customer) o1;
Customer c2 = (Customer) o2;
int i = c1.getId().compareTo(c2.getId());
if (i == 0) {
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
};
// 2.將此對象作為形參傳遞給TreeSet的構造器中
TreeSet set = new TreeSet(com);
// 3.向TreeSet中添加Comparator接口中的compare方法中涉及的類的對象。
set.add(new Customer("AA", 1003));
set.add(new Customer("BB", 1002));
set.add(new Customer("GG", 1004));
set.add(new Customer("CC", 1001));
set.add(new Customer("DD", 1001));
for (Object str : set) {
System.out.println(str);
}
}
五、Collection 子接口之二:List接口
1、List新增的方法;
List 的實現類:ArrayList、LinkedList、Verctor
ArrayList : List的主要實現類,List中新增了很多方法:
* 底層還是以數組實現
> void add(int index, Object ele)
在指定的索引位置添加元素 ,這種插入效率很低,如果在前面插入一個元素,后面的所有元素都要移位
> boolean addAll(int index, Collection eles)
在指定的索引位置添加一個eles集合
> Object get(int index)
獲取指定索引位置的元素
> int indexOf(Object obj)
返回 obj 在集合中首次出現的位置,沒有返回 -1
> int lastIndexOf(Object obj)
返回 obj 在集合中最后一次出現的位置,沒有返回 -1
> Object remove(int index)
刪除指定索引位置的元素,刪除后,后面的數據依次往前挪
> Object set(int index, Object ele)
修改指定索引位置的元素為ele
> List subList(int fromIndex, int toIndex)
返回List中索引從 fromIndex 到 toIndex 的子集
LinkedList 對于頻繁的插入刪除操作效率比ArrayList 高很多
Verctor 已經被淘汰了
六、Map 接口
> Map 與 Collection 并列存在,用于保存具有映射關系的數據:Key-Value
> Map 中的 Key 和 Value 都可以是任何引用類型的數據
> Map 中的 Key 用 Set 來存放,不允許重復,即同一個 Map 對象所對象的類,須重寫 hashCode() 和 equals() 方法
> 常用 String 類作為 Map 的 "Key"
> Key 和 Value 之間存在單向一對一關系,即通過指定的 Key 總能找到唯一的,確定的 Value(Value 可以是重復的,Key是唯一的)。
> 一個 Key-Value 被稱為一個 Entry,所有的Entry 是用Set 存放的,是不可重復的
* HashSet 類是 HashMap 類的特殊實現
1、Map 接口繼承樹
> TreeMap 按照添加進Map中的元素的 Key 的指定屬性進行排序
> HashMap (主要實現類),Key 是用 Set 存放的,不可重復,Value 是用Collection 存放的,可以重復
> 向HashMap 中添加元素時,會調用 Key 所在類的 equals(0 方法,判斷兩個 Key ***
> Hashtable 已經幾乎不用了,
> Properties 比較常用,常用來處理屬性文件,Key-Value都是String類型的
> LinkedHashMap 使用鏈表維護添加進Map中的順序,故遍歷 Map 時是按添加的順利遍歷的
2、Map 方法:
> Object put(Object key, Object value) -> 向Map中添加一個元素
> Object remove(Object key) -> 按照指定的e Key 值刪除此 Key-Value
> void putAll(Map t)
> void clear() -> 清空
> Object get(Object key)
> boolean containsKey(Object key)
> boolean containsValue(Object value)
> int size() -> 返回集合的長度
> boolean isEmpty() -> 判斷集合是否為空
> boolean equals(Object obj)
> keySet() -> 遍歷 Key 集
Set set = map.keySet();
for (Object obj : set){
Ssytem.out.println(obj);
}
> values() -> 遍歷 Value 集
Collection values = map.values();
Iterator i = values.iterator();
while (i.hasNext()){
System.out.println(i.next());
}
> entrySet() -> 遍歷 Key - Value 對
3、如何遍歷 Key - Value 對:
① 方式一
Set set1 = map.keySet();
for (Object obj : set1){
System.out.println("Key : " + obj + "<-->" + "Value: " + map.get(obj));
}
② 方式二
Set set2 = map.entrySet();
for (Object obj : set2){
Map.Entry entry = (Map.Entry) obj;
System.out.println(entry);
}
4、使用Properties處理屬性文件
@Test
public void test6() throws FileNotFoundException, IOException{
Properties pros = new Properties();
pros.load(new FileInputStream(new File("jdbc.properties")));
String user = pros.getProperty("user");
System.out.println(user);
String passWord = pros.getProperty("password"); System.out.println(password);
}
七、Collections 操作集合的工具類
* Collection 和 Collections 是有區別的
> Collections 可以操作 Collection 以及Map
1、常用方法:
> reverse(List),反轉List中元素的順序
> shuffle(List),對List 集合元素進行隨機排序
> sort(List),根據元素的自然順序對指定List 集合元素按升序排序
> sort(List,Comparator),根據指定的 Comparator 產生的順序對List 集合元素進行排序
> swap(List, int i, int j),將指定List 集合中的 i 處元素和 j 處元素進行交換
> Object max(Collection),根據元素的自然順序,返回給定集合中的最大元素
> Object max(Collection, Comparator),根據 Comparator 指定的順序,返回給定集合中的最大元素
> Object min(Collection),根據元素的自然順序,返回給定集合中的最小元素
> Object min(Collection, Comparator),根據 Comparator 指定的順序,返回給定集合中的最小元素
> int frequency(Collection, Object),返回指定集合中指定元素的出現次數
> void copy(List dest, List src),將 src 中的內容復制到 dest 中
> boolean replaceAll(List list, Object oldVal, Object newVal),使用新值替換 List 中的舊值