1. 程式人生 > >JavaSE-16 集合框架

JavaSE-16 集合框架

lin 速度 沒有 cti border -a 存儲 keyset 指定位置

學習要點

  • 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集合存儲學生信息,並執行以下操作

  1. 學生對象信息:學號、姓名、年齡、性別、班級。
  2. 多個學生信息添加到集合中
  3. 查看學生的數量及所有學生的信息
  4. 刪除集合中部分學生的元素
  5. 判斷集合中是否包含指定學生

4 LinkedList操作數據

  • 插入、刪除操作頻繁時,可使用LinkedList來提高效率。
  • LinkedList特有的操作方法

方法名

說 明

void addFirst(Object o)

在列表的首部添加元素

void addLast(Object o)

在列表的末尾添加元素

Object getFirst()

返回列表中的第一個元素

Object getLast()

返回列表中的最後一個元素

Object removeFirst()

刪除並返回列表中的第一個元素

Object removeLast()

刪除並返回列表中的最後一個元素

上機練習 使用LinkedList集合存儲新聞對象信息,並執行以下操作

  1. 新聞對象信息:編號、標題、作者、內容、出版日期。
  2. 多條新聞信息添加到集合中
  3. 查看新聞的數量及所有新聞的信息
  4. 刪除頭條新聞
  5. 刪除最後一條新聞
  6. 把指定新聞添加到頭條

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

實現原理、功能相同,可以互用。

  1. Vector線程安全,ArrayList重速度輕安全,線程非安全。
  2. 長度需增長時,Vector默認增長一倍,ArrayList增長50%。

ArrayList

2 Hashtable和HashMap的異同

集合

相同

區別

Hashtable

實現原理、功能相同,可以互用。

  1. Hashtable繼承Dictionary類,HashMap實現Map接口。
  2. Hashtable線程安全,HashMap線程非安全
  3. Hashtable不允許null值,HashMap允許null值。

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 集合框架