----------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流!------------
集合類
Java語言的Java.util包提供了一些集合類,集合類中的繼承關系圖如下

1、 特點:
1.對象封裝資料,對象多了也需要存儲。集合用于存儲對象。
2.對象的個數确定可以使用數組,但是不确定怎麼辦?可以用集合。因為集合是可變長度的。
2、 集合和數組的差別:
1、數組是固定長度的;集合可變長度的。
2、數組可以存儲基本資料類型,也可以存儲引用資料類型;集合隻能存儲引用資料類型。
3、數組存儲的元素必須是同一個資料類型;集合存儲的對象可以是不同資料類型。
集合類中的接口
一、Collection接口:
1.List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。
2.Set:無序(存入和取出順序有可能不一緻),不可以存儲重複元素。必須保證元素唯一性。
1.Collection定義了集合架構的共性功能
1.添加
add(e);
addAll(collection);
2.删除
remove(e);
removeAll(collection);
clear();
3.判斷。
contains(e);
isEmpty();
4.擷取
iterator();
size();
5.擷取交集。
retainAll();
6.集合變數組。
toArray();
2、Liset接口:
List本身是Collection接口的子接口,具備了Collection的所有方法。
List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。list的子類如下:
1.ArrayList:底層的資料結構是數組,線程不同步,ArrayList替代了Vector,查詢元素的速度非常快。
2.LinkedList:底層的資料結構是連結清單,線程不同步,增删元素的速度非常快。
3.Vector:底層的資料結構就是數組,線程同步的,Vector無論查詢和增删都巨慢。
list中的共性方法
1.添加:
add(index,element) :在指定的索引位插入元素。
addAll(index,collection) :在指定的索引位插入一堆元素。
2.删除:
remove(index) :删除指定索引位的元素。 傳回被删的元素。
3.擷取:
get(int index) :通過索引擷取指定元素。
int indexOf(obj) :擷取指定元素第一次出現的索引位,如果該元素不存在傳回-1;
是以,通過-1,可以判斷一個元素是否存在。
int lastIndexOf(Object o) :反向索引指定元素的位置。
List subList(start,end) :擷取子清單。
4.修改:
set(index,element) :對指定索引位進行元素的修改。
5.擷取所有元素:
ListIterator listIterator():list集合特有的疊代器。
List集合支援對元素的增、删、改、查。
3.Set接口:
Set接口中的方法和Collection中方法一緻的。
1、HashSet:底層資料結構是哈希表,線程是不同步的。無序,高效;
HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。
當元素的hashCode值相同時,才繼續判斷元素的equals是否為true。
如果為true,那麼視為相同元素,不存。如果為false,那麼存儲。
如果hashCode值不同,那麼不判斷equals,進而提高對象比較的速度。
2、LinkedHashSet:有序,hashset的子類。
3、TreeSet:對Set集合中的元素的進行指定順序的排序。不同步。TreeSet底層的資料結構就是二叉樹
對于ArrayList集合,判斷元素是否存在,或者删元素底層依據都是equals方法。
對于HashSet集合,判斷元素是否存在,或者删除元素,底層依據的是hashCode方法和equals方法。
TreeSet:
用于對Set集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。
如果元素不具備比較性,在運作時會發生ClassCastException異常。
是以需要元素實作Comparable接口,強制讓元素具備比較性,複寫compareTo方法。
依據compareTo方法的傳回值,确定元素在TreeSet資料結構中的位置。
TreeSet方法保證元素唯一性的方式:就是參考比較方法的結果是否為0,如果return 0,視為兩個對象重複,不存。
TreeSet集合排序有兩種方式,Comparable和Comparator差別:
1:讓元素自身具備比較性,需要元素對象實作Comparable接口,覆寫compareTo方法。
2:讓集合自身具備比較性,需要定義一個實作了Comparator接口的比較器,并覆寫compare方法,并将該類對象作為實際參數傳遞給TreeSet集合的構造函數。
二、Map集合接口
1、HashMap:底層是哈希表資料結構,是線程不同步的。可以存儲null鍵,null值。替代了Hashtable.
2、TreeMap:底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。
1、map中的共性方法
1.添加
put(key,value):當存儲的鍵相同時,新的值會替換老的值,并将老值傳回。如果鍵沒有重複,傳回null。 void putAll(Map);
2.删除。
void clear():清空
value remove(key) :删除指定鍵
3.判斷。
boolean isEmpty():
boolean containsKey(key):是否包含key
boolean containsValue(value) :是否包含value
4.取出。
int size():傳回長度 value get(key) :通過指定鍵擷取對應的值。如果傳回null,可以判斷該鍵不存在。當然有特殊情況,就是在hashmap集合中,是可以存儲null鍵null值的
Collection values():擷取map集合中的所有的值。
5.想要擷取map中的所有元素:
原理:map中是沒有疊代器的,collection具備疊代器,隻要将map集合轉成Set集合,可以使用疊代器了。之是以轉成set,是因為map集合具備着鍵的唯一性,其實set集合 就來自于map,set集合底層其實用的就是map的方法。
2、把map集合轉成set的方法:
1.Set keySet();
2.Set entrySet();//取的是鍵和值的映射關系。
3、取出Map中元素的方式
1.方式一:keySet()方法。
可以将map集合中的鍵都取出存放到set集合中。對set集合進行疊代。疊代完成,再通過get方法對擷取到的鍵進行值的擷取。
Set keySet = map.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()) {
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
}
--------------------------------------------------------
2.方式二:entrySet()方法。
Set entrySet = map.entrySet();
Iterator it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry me = (Map.Entry)it.next();
System.out.println(me.getKey()+"::::"+me.getValue());
}
4、比較的兩種方式:
一個是Comparable:覆寫compareTo方法;
一個是Comparator:覆寫compare方法。
集合類接口的實作類
1、List接口實作類
在項目中建立Gather類,在主方法中建立集合對象,通過Math類的random()方法随機擷取集合中的某個元素,然後一出數組中索引為2的元素,最後周遊數組
import java.util.*;
public class Gather { // 建立類Gather
public static void main(String[] args) { // 主方法
List<String> list = new ArrayList<>(); // 建立集合對象
list.add("a"); // 向集合添加元素
list.add("b");
list.add("c");
int i = (int) (Math.random() * (list.size() - 1)); // 獲得0~1之間的随機數
System.out.println("随機擷取數組中的元素:" + list.get(i));
list.remove(2); // 将指定索引位置的元素從集合中移除
System.out.println("将索引是'2'的元素從數組移除後,數組中的元素是:");
for (int j = 0; j < list.size(); j++) { // 循環周遊集合
System.out.println(list.get(j));
}
}
}
2、Map接口實作類
通過HashMap類執行個體化Map集合,并周遊該Map集合,然後建立TreeMap執行個體實作将集合中的元素順序輸出
1.首先建立Emp類
public class Emp {
private String e_id;
private String e_name;
public Emp( String e_id,String e_name) {
this.e_id = e_id;
this.e_name = e_name;
}
public String getE_id() {
return e_id;
}
public void setE_id(String e_id) {
this.e_id = e_id;
}
public String getE_name() {
return e_name;
}
public void setE_name(String e_name) {
this.e_name = e_name;
}
2.建立一個用于廁所的主類
import java.util.*;
public class MapText { // 建立類MapText
public static void main(String[] args) { // 主方法
Map<String,String> map = new HashMap<>(); // 由HashMap實作的Map對象
Emp emp = new Emp("001", "張三");
Emp emp2 = new Emp("005", "李四"); // 建立Emp對象
Emp emp3 = new Emp("004", "王一");
map.put(emp.getE_id(), emp.getE_name());
map.put(emp2.getE_id(), emp2.getE_name()); // 将對象添加到集合中
map.put(emp3.getE_id(), emp3.getE_name());
Set<String> set = map.keySet(); // 擷取Map集合中的key對象集合
Iterator<String> it = set.iterator();
System.out.println("HashMap類實作的Map集合,無序:");
while (it.hasNext()) {
String str = (String) it.next();
String name = (String) map.get(str); // 周遊Map集合
System.out.println(str + " " + name);
}
TreeMap<String,String> treemap = new TreeMap<>(); // 建立TreeMap集合對象
treemap.putAll(map); // 向集合添加對象
Iterator<String> iter = treemap.keySet().iterator();
System.out.println("TreeMap類實作的Map集合,鍵對象升序:");
while (iter.hasNext()) { // 周遊TreeMap集合對象
String str = (String) iter.next(); // 擷取集合中的所有key對象
String name = (String) treemap.get(str); // 擷取集合中的所有values值
System.out.println(str + " " + name);
}
}
}