目錄
- 1 集合概述
- 2 Collection接口
-
- 2.1 Collection接口概述
- 2.2 Collection接口常用方法
-
- 2.2.1 List集合
-
- 2.2.1.1 List接口
- 2.2.1.2 List接口的實作類
- 2.2.1.3 List集合案例
- 2.2.2 Set集合
-
- 2.2.2.1 Set接口
- 2.2.2.2 Set接口的實作類
- 2.2.2.3 TreeSet接口案例
- 3 Map集合
-
- 3.1 概述
- 3.2 Map接口
- 3.3 Map接口的實作類
- 3.3.1 HashMap類
- 3.3.2 TreeMap類
1 集合概述
java.util包中提供了一些集合類,這些集合類又被稱為容器。
集合和數組的差別:
- 數組的長度是固定的,集合的長度是可變的。
- 數組存儲的是同一類型的元素,可以存儲基本類型;集合存儲的是對象的引用,對象類型可以不一緻,但不可以存儲基本類型。
集合按照其存儲結構可以分為兩大類,分别是單列集合
java.util.Collection
和雙列集合
java.util.Map
。
集合類的繼承關系如圖所示:
2 Collection接口
2.1 Collection接口概述
- 所有單列集合類的根接口,用于存儲一系列符合某種規則的元素,它有兩個重要的子接口,分别是
和java.util.List
。java.util.Set
-
的特點是元素有序、元素可重複,List
接口的主要實作類有List
和java.util.ArrayList
。java.util.LinkedList
-
的特點是元素無序,元素不可重複,Set
接口的主要實作類有Set
和java.util.HashSet
。java.util.TreeSet
在 Collection
接口定義着單列集合架構中最共性的内容。
2.2 Collection接口常用方法
Collection是所有單列集合的父接口,是以在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合。方法如下:
-
: 把給定的對象添加到目前集合中 。public boolean add(E e)
-
:清空集合中所有的元素。public void clear()
-
: 把給定的對象在目前集合中删除。public boolean remove(E e)
-
: 判斷目前集合中是否包含給定的對象。public boolean contains(E e)
-
: 判斷目前集合是否為空。public boolean isEmpty()
-
: 傳回集合中元素的個數。public int size()
-
: 把集合中的元素,存儲到數組中。public Object[] toArray()
代碼示例如下:
import java.util.ArrayList;
import java.util.Collection;
public class Demo1Collection {
public static void main(String[] args) {
// 建立集合對象
// 使用多态形式
Collection<String> coll = new ArrayList<String>();
// 使用方法
// 添加功能 boolean add(String s)
coll.add("小李廣");
coll.add("掃地僧");
coll.add("石破天");
System.out.println(coll);
// boolean contains(E e) 判斷o是否在集合中存在
System.out.println("判斷 掃地僧 是否在集合中"+coll.contains("掃地僧"));
//boolean remove(E e) 删除在集合中的o元素
System.out.println("删除石破天:"+coll.remove("石破天"));
System.out.println("操作之後集合中元素:"+coll);
// size() 集合中有幾個元素
System.out.println("集合中有"+coll.size()+"個元素");
// Object[] toArray()轉換成一個Object數組
Object[] objects = coll.toArray();
// 周遊數組
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
// void clear() 清空集合
coll.clear();
System.out.println("集合中内容為:"+coll);
// boolean isEmpty() 判斷是否為空
System.out.println(coll.isEmpty());
}
}
[小李廣, 掃地僧, 石破天]
判斷 掃地僧 是否在集合中true
删除石破天:true
操作之後集合中元素:[小李廣, 掃地僧]
集合中有2個元素
小李廣
掃地僧
集合中内容為:[]
true
2.2.1 List集合
- List集合中的元素允許重複,各元素的順序就是元素插入的順序。
- List集合包括List接口以及List接口的所有實作類。
類似數組,可通過使用索引來通路集合中的元素。
2.2.1.1 List接口
List接口繼承Collection接口,是以包含Collection中的所有方法。此外,List接口還定義了兩個非常重要的方法。
- get(int index):獲得指定索引位置的元素
- set(int index,Object obj):将集合中指定索引位置的對象修改為指定的對象
2.2.1.2 List接口的實作類
List接口的實作類有ArrayList和LinkedList。
- ArrayList類實作了可變的數組,允許儲存所有元素,包括null,并可以根據索引位置對集合進行快速的随機通路;缺點是向指定的索引位置插入對象或删除對象的速度較慢。
- LinkedList類采用連結清單結構儲存對象。這種結構的優點是向集合中插入和删除對象時效率較高,缺點是對于随機通路集合中的對象時效率較低。
2.2.1.3 List集合案例
使用List集合時通常聲明為List類型,可通過不同的實作類來執行個體化集合。
格式:
List<E> list1 = new ArrayList<>();
List<E> list2 = new LinkedList<>();
// E可以是合法的Java資料類型。例如,如果集合中的元素為字元串類型,那麼E可以修改為String。
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
// 建立集合對象
List<String> list = new ArrayList<>();
// 向集合添加元素
list.add("a");
list.add("b");
list.add("c");
// 獲得0-2之間的随機數
int i = (int)(Math.random()*list.size());
System.out.println("随機擷取數組中的元素:" + list.get(i));
// 将指定索引位置的元素從集合中移除
list.remove(2);
// 循環周遊集合剩下的元素
for(int j=0;j<list.size();j++){
System.out.println(list.get(j));
}
}
}
随機擷取數組中的元素:c
a
b
2.2.2 Set集合
- Set集合中的對象不按特定的方式排序,隻是簡單地把對象加入集合中,但Set集合不能包含重複對象。
- Set集合由Set接口和Set接口的實作類組成。
2.2.2.1 Set接口
Set接口繼承了Collection接口,是以包含Collection接口的所有方法。
2.2.2.2 Set接口的實作類
Set接口常用的實作類有HashSet類與TreeSet類。
- HashSet類實作Set接口,由哈希表(實際上是一個HashMap執行個體)支援。它不保證Set的疊代順序,特别是它不保證該順序恒久不變。此類允許使用null元素。
- TreeSet類不僅實作了Set接口,還實作了java.util.SortedSet接口,是以,TreeSet類實作的Set集合在周遊集合時可以按照自然順序遞增排序,也可以按照指定比較器遞增排序,即可以通過比較器對用TreeSet類實作的Set集合中的對象進行排序。TreeSet類新增的方法如下表所示:
TreeSet類新增方法:
方法 | 功能描述 |
---|---|
first() | 傳回此Set中目前第一個元素 |
last() | 傳回此Set中目前最後一個元素 |
comparator() | 傳回對此Set中的元素進行排序的比較器,如果此Set使用自然順序,則傳回null |
headSet(E toElement) | 傳回一個新的Set集合,新集合包含toElement(不包含)之前的所有對象 |
subSet(E fromElement, E toElement) | 傳回一個新的Set集合,新集合包含fromElement(包含)與toElement(不包含)之間的所有對象 |
tailSet(E fromElement) | 傳回一個新Set集合,新集合包含fromElement(包含)之後的所有對象 |
2.2.2.3 TreeSet接口案例
建立類UpdateStu,實作Comparable接口,重寫該接口中的compareTo()方法。
import java.util.Iterator;
import java.util.TreeSet;
public class UpdateStu implements Comparable<Object> {//建立類實作Comparable接口
String name;
long id;
public UpdateStu(String name,long id){//構造方法
this.id = id;
this.name = name;
}
public int compareTo(Object o) {
UpdateStu upstu = (UpdateStu)o;
int result = id>upstu.id?1:(id==upstu.id?0:-1);//參照代碼說明
return result;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id){
this.id = id;
}
public static void main(String[] args) {
UpdateStu stu1 = new UpdateStu("李同學", 01011);
UpdateStu stu2 = new UpdateStu("陳同學", 01021);
UpdateStu stu3 = new UpdateStu("王同學", 01051);
UpdateStu stu4 = new UpdateStu("馬同學", 01012);
TreeSet<UpdateStu> tree = new TreeSet<>();
tree.add(stu1);// 向集合添加對象
tree.add(stu2);
tree.add(stu3);
tree.add(stu4);
//Set集合中的所有對象的疊代器
Iterator<UpdateStu> it = tree.iterator();
System.out.println("Set集合中的所有元素:");
//周遊集合
while(it.hasNext()){
UpdateStu stu = (UpdateStu)it.next();
System.out.println(stu.getId() + " " + stu.getName());
}
//截取排在stu2對象之前的對象
it = tree.headSet(stu2).iterator();
System.out.println("截取前面部分的集合:");
//周遊集合
while(it.hasNext()){
UpdateStu stu = (UpdateStu)it.next();
System.out.println(stu.getId() + " " + stu.getName());
}
//截取排在stu2與stu3之間的對象
it = tree.subSet(stu2,stu3).iterator();
System.out.println("截取中間部分的集合:");
while(it.hasNext()) {
UpdateStu stu = (UpdateStu)it.next();
System.out.println(stu.getId() + " " + stu.getName());
}
}
}
Set集合中的所有元素:
521 李同學
522 馬同學
529 陳同學
553 王同學
截取前面部分的集合:
521 李同學
522 馬同學
截取中間部分的集合:
529 陳同學
存入TreeSet類實作的Set集合必須實作Comparable接口,該接口中的compareTo(Object o)方法比較此對象與指定對象。
3 Map集合
3.1 概述
- Map集合沒有繼承Collection接口,提供的是key到value的映射;
- Map中不能包含相同的key,每個key隻能映射一個value;
- Map集合包括Map接口以及Map接口的所有實作類;
- Map中的key決定了存儲對象在映射中的存儲位置,但不是由key本身決定的,而是通過一種“散列技術”進行處理,産生一個散列碼的整數值。散列碼通常用作一個偏移量,該偏移量對應配置設定給映射的記憶體區域的起始位置,進而确定存儲對象在映射中的存儲位置。
3.2 Map接口
- Map接口儲存一組成對的鍵-值對象,提供key(鍵)到value(值)的映射
- Map中的key不要求有序,不允許重複。value同樣不要求有序,但可以重複。
Map接口的常用方法:
方法 | 功能描述 |
---|---|
public V put(K key, V value) | 向集合中添加指定的key與value的映射關系 |
public boolean containsKey(Object key) | 如果此映射包含指定key的映射關系,則傳回true |
public boolean containsValue(Object value) | 如果此映射将一個或多個key映射到指定值,則傳回true |
public V get(Object key) | 如果存在指定的key對象,則傳回該對象對應的值,否則傳回null |
public Set< K > keySet() | 傳回該集合中的所有key對象形成的Set集合 |
public Collection< V > values() | 傳回該集合中所有值對象形成的Collection集合 |
public V remove(Object key) | 從集合中删除指定鍵的映射(如果存在) |
public boolean isEmpty() | 如果集合為空,則傳回 true |
public void clear() | 清空集合所有映射 |
public int size() | 傳回集合中鍵值映射的數量 |
代碼示例:
package 冒泡排序;
import java.util.*;
public class UpdateStu {
public static void main(String[] args) {
// 建立Map執行個體
Map<String,String> map = new HashMap<>();
// 向map中添加元素
map.put("01","李同學");
map.put("02","魏同學");
// 建構Map集合中所有key對象的集合
Set<String> set = map.keySet();
// 建立集合疊代器
Iterator<String> it = set.iterator();
System.out.println("key集合中的元素:");
// 周遊集合
while(it.hasNext()) {
System.out.println(it.next());
}
// 建構Map集合中所有values值的集合
Collection<String> coll = map.values();
it = coll.iterator();
System.out.println("Values集合中的元素:");
// 周遊集合
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
key集合中的元素:
01
02
Values集合中的元素:
李同學
魏同學
Map集合中允許值對象是null,而且沒有個數限制。例如,可通過map.put(“05”,null)向集合中添加對象。
3.3 Map接口的實作類
- Map接口的實作類有HashMap和TreeMap;
- 使用較多的是HashMap,因為由HashMap類實作的Map集合添加和删除映射關系效率更高。
- HashMap是基于哈希表的Map接口的實作,HashMap通過哈希碼對其内部的映射關系進行快速查找;而TreeMap中的映射關系存在一定的順序,如果希望Map集合中的對象也存在一定的順序,就使用TreeMap類。
3.3.1 HashMap類
- Hash類是基于哈希表的Map接口的實作;
- 此實作提供所有可選的映射操作,并允許使用null值和null鍵,但必須保證鍵的唯一性;
- HashMap通過哈希表對其内部的映射關系進行快速查找,此類不保證映射的順序,特别是不保證順序恒久不變;
3.3.2 TreeMap類
- TreeMap類不僅實作了Map接口,還實作了java.util.SortedMap接口,是以集合中的映射關系具有一定的順序;
- 但是,在添加、删除和定位映射關系時,TreeMap類比HashMap類性能稍差;
- 由于TreeMap類實作的Map集合中的映射關系是根據鍵對象按照一定順序排列的,是以不允許鍵對象是null。
可以通過HashMap類建立Map集合,當需要順序輸出時,再建立一個完成相同映射關系的TreeMap類執行個體。
代碼示例:
import java.util.*;
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;
}
}
public class MapTest {
public static void main(String[] args) {
// 由HashMap實作的Map對象
Map<String,String> map = new HashMap<>();
// 建立Emp對象
Emp emp1 = new Emp("351","張三");
Emp emp2 = new Emp("512","李四");
Emp emp3 = new Emp("853","王五");
Emp emp4 = new Emp("125","趙柳");
Emp emp5 = new Emp("341","黃芪");
// 将對象添加到集合中
map.put(emp4.getE_id(), emp4.getE_name());
map.put(emp5.getE_id(), emp5.getE_name());
map.put(emp1.getE_id(), emp1.getE_name());
map.put(emp2.getE_id(), emp2.getE_name());
map.put(emp3.getE_id(), emp3.getE_name());
// 擷取Map集合中的key對象集合
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
System.out.println("HashMap類實作的Map集合,無序:");
while(it.hasNext()) {
String str = it.next();
String name = map.get(str);
System.out.println(str + " " + name);
}
// 建立TreeMap集合對象
Map<String,String> treemap = new TreeMap<>();
// 向集合中添加對象
treemap.putAll(map);
Iterator<String> iter = treemap.keySet().iterator();
System.out.println("TreeMap類實作的Map集合,鍵對象升序:");
while(iter.hasNext()) {
String str = iter.next();
String name = map.get(str);
System.out.println(str + " " + name);
}
}
}
HashMap類實作的Map集合,無序:
341 黃芪
125 趙柳
512 李四
853 王五
351 張三
TreeMap類實作的Map集合,鍵對象升序:
125 趙柳
341 黃芪
351 張三
512 李四
853 王五