java集合—List 、 Set、 Map詳解

一、集合與數組

數組(可以存儲基本數據類型)是用來存現對象的一種容器,但是數組的長度固定,不適合在對象數量未知的情況下使用。

集合(只能存儲對象,對象類型可以不一樣)的長度可變,可在多數情況下使用。

二、集合

1、集合框架中不同的集合類有各種不同的數據結構,所以在使用中要根據應用的性能要求來選擇不同的集合類, Java集合中實際存放的只是對象的引用,每個集合元素都是一個引用變量,實際內容都放在堆內存或者方法區裏面,但是基本數據類型是在棧內存上分配空間的,棧上數據隨時就會被收回的。

  1. 基本類型數據如何解決呢?

可以通過包裝類把基本類型轉爲對象類型,存放引用就可以解決這個問題。更方便的,由於有了自動拆箱和裝箱功能,基本數據類型和其對應對象(包裝類)之間的轉換變得很方便,想把基本數據類型存入集合中,直接存就可以了,系統會自動將其裝箱成封裝類,然後加入到集合當中。

3、集合類存放在java.util包中,今後進行程序編程時將大量使用的集合類和相關接口,
如以下:

Iterable:迭代器接口

Collection:類集接口

List:列表接口

Set:數據集接口

Queue:隊列

Map:鍵-值對組合映射表

在這裏插入圖片描述
Iterable接口

實現改接口允許對象成爲“Foreach”語句的目標,即改集合對象允許迭代。
類集接口Collection是Iterable的子接口,所以所有類集對象可以迭代訪問,而映射Map不行。
方法
Iterator iterator()

功能: 返回一個在一組T類型的元素上進行迭代的迭代
在這裏插入圖片描述
迭代器是實現了Iterator/ListIterator 接口的類的對象,可以通過遍歷類集,訪問操作其中的每個元素。

ListIterator 擴展了父接口Iterator,允許雙向遍歷集合,並可以修改和刪除元素。

下面是ListIterator的方法介紹:

在這裏插入圖片描述
下面是Iterator和ListIterator遍歷區別:
在這裏插入圖片描述
打印結果爲:

使用Iterator迭代.
Amy Bob nCarl
使用ListIterator迭代

正向遍歷: Amy Bob nCarl

反向遍歷: nCarl Bob Amy

Collection接口定義的方法

Collection 層次結構 中的根接口。Collection 表示一組對象,這些對象也稱爲 collection 的元素。一些 collection 允許有重複的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。JDK 不提供此接口的任何直接 實現:它提供更具體的子接口(如 Set 和 List)實現。此接口通常用來傳遞 collection,並在需要最大普遍性的地方操作這些 collection。
在這裏插入圖片描述

List 、 Set、 Map

1、List(有序、可重複)

List接口擴展了Collection, List裏存放的對象時有序的,同時也是可以重複的,並且如果列表本身允許 null 元素的話,通常它們允許多個 null 元素。List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。因爲list集合裏插入或刪除數據時,會伴隨着後面數據的移動,所有插入刪除數據速度慢。

ArrayList.

優點: 底層數據結構是數組,查詢快,增刪慢。

缺點: 線程不安全,效率高

Vector.

優點: 底層數據結構是數組,查詢快,增刪慢。

缺點: 線程安全,效率低

LinkedList.

優點: 底層數據結構是鏈表,查詢慢,增刪快。

缺點: 線程不安全,效率高

2、Set(無序、不可重複)

Set接口擴展了Collection,Set集合存放的對象是無序,不能重複的,並且最多包含一個 null 元素。集合中的對象不按特定的方式排序,只是簡單地把對象加入集合中。

****HashSet.

底層數據結構是哈希表。(無序,唯一)

如何來保證元素唯一性?

1.依賴兩個方法:hashCode()和equals()

LinkedHashSet.

底層數據結構是鏈表和哈希表。(FIFO插入有序,唯一)

1.由鏈表保證元素有序

2.由哈希表保證元素唯一

TreeSet.

底層數據結構是紅黑樹。(唯一,有序)

  1. 如何保證元素排序的呢?

自然排序

比較器排序

2.如何保證元素唯一性的呢?

根據比較的返回值是否是0來決定

3、Map(鍵值對、鍵唯一、值不唯一)

映射(map)是一個存儲關鍵字/值對的對象。鍵不能重複,值可以重複。根據鍵得到值,給定一個關鍵字,可查詢得到它的值,關鍵字和值都可以是對象。映射不是Collection的子接口。所以它本身不能使用迭代器來進行遍歷。

針對collection集合我們到底該使用誰呢???

首選判斷是否重複?

沒有重複:

           用set

  排序麼?

          排序:TreeSet或LinkedHashSet

         不排序:HashSet

重複:

       用List

是否需要安全?

               安全:Vector
              不安全:ArrayList或則LinkedList

                            查詢多:ArrayList
                             增刪多:LinkedList

總結:

如果你知道該用Set,但是不知道用哪個實現類,就用HashSet。

如果你知道用LIst,但是不知道是哪個list,就用ArrayList。

如果你知道是Collection集合,但是不知道使用誰,就用ArrayList ;

如果你知道用集合,就用ArrayList.

參考文獻:https://blog.csdn.net/zhangqunshuai/article/details/80660974

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章