天天看點

Java—集合(collection List set 泛型 Map)集合

集合

一.集合類體系結構

1.Collection (單列)—>>List(可重複)—>>ArryList

—>>Linklist

—>>set(不可重複)—>>HashSet

—>>TreeSet

2.Map 雙列—>>HashAap

Collection,Map, List,set是接口,4個是實作類

後面的可以使用前面類裡的方法

二.collection集合

1.概述及常用方法

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-jX4PQAAl-1628557065759)(D:\2645981073\FileRecv\MobileFile\Screenshot_2021-08-07-21-29-44-495_tv.danmaku.bil.jpg)]

Arrylist重寫了tosrting

add , remove(有重複删除第一個), clear, contains(判斷是否存在指定元素), isEmpty,size

2.collection集合的周遊

疊代器:iteartor 集合專用周遊

用.iteartor方法獲得疊代器 是用了Iitearto的實作類

兩個常用方法:

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-p9vznz8G-1628557065761)(D:\2645981073\FileRecv\MobileFile\Screenshot_2021-08-07-21-55-55-057_tv.danmaku.bil.jpg)]

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-tK7hP2Pi-1628557065763)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\image-20210807220642894.png)]

三.List

1.List集合概述和特點

  • 有序集合,精确控制插入位置,索引通路元素
  • 與set不同,清單通常允許重複的元素

    特點:有序 可重複

  • 特有方法:增,删,改,查,增加了索引(不能越界)

    索引周遊

2.并發修改異常

疊代器 循環清單時 增删元素報錯 可以通過for和.size方法

3. Listiteartor

  • 前後方向都可 previous 傳回上一個元素
  • 疊代期間可以修改清單 使用清單疊代器的add方法 無并發修改異常

4.增強for語句

  • 内部原理是一個iteartor疊代器

List集合子類特點

  • ArryList底層是數組 查找快 增删慢
  • LinkedList底層是連結清單 特有方法:增,查,删開頭和末尾

四.set

  • 無重複元素 重複元素不會加進去
  • 無索引,不能普通for循環周遊
  • 對疊代順序不作保證

1.HashSet

底層資料結構是哈希表 JDK8之前是數組+連結清單

  • 同一對象哈希值一樣 hashcode
  • 可以通過方法重寫改變哈希值
  • 儲存時先比哈希值再比内容 都相同時不會儲存
  • 自定義的類需要重寫hashcode和equals(自動生成) 才能保證不會重複儲存

2.LinkedHashSet集合概述和特點

  • 哈希表和連結清單實作的set接口
  • 元素不重複 ,疊代有次序(取和存順序一樣)

3.TreeSet集合概述和特點

  • 它的元素是排序的,可以是natural ordering(自然排序) ,或Comparator(比較器排序)這取決于所使用的構造方法
TreeSet() //構造一個新的空樹集,根據其元素的自然順序進行排序。  
TreeSet(Comparator<? super E> comparator) //構造一個新的空樹集,根據指定的比較器進行排序。  
           
  • 無索引,不能普通for周遊
  • 無重複 ,有排序

    自然順序Comparable的使用

    TreeSet無參構造

    自然順序就是讓元素所屬的類實作Comparable<類名>接口

    然後,重寫compareTo

    compareTo中return 1,就是添加的順序排序 ;-1就是添加的倒序排序;0,隻存第一個

    *** 比較器裡return 0時會認為是相同元素,不會儲存****

    要注意主要條件和次要條件都寫

    this是後面要加入的那個對象 s是傳進來比較的前面那個對象

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-L5G6TejH-1628557065764)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\image-20210808213003447.png)]

    比較器comparator的使用

    ​ TreeSet帶參構造

    在需要參數的地方 new一個comparator(匿名内部類)直接重寫compare方法

    compare方法裡s1是後面要加入的那個對象,s2是前面的那個對象

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-JR2lD3lg-1628557065765)(D:\2645981073\FileRecv\MobileFile\Screenshot_2021-08-08-21-40-10-797_tv.danmaku.bil.jpg)]

應用

  • 成績排序(注意要注意主要條件和次要條件都寫)
  • 不重複的随機數

五.泛型

  • 運作時異常提前到編譯期
  • 避免了強制類型轉換

