Day22 集合,ArrayList,泛型
Day22
集合:概念 ;使用(熟悉API);深入底層原理 ;專案中的應用 ;
1.集合含義
集合是Java API所提供的一系列類,可以用於動態存放多個物件 (集合只能存物件)
集合與陣列的不同在於,集合是大小可變的序列,而且元素型別可以不受限定,只要是引用型別。(集合只能儲存引用資料型別,不能放基本資料型別,但可以放基本資料型別的包裝類)
集合類全部支援泛型,是一種資料安全的用法。
集合就是一組資料的容器,存放多個資料 --> 陣列、集合
有些集合專門用於存放資料,有些集合專門用去排序,有些集合專門去重
集合:既要儲存資料,也要管理資料(增刪改查)
2.集合與陣列的不同
陣列:一旦初始化後長度不可變,元素型別受限定(String型別的陣列只能裝String的資料),陣列可以儲存基本資料型別
集合:長度可變的序列,元素型別不受限定(一個集合可以儲存多個資料型別的元素),集合只能儲存引用資料型別
3.Collection家族(儲存單個資料)add() remove()
List介面
特點:有序且可重複(因為List介面中新增了許多針對下標操作的方法)
實現類:
- ArrayList (底層 --> 一維陣列)
- LinkedList
- Vector
- Stack
Set介面
特點:無序且不可重複 (無序不代表隨機)
實現類:
- HashSet
- LinkedHashSet
- TreeSet
4.Map家族(儲存鍵值對 k-v)
注意:Map不能直接遍歷,但是可以間接遍歷
實現類:
- HashMap
- LinkedHashMap
- Hashtable
- ConcurrentHashMap
- TreeMap
- 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的使用泛型
泛型在專案中的應用
相關文章
- 泛型陣列列表ArrayList泛型陣列
- 泛型集合 list泛型
- 泛型集合 Queue泛型
- 集合框架-ArrayList儲存字串、自定義物件並遍歷泛型版框架字串物件泛型
- Java:Collection集合、泛型Java泛型
- Java集合和泛型Java泛型
- 集合框架-引入泛型框架泛型
- c#泛型集合C#泛型
- JAVA API:ArrayList(泛型類)基本使用JavaAPI泛型
- 07.集合和泛型泛型
- C# 泛型集合SortedListC#泛型
- 泛型方法、初始集合和集合的遍歷泛型
- Java 集合列舉泛型(一)Java泛型
- ajax 提交陣列 泛型集合陣列泛型
- 【ITOO】--陣列、集合、泛型解析陣列泛型
- 對於ArrayList中的泛型進行分析泛型
- Java反射給泛型集合賦值Java反射泛型賦值
- DataTable轉換list泛型集合(反射)泛型反射
- Java集合——ArrayListJava
- JAVA集合-ArrayListJava
- C# 泛型集合的自定義型別排序C#泛型型別排序
- Java入門教程十二(集合與泛型)Java泛型
- 集合框架-泛型類的概述及使用框架泛型
- 集合框架-泛型方法的概述和使用框架泛型
- 集合框架-泛型介面的概述和使用框架泛型
- Java 中的泛型 集合(List,Set) MapJava泛型
- C#類繼承自泛型集合C#繼承泛型
- 集合框架-通過Object轉型問題引入泛型框架Object泛型
- Java 集合之ArrayListJava
- Java集合之ArrayListJava
- 【Java集合】2 ArrayListJava
- Java集合(一) —— ArrayListJava
- 【java】【集合】去除ArrayList中的元素、ArrayList巢狀ArrayListJava巢狀
- Java 容器和泛型(2)ArrayList 、LinkedList和Vector比較Java泛型
- 集合框架-泛型高階之萬用字元框架泛型字元
- DataSet與泛型集合間的互相轉換泛型
- 8.集合、泛型、列舉、註解、反射泛型反射
- C#中將DataTable型別轉化為泛型集合C#型別泛型