JavaSE-16 集合框架
學習要點
- Java集合框架內容
- ArrayList和LinkedList
- HashMap
- Iterator
- 泛型集合
Java的集合框架
1 概述
數據結構是以某種形式將數據組織在一起的集合,它不僅存儲數據,還支持訪問和處理數據的操作。
數據結構對程序設計有著深遠的影響,在面向過程的C語言中,數據庫結構用struct來描述,而在面向對象的編程中,數據結構是用類來描述的,並且包含有對該數據結構操作的方法。
在Java語言中,Java語言的設計者對常用的數據結構和算法做了一些規範(接口)和實現(具體實現接口的類)。所有抽象出來的數據結構和操作(算法)統稱為Java集合框架(JavaCollectionFramework)。
在Java 2之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴展的容器類,比如Vector,Stack,Hashtable等。這些容器類在使用的過程中由於效率問題飽受詬病,因此在Java 2中,Java設計者們進行了大刀闊斧的整改,重新設計,於是就有了現在的集合框架。需要註意的是,之前的那些容器類庫並沒有被棄用而是進行了保留,主要是為了向下兼容的目的,平時盡量少用。
在編寫Java程序在具體應用時,不必考慮數據結構和算法實現細節,只需要用這些類創建出來一些對象,然後直接應用就可以了,這樣就大大提高了編程效率。
Java集合框架提供了一套性能優良、使用方便的接口和類,它們位於java.util包中。
2 Java集合框架圖
3 Java集合框架簡化圖
4 Collection接口
Collection 接口存儲一組不唯一,無序的對象
List 接口存儲一組不唯一,有序(插入順序)的對象
Set 接口存儲一組唯一,無序的對象
5 Map接口
Map接口存儲一組鍵值對象,提供key到value的映射。
List接口實現類
1 ArrayList
ArrayList實現了長度可變的數組,在內存中分配連續的空間。遍歷元素和隨機訪問元素的效率比較高。
2 LinkedList
LinkedList采用鏈表存儲方式。插入、刪除元素時效率比較高。
3 ArrayList操作數據
- List接口提供的常用操作方法
方法名 |
說 明 |
boolean add(Object o) |
在列表的末尾順序添加元素,起始索引位置從0開始。 |
void add(int index,Object o) |
在指定的索引位置添加元素。索引位置必須介於0和列表中元素個數之間。 |
int size() |
返回列表中的元素個數。 |
Object get(int index) |
返回指定索引位置處的元素。取出的元素是Object類型,使用前需要進行強制類型轉換。 |
boolean contains(Object o) |
判斷列表中是否存在指定元素。 |
boolean remove(Object o) |
從列表中刪除元素。 |
Object remove(int index) |
從列表中刪除指定位置元素,起始索引位置從0開始。 |
演示:使用ArrayList集合存儲學生信息,並執行以下操作
- 學生對象信息:學號、姓名、年齡、性別、班級。
- 多個學生信息添加到集合中
- 查看學生的數量及所有學生的信息
- 刪除集合中部分學生的元素
- 判斷集合中是否包含指定學生
4 LinkedList操作數據
- 插入、刪除操作頻繁時,可使用LinkedList來提高效率。
- LinkedList特有的操作方法
方法名 |
說 明 |
void addFirst(Object o) |
在列表的首部添加元素 |
void addLast(Object o) |
在列表的末尾添加元素 |
Object getFirst() |
返回列表中的第一個元素 |
Object getLast() |
返回列表中的最後一個元素 |
Object removeFirst() |
刪除並返回列表中的第一個元素 |
Object removeLast() |
刪除並返回列表中的最後一個元素 |
上機練習 :使用LinkedList集合存儲新聞對象信息,並執行以下操作
- 新聞對象信息:編號、標題、作者、內容、出版日期。
- 多條新聞信息添加到集合中
- 查看新聞的數量及所有新聞的信息
- 刪除頭條新聞
- 刪除最後一條新聞
- 把指定新聞添加到頭條
Map接口實現類
1 HashMap
Map接口專門處理鍵值映射數據的存儲,可以根據鍵實現對值的操作。最常用的實現類是HashMap。
Map接口常用方法
方法名 |
說 明 |
Object put(Object key, Object val) |
以“鍵-值對”的方式進行存儲 |
Object get (Object key) |
根據鍵返回相關聯的值,如果不存在指定的鍵,返回null |
Object remove (Object key) |
刪除由指定的鍵映射的“鍵-值對” |
int size() |
返回元素個數 |
Set keySet () |
返回鍵的集合 |
Collection values () |
返回值的集合 |
boolean containsKey (Object key) |
如果存在由指定的鍵映射的“鍵-值對”,返回true |
上機練習 :使用Map存儲元素
需求描述:建立姓名和學生對象之間的鍵值映射,並通過key和value進行操作,如何實現數據的存儲和操作?
2 遍歷Map集合
方法1:通過叠代器Iterator實現遍歷
獲取Iterator :Collection 接口的iterate()方法
Iterator的方法:
- boolean hasNext(): 判斷是否存在另一個可訪問的元素。
- Object next(): 返回要訪問的下一個元素。
示例代碼:
/* 1、創建多個學生對象*/ Student zs = new Student("張三", "大一"); Student ls = new Student("李四", "大二"); Student ww = new Student("王五", "大三"); Student zl = new Student("趙六", "大四"); /* 2、創建Map集合對象並把多個學生對象放入其中*/ Map studentMap=new HashMap(); studentMap.put(zs.getName(),zs); studentMap.put(ls.getName(),ls); studentMap.put(ww.getName(),ww); studentMap.put(zl.getName(),zl); /*3、通過叠代器依次輸出集合中所有學生的信息*/ System.out.println("使用Iterator遍歷,所有學生的姓名和年級分別是:"); Set keys=studentMap.keySet();//取出所有key的集合 Iterator it=keys.iterator();//獲取Iterator對象 while(it.hasNext()){ String key=(String)it.next(); //取出key Student stu=(Student)studentMap.get(key); //根據key取出對應的值 System.out.println(key+"\t"+stu.getGrade()); }
方法2:增強型for循環
示例代碼:
//使用foreach語句輸出集合中所有學生的信息 for(Object key:keys){ Student stu=(Student)studentMap.get(key); //根據key取出對應的值 System.out.println(key+"\t"+stu.getGrade()); }
上機練習3:遍歷學生Map集合
集合類對比
1 Vector和ArrayList的異同
集合 |
相同 |
區別 |
Vector |
實現原理、功能相同,可以互用。 |
|
ArrayList |
2 Hashtable和HashMap的異同
集合 |
相同 |
區別 |
Hashtable |
實現原理、功能相同,可以互用。 |
|
HashMap |
3 建議
開發過程中,推薦使用ArrayList和HashMap。
泛型集合
1 問題
List和Map在存儲數據時候,發生裝箱操作,所有數據類型都轉換成Object類型。當取出的時候需要拆箱,可能導致數據類型轉換失敗。
例如:
List的get(int index)方法獲取元素
Map的get(Object key)方法獲取元素
Iterator的next()方法獲取元素
2 解決方案
泛型:JDK5.0使用泛型改寫了集合框架中的所有接口和類,使之實現參數化類型。
參數化類型:parameterized type。也稱為泛型(Generic)。
泛型保證數據存取的時候不再進行裝箱和拆箱的操作,避免類型轉換失敗,保證數據類型的安全。
例如:
List<Student> list = new ArrayList<Student>(); //jdk1.7以後支持菱形寫法 // List<Student> list = new ArrayList<>(); Map<String,Student> stuMap=new HashMap<String,Student>(); // Map<String,Student> stuMap=new HashMap<>(); Set<String> keys=stuMap.keySet(); //取出所有key的集合 Iterator<String> it=keys.iterator();
上機練習:使用泛型改造上機練習1-3
JavaSE-16 集合框架