![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP35EeBRlT6FEROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5gDOxAzN1EjM5ETOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
集合類就好比一個容器,比如說數組就是一個可以存放資料的容器,但是數組的長度是不可變的,集合類的長度卻是可變的。常用的集合有Map集合,Set集合,List集合。
List與set繼承collection接口
Collection接口
Collection接口通常不能直接使用,但該接口提供了添加元素,删除元素,管理資料的方法。List接口和Set接口都繼承了Collection接口,是以他們能實作Collection的方法。I
構成Collection的機關稱為元素。
Collection常用方法如下
方法 | 功能 |
---|---|
add(E e) | 将指定的對象加到該集合中 |
remove(Object o) | 将指定對象從該集合中移除 |
isEmpty() | 傳回boolean值,用于判斷目前集合是否為空 |
iterator() | 傳回在此Collection的元素上的疊代器。用于周遊集合 |
size() | 傳回Int值,擷取該集合中元素的個數 |
利用iterator 周遊集合
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
Collection<String> list=new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> it=list.iterator();
while (it.hasNext()){ //判斷是否有下一個元素
String str=(String)it.next(); //擷取元素 Iterator 的next()方法傳回的是Object
System.out.println(str);
}
}
}
List集合
List集合包括List接口以及List接口的所有實作類
List集合中的元素允許重複,各元素的順序就是對象插入的順序。可以通過使用索引來通路集合中的元素。
(1)List接口
List接口包含Collection接口的所有方法,此外還有兩個重要方法
get(int index):擷取指定索引位置的元素
set(int index,Object obj):将集合中指定索引位置的對象修改為指定的對象
(2)List接口的實作類
List接口的常用實作類有ArrayList與LInkedList
ArrayList類:實作了可變數組,允許儲存所有的元素,包括null,并可以根據索引位置對集合進行快速的随機通路,缺點是向指定的索引位置插入對象或删除對象比較慢
LinkedList類:采用連結清單結構儲存對象。這種結構的優點是便于向集合中插入和删除對象,但對于随機通路集合中的對象效率比較低
兩個類的差異有點像C語言的連結清單順序結構和鍊式結構的差異
使用List集合時通常聲明為List類型,然後通過不同的類執行個體化集合
List<E> list=new ArrayList<>();
List<E> list=new LInkedList<>();
Set集合
Set集合中的對象不按特定的方式排序,Set集合中不能有重複對象。
Set集合由Set接口和Set接口的實作類組成。
Set接口繼承了Collection接口,是以包含Collection接口的所有方法
Set接口常用的實作類有HashSet類與TreeSet類
HashSet類實作Set接口,由哈希表(實際上是一個HashMap執行個體)支援。他不保證Set的疊代順序,特别是它不保證該順序一直不變。此類允許使用null元素
TreeSet類不僅實作了Set接口,還實作了java.until.SortedSet接口,是以,TreeSet類實作的Set集合在周遊集合時按照自然順序遞增順序,也可以按照比較器遞增排序,就是可以通過比較器對用TreeSet類實作的Set集合中的對象進行排序
TreeSet增加方法
方法 | 功能描述 |
---|---|
first() | 傳回此Set中目前第一個(最低)元素 |
last() | 傳回此Set中目前最後一個(最高)元素 |
comparator() | 傳回此Set中的元素進行排序的比較器。如果此Set使用自然排序,則傳回null |
headSet(E e) | 傳回一個新的Set集合,新集合是e(不包含)之前的所有對象 |
subSet(E f,E e) | 傳回一個新的集合,是從f(包含)到e(不包含)之間的所有對象 |
tailSet(E e) | 傳回一個新的集合,是從e(包含)之後的所有對象 |
package com.pkg;
import sun.reflect.generics.tree.Tree;
import java.util.Iterator;
import java.util.TreeSet;
public class Test implements Comparable<Object>{
String name;
long id;
public Test(String name,long id){
this.name=name;
this.id=id;
}
@Override
public int compareTo(Object o) { //比較此對象與指定對象的順序,如果該對象大于,等于或小于指定對象,分别傳回正整數,0,或負整數
Test t=(Test)o;
return id>t.id?1:(id==t.id?0:-1);
}
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) {
Test t1=new Test("小明",01011);
Test t2=new Test("小華",01021);
Test t3=new Test("李明",01051);
Test t4=new Test("張三",01012);
TreeSet<Test> tree=new TreeSet<>();
tree.add(t1);
tree.add(t2);
tree.add(t3);
tree.add(t4);
Iterator<Test> it=tree.iterator();
System.out.println("集合中所有元素:");
while (it.hasNext()){
Test t=(Test) it.next();
System.out.println(t.getId()+" "+t.getName());
}
it=tree.headSet(t2).iterator();
System.out.println("截取前面的元素");
while (it.hasNext()){
Test t=(Test) it.next();
System.out.println(t.getId()+" "+t.getName());
// System.out.println(((Test)it.next()).getId()+" "+((Test)it.next()).getName()); 别這麼寫
}
it=tree.subSet(t2,t3).iterator();
System.out.println("截取中間的元素");
while (it.hasNext()){
Test t=(Test) it.next();
System.out.println(t.getId()+" "+t.getName());
}
}
}
輸出結果:(按照id大小排序)
521 小明
522 張三
529 小華
553 李明
截取前面的元素
521 小明
522 張三
截取中間的元素
529 小華
Map集合
Map集合沒有繼承Collection接口,其提供key到value的映射。Map中不能包含相同的key,每個key隻能映射一個value.key還決定了存儲對象在影射中的存儲位置,但不是由key對象本身決定的,是通過散列進行處理,産生一個散列碼的整數值。散列碼通常用作一個偏移量,該偏移量對應配置設定給映射的記憶體區域的起始位置,進而決定存儲對象在映射中的存儲位置。
Map集合包括Map接口以及Map接口的所有實作類
(1)Map接口
方法 | 功能 |
---|---|
put(K key,V value | 向集合中添加指定key與value的映射關系 |
containsKey(Object key) | 如果集合中包含指定key大的映射關系,則傳回true |
containsValue(Object value) | 如果此映射将将一個或多個key映射到指定值,則傳回true |
get(Object key) | 傳回key對應的對應值,否則傳回null |
keySet() | 傳回該集合中所有key對象形成的Set集合 |
values() | 傳回該集合中所有值對象形成的Collection集合 |
import java.util.*;
public class Test {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("01","小明");
map.put("02","小李");
map.put("03","小華");
Set<String> set=map.keySet();
Iterator<String> it=set.iterator();
System.out.println("key集合所有元素");
while (it.hasNext()){
String s=(String)it.next();
System.out.println(s);
}
Collection<String> collection=map.values();
it=collection.iterator();
System.out.println("values集合所有元素");
while (it.hasNext()){
String s=(String)it.next();
System.out.println(s);
}
}
}
輸出結果:
key集合所有元素
01
02
03
values集合所有元素
小明
小李
小華
Map接口所實作的類
Map接口實作的類有HashMap和TreeMap.建議使用HashMap類實作Map接口
HashMap類實作的Map集合添加和删除的效率更高.HashMap是基于哈希表的Map接口實作,HashMap通過哈希碼對其内部的映射關系進行快速查找,而TreeMap中的映射關系存在一定的順序,
HashMap類允許使用null值和null鍵,但必須保證鍵的唯一性。
TreeMap類不允許鍵對象是null
有一個putAll()方法可以将HashMap類直接添加進TreeMap
Map<K key,V value> map=new HashMap<>();
TreeMap<K key,V value> treeMap=new TreeMap<>();
treemap.putAll(map);