天天看點

JavaSE 集合類(Collection接口,List接口,Map接口)Collection接口List集合(1)List接口(2)List接口的實作類Set集合Map集合

JavaSE 集合類(Collection接口,List接口,Map接口)Collection接口List集合(1)List接口(2)List接口的實作類Set集合Map集合

集合類就好比一個容器,比如說數組就是一個可以存放資料的容器,但是數組的長度是不可變的,集合類的長度卻是可變的。常用的集合有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);