1.泛型類

public class GenericDemo {
    public static void main(String[] args) {
        Generic<String> g1=new Generic<String>();
        g1.setT("張三");
        System.out.println(g1.getT());

        Generic<Integer> g2=new Generic<Integer>();
        g2.setT(30);
        System.out.println(g2.getT());
    }
}
           
public class Generic<T> {
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}
           

2.泛型方法

與重載類似

public class Generic {
    public<T> void show(T t){
        System.out.println(t);
    }
}
           
public static void main(String[] args) {
    Generic g1 = new Generic();
    g1.show("張三");
    g1.show("1324");
}
           

3.泛型接口

public static void main(String[] args) {
    GenreicImpl<String> g1 = new GenreicImpl<String>();
    g1.show("張三");
    GenreicImpl<Integer> g2 = new GenreicImpl<Integer>();
    g2.show(123465);
}
           
public class GenreicImpl<T> implements Generic<T> {

    @Override
    public void show(T t) {
        System.out.println(t);
    }
}
           
public interface Generic<T> {
    void show(T t);
}
           

4.泛型通配符

  • List<?>:表示元素類型未知的List,它的元素可以比對任何的類型
  • 這種帶通配符的List僅表示它是各種泛 型List的父類,并不能把元素添加到其中
  • 類型通配符 上限: <?extends 類型> List<? extends Number>:它表示的類型是Number或者其子類型
  • 類型通配符下限: <?super 類型> List<? super Number>:它表示的類型是Number或者其父類犁

5.可變參數

邏輯:每個參數都封裝在數組裡面了

範例: public static int sum(int…a){ } 就是一個數組 可以傳進去n個int

public static int sum(int b,int…a){ } //可以這樣使用 多個參數 可變參數放在最後

  • Arrays工具類裡的靜态方法

static List asList(T… a) 傳回由指定數組支援的固定大小的清單。

List<String> list =Arrays.asLIst("hello","world");
無法使用list.add和list.remove,因為大小已經固定,可以用set(1,"java");
           
  • List接口中有一個靜态方法

static List of(E… elements) 傳回包含任意數量元素的不可修改清單。

List<String> list = List.of("hello","world");
無法使用list.add和list.remove和list.set
           
  • set接口中有一個靜态方法

static Set of(E… elements) 傳回包含任意數量元素的不可修改集。

Set<String> set = Set.of("hello","world");
Set<String> set = Set.of("hello","world","world");<--錯誤  不可重複
           

六.Map

1.概述

  • Interface Map<K,V>, K:鍵的類型 V:值的類型 kay和value
  • 地圖不能包含重複的鍵; 每個鍵最多可以映射一個值。
  • 舉例:學号對應姓名
public class MapDemo {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();

        //添加方法
        map.put("001","a");
        map.put("002","b");
        map.put("003","c");
		map.put("003","d");<<——錯誤 會覆寫上一個003
        System.out.println(map);

    }
}
           

2.Map的基本功能

put,remove(傳回V),clear,containsKey(是否包含指定鍵),containsValue(是否包含指定值),isEmpy,size,

3.Map的擷取功能

Set<K> keySet() 傳回所有鍵的集合
	V get(Object key) 傳回指定鍵映射到的值,如果此映射不包含鍵的映射,則傳回 null 。  
	Collection<V> values()  擷取所有值的集合
           

4.Map集合的周遊

周遊直接sout也行,主要是了解方法

方式一:

public class MapDemo {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();//這裡的String 可以是自己建立的對象

        //添加方法
        map.put("001","a");
        map.put("002","b");
        map.put("003","c");

        Set<String> keyset = map.keySet();

        for (String key : keyset){
            System.out.println(key +","+map.get(key));
        }
    }
}
           

方式二:

public class MapDemo {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();

        //添加方法
        map.put("001","a");
        map.put("002","b");
        map.put("003","c");

        Set<String> keyset = map.keySet();

        //擷取所有鍵值對對象 的集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for(Map.Entry<String, String> me :entrySet){
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key+value);
        }
    }
}
     //擷取所有鍵值對對象 的集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for(Map.Entry<String, String> me :entrySet){
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key+value);
        }
    }
}