集合
一.集合類體系結構
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);
}
}
}