Day22 集合,ArrayList,泛型

A 北枝發表於2024-03-05

Day22

集合:概念 ;使用(熟悉API);深入底層原理 ;專案中的應用 ;

在這裡插入圖片描述

1.集合含義

  1. 集合是Java API所提供的一系列類,可以用於動態存放多個物件 (集合只能存物件)

  2. 集合與陣列的不同在於,集合是大小可變的序列,而且元素型別可以不受限定,只要是引用型別。(集合只能儲存引用資料型別,不能放基本資料型別,但可以放基本資料型別的包裝類)

  3. 集合類全部支援泛型,是一種資料安全的用法。

  4. 集合就是一組資料的容器,存放多個資料 --> 陣列、集合

    有些集合專門用於存放資料,有些集合專門用去排序,有些集合專門去重

  5. 集合:既要儲存資料,也要管理資料(增刪改查)

2.集合與陣列的不同

陣列:一旦初始化後長度不可變,元素型別受限定(String型別的陣列只能裝String的資料),陣列可以儲存基本資料型別

集合:長度可變的序列,元素型別不受限定(一個集合可以儲存多個資料型別的元素),集合只能儲存引用資料型別

3.Collection家族(儲存單個資料)add() remove()

List介面

特點:有序且可重複(因為List介面中新增了許多針對下標操作的方法)

實現類:

  1. ArrayList (底層 --> 一維陣列)
  2. LinkedList
  3. Vector
  4. Stack

Set介面

特點:無序且不可重複 (無序不代表隨機)

實現類:

  1. HashSet
  2. LinkedHashSet
  3. TreeSet

4.Map家族(儲存鍵值對 k-v)

注意:Map不能直接遍歷,但是可以間接遍歷

實現類:

  1. HashMap
  2. LinkedHashMap
  3. Hashtable
  4. ConcurrentHashMap
  5. TreeMap
  6. Properties

注意:Collection,Map都是介面

5.接觸ArrayList

感受一個集合可以儲存多個型別的資料!!!

經驗:平時不會將多個資料型別的資料存入一個集合中,因為不好管理

public class Test01 {
	public static void main(String[] args) {
		
		ArrayList list = new ArrayList();
		
		list.add(100);//Integer.valueOf(100)
		list.add(123.123);//Double.valueOf(123.123)
		list.add("abc");
		
	}
}

6.ArrayList的使用

注意:

集合一旦定義了泛型,就規定了集合儲存元素的型別

所以說泛型是一種資料安全的做法

public class Test02 {
	public static void main(String[] args) {
		
		//建立ArrayList集合的物件
		ArrayList<String> list = new ArrayList<>();//<String> --> 泛型
		
		//新增元素
		list.add("小彭");
		list.add("小光");
		list.add("小麗");
		list.add("小楊");
		list.add("小王");
		list.add("小李");
		list.add("小古");
		
		//設定指定下標上的元素
		list.set(1, "小張");
		
		//獲取指定下標上的元素
		String str = list.get(1);
		System.out.println("獲取指定下標上的元素:" + str);//小張
		
		//獲取元素個數
		int size = list.size();
		System.out.println("獲取元素個數:" + size);//7
		
		//將元素新增到指定下標的位置
		list.add(4, "小北");
		
		ArrayList<String> newList1 = new ArrayList<>();
		Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用Collections工具類給集合做批次新增
		list.addAll(newList1);//將newList1中所有的元素新增到list集合的末尾
		
		ArrayList<String> newList2 = new ArrayList<>();
		Collections.addAll(newList2, "xxx","yyy","zzz","zzz");//利用Collections工具類給集合做批次新增
		list.addAll(4, newList2);//將newList2中所有的元素新增到list集合指定下標的位置
		
		//清空集合中所有的元素
		//list.clear();
		
		System.out.println("判斷集合中是否包含指定元素:" + list.contains("小張"));//true
		System.out.println("判斷集合中是否包含子集合中所有的元素:" + list.containsAll(newList1));//true
		
		System.out.println("獲取集合中第一次出現該元素的下標:" + list.indexOf("ccc"));//13
		System.out.println("獲取集合中最後一次出現該元素的下標:" + list.lastIndexOf("ccc"));//14
		
		System.out.println("判斷集合中是否沒有元素:" + list.isEmpty());//false
		
		list.remove(0);//根據下標刪除元素
		list.remove("小光");//根據元素刪除元素
		list.removeAll(newList1);//刪除list中包含newList1的元素(去除交集)
		
		list.retainAll(newList2);//保留list中包含newList2的元素(保留交集)
		
		List<String> subList = list.subList(1, 3);//擷取開始下標(包含)到結束下標(排他)處的元素,返回新的List集合
		
		//將集合轉成陣列
		Object[] objs = subList.toArray();
		System.out.println(Arrays.toString(objs));
		
		//將集合轉成陣列
		String[] ss = new String[2];
		subList.toArray(ss);
		System.out.println(Arrays.toString(ss));
		
		System.out.println("--------------------------------");
		
		//遍歷資料 -- for迴圈
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		System.out.println("--------------------------------");
		
		//遍歷資料 -- foreach
		for (String element : list) {
			System.out.println(element);
		}
		
		System.out.println("--------------------------------");
		
		//遍歷資料 -- Iterator
		Iterator<String> it = list.iterator();
		while(it.hasNext()){//判斷是否有可迭代的元素
			
			String element = it.next();//返回下一個元素
			System.out.println(element);
		}
		
		System.out.println("--------------------------------");
		
		//遍歷資料 -- ListIterator
		ListIterator<String> listIterator = list.listIterator();
		while(listIterator.hasNext()){//判斷是否有可迭代的元素(看後面有沒有元素,有就繼續)
			
			String element = listIterator.next();//返回下一個元素
			System.out.println(element);
		}
		
	}
}

7.泛型

含義:資料安全的做法

E - element - 元素

T - type - 型別

K - key - 鍵

V - value - 值

注意:泛型可以設定多個,使用逗號隔開

ps:public class HashMap<K,V>{}

泛型限定:規定了泛型型別的範圍

?表示什麼型別都可以

? extends A 表示元素必須是A類或A的子類

? super A 表示元素必須是A類或A的父類

public class A{

}
public class B extends A{

}
public class Test01 {
	public static void main(String[] args) {
	}
	
	//?表示任何型別
	public ArrayList<?> method01(){
		
		//ArrayList<Object> list = new ArrayList<>();
		//ArrayList<String> list = new ArrayList<>();
		//ArrayList<Integer> list = new ArrayList<>();
		//ArrayList<A> list = new ArrayList<>();
		ArrayList<B> list = new ArrayList<>();
		
		return list;
	}
	
	//? extends A 表示A類或其子類
	public ArrayList<? extends A> method02(){
		
		//ArrayList<A> list = new ArrayList<>();
		ArrayList<B> list = new ArrayList<>();
		
		return list;
	}
	
	//? super A 表示A類或其父類
	public ArrayList<? super A> method03(){
		
		//ArrayList<A> list = new ArrayList<>();
		ArrayList<Object> list = new ArrayList<>();
		
		return list;
	}
}

7.1 泛型在專案中的應用

需求:編寫通用的管理系統的介面

分析:
學生管理系統 – 管理學生
淘寶後臺管理系統 – 管理使用者
OA管理系統 – 管理員工

public class Test01 {
	public static void main(String[] args) {
		
		//使用者管理系統 -- 管理的是使用者物件
		UserManagerSystem ums = new UserManagerSystem();
		ums.add(new User());
		
		System.out.println("----------------------");
		
		//圖書管理系統 -- 管理的是書名
		BookManagerSystem<String> bms1 = new BookManagerSystem<>();
		bms1.add("Java從入門到精通");
		bms1.add("MySQL從刪庫到跑路");
		
		//圖書管理系統 -- 管理的是圖書類別
		BookManagerSystem<String> bms2 = new BookManagerSystem<>();
		bms2.add("小說類");
		bms2.add("科技類");
		bms2.add("歷史類");
	}
}

使用者管理:

//管理系統的介面
public interface ManagerSystem<T> {

	public int add(T t);
	
	public int delete(T t);
	
	public int update(T t,int type,Object val);
	
	public int getElementIndex(T t);
	
	public T getElement(T t);	
	
}
public class User {

}
//使用者管理系統
public class UserManagerSystem implements ManagerSystem<User>{

	@Override
	public int add(User t) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int delete(User t) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int update(User t, int type, Object val) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getElementIndex(User t) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public User getElement(User t) {
		// TODO Auto-generated method stub
		return null;
	}

}

圖書管理:

public class Book {

}
public class BookManagerSystem<T> implements ManagerSystem<T> {

	@Override
	public int add(T t) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int delete(T t) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int update(T t, int type, Object val) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getElementIndex(T t) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public T getElement(T t) {
		// TODO Auto-generated method stub
		return null;
	}

}

注意

1.Collection 與 Map的區別

Collection 存單個值,可以獲取迭代器進行遍歷

Map存兩個值(Key-Value),不可以獲取迭代器,不能遍歷(Map可以間接遍歷)

注意:Collection家族有迭代器,迭代器用於遍歷集合;Map家族是沒有迭代器,以為著Map家族不能遍歷集合,但是可以間接遍歷

2.理解Set為什麼是無序

無序:存入順序和取出順序不一致,無序不等於隨機

3.ArrayList 與 LinkedList的區別

使用上的區別:

​ LinkedList新增了

​ 佇列模式-先進先出(removeFirst())

​ 棧模式-先進後出(removeLast())

效率上的區別:

ArrayList底層資料結構是一維陣列

LinkedList底層資料結構是雙向連結串列

​ 新增 - 不擴容的情況:ArrayList快

​ 新增 - 擴容的情況:LinkedList快

​ 刪除:LinkedList快

​ 查詢:ArrayList快

​ 修改:ArrayList快

​ 注意:工作中常用ArrayList,因為很多需求都需要使用查詢功能,ArrayList查詢更快

總結

集合
概念
Collection vs Map
List vs Set
ArrayList的使用

泛型

​ 泛型在專案中的應用

相關文章