當前位置:成語大全網 - 漢語詞典 - java中列表、集合和映射的區別

java中列表、集合和映射的區別

集合、列表和地圖的區別

有三種主要類型的java集合:

集合(集合)

列表(列表)

地圖(地圖)

要深入了解集合,我們必須先了解熟悉的數組:

數組大小固定,同壹數組只能存儲同壹類型(基本類型/引用類型)的數據,而JAVA集合可以存儲和操作壹組數量可變的數據。所有的JAVA集合都位於java.util包中!JAVA集合只能存儲引用類型的數據,不能存儲基本數據類型的數據。

簡單說壹下集合和數組的區別:(參考文章:《算法中的思維》03。數據結構數組)

[html]查看純文本打印?

& ltspan style="font-family:微軟雅黑;font-size:12px;"& gt世界上本來沒有集合(只有數組是指C語言),但是有人要,於是就有了集合。

有些人希望有壹個可以自動擴展的數組,於是就有了List。

有些人希望有重復的數組,所以他們設置了。

有些人想讓組的數量自動排序,所以他們有treeset,treelist和tree * *

而且幾乎所有的集合都是基於數組的。

因為集合是數組的封裝,所以數組總是比任何集合都快。

但是任何集合提供的功能都比數組多。

壹:數組聲明它包含的元素的類型,而集合不聲明。這是因為集合以對象的形式存儲它們的元素。

二:數組實例大小固定,不能縮放。集合可以根據需要動態調整大小。

三:數組是可讀/寫的數據結構——沒有辦法創建只讀數組。但是,您可以使用集合提供的ReadOnly方法以只讀方式使用集合。此方法將返回集合的只讀版本。& lt/span>。

數組是Java中“存儲和隨機訪問壹系列對象”的最有效方式。

1、

效率高,但容量是固定的,不能動態變化。

array的另壹個缺點是無法判斷其中實際存在多少元素。長度只是告訴我們數組的容量。

2.Java中有壹個Arrays類,專門用來操作數組。

數組有壹組靜態函數,

Equals():比較兩個數組是否相等。數組具有相同數量的元素,並且所有對應的元素都相等。

Fill():填充數組中的值。

Sort():用於對數組進行排序。

BinarySearch():在有序數組中查找元素。

系統。arraycopy():數組的副本。

如果寫程序時不知道需要多少個對象,空間不足時需要自動擴充容量,就需要使用容器類庫,array不適用。所以我們需要使用匯編。

那我們就開始說java裏的集合吧。

收藏分類:

集合:列表、集合

Map:HashMap、HashTable

1.1收款接口

Collection是最基本的集合接口,它聲明了適用於JAVA集合的通用方法(只包括Set和List)。集合和列表都繼承了集合和映射。

1.1.1集合接口的方法:

[html]查看純文本打印?

& ltspan style = " font-weight:normal;"& gtBoolean add(Object o):將壹個對象的引用添加到集合中。

Void clear():刪除集合中的所有對象,也就是說,它不再保存對這些對象的引用。

Boolean isEmpty():確定集合是否為空。

Boolean contains(Object o):確定集合中是否包含對特定對象的引用。

Iterartor iterator():返回壹個叠代器對象,可用於遍歷集合中的元素。

Boolean remove(Object o):從集合中刪除對對象的引用。

Int size():返回集合中元素的數量。

Object[] toArray():返回包含集合中所有元素的數組

關於:Iterator()和toArray()方法用於集合的所有元素。前者返回壹個叠代器對象,後者返回壹個包含集合中所有元素的數組。

1.1.2叠代器接口聲明了以下方法:

[html]查看純文本打印?

HasNext():確定集合中的元素是否已經被遍歷,如果沒有,返回true。

Next():返回下壹個元素。

Remove():從集合中移除next()方法返回的最後壹個元素。

1.2套(套)

集合是最簡單的集合。集合中的對象沒有按特定方式排序,也沒有重復的對象。Set接口主要實現了兩個實現類:

HashSet: HashSet類根據哈希算法訪問集合中的對象,速度更快。

treeset:treeset類實現了SortedSet接口,它可以對集合中的對象進行排序。

Set的用途:存儲對象的引用,沒有重復的對象。

set set = new HashSet();String s 1 =新字符串(" hello ");字符串S2 = s 1;String s3 =新字符串(" world ");set . add(s 1);set . add(S2);set . add(S3);system . out . println(set . size());//打印集合中的對象數是2。

Set的add()方法如何確定對象是否已經存儲在集合中?

boolean isExists = falseiterator iterator = set . iterator();while(it . has next()){ String oldStr = it . next();if(newstr . equals(oldStr)){ is exists = true;} }

集合的函數方法

壹組

它有和Collection完全壹樣的接口,所以沒有額外的功能,不像前面兩個不同的List。事實上,集合是集合,只是

是不同的行為。這是繼承和多態的典型應用:表達不同的行為。)Set不保存重復元素(至於如何判斷相同元素,比較負責)

Set:存儲在Set中的每個元素必須是唯壹的,因為Set不保存重復的元素。添加到集合中的元素必須定義equals()方法,以確保對象的唯壹性。集合和集合具有完全相同的接口。Set接口不保證保持元素的順序。

HashSet:為快速查找而設計的集合。存儲在HashSet中的對象必須定義hashCode()。

TreeSet:保存順序的集合,底部為樹形結構。用它從集合中提取壹個有序序列。

LinkedHashSet:具有HashSet的查詢速度,內部使用鏈表維護元素的順序(插入順序)。所以當叠代器用於遍歷集合時,結果將按照元素插入的順序顯示。

1.3列表(列表)

List的特點是其元素以線性方式存儲,集合中可以存儲重復的對象。

List接口的主要實現類包括:(參考文章:ArrayList和LinkedList的區別)

ArrayList():表示壹個長度可以改變的數組。可以隨機訪問元素,在ArrayList()中插入和刪除元素的速度比較慢。

LinkedList():實現中采用了鏈表數據結構。快速插入和刪除,慢速訪問。

對於鏈表的隨機訪問,就是隨機地只檢索位於特定位置的元素。List的get(int index)方法將對象放回集合中參數index指定的索引位置,下標從“0”開始。檢索集合中所有對象的兩個最基本的方法是:

1: for循環和get()方法:

for(int I = 0;我& ltlist . size();i++){ system . out . println(list . get(I));}

2.使用叠代器:

叠代器it = list . iterator();while(it . has hnext()){ system . out . println(it . next());}

列表的函數方法

列表實際上有兩種:壹種是基本的ArrayList,它的優點是可以隨機訪問元素,另壹種是更強大的LinkedList,它不是為快速隨機訪問而設計的,而是有壹個更通用的方法。

列表:

順序是List最重要的特性:它保證維護元素的特定順序。List向Collection添加了許多方法,這使得在List的中間插入和移除元素成為可能(這只是推

推薦用於LinkedList。)列表可以生成ListIterator,可以用來從兩個方向遍歷列表,也可以在列表中間插入和刪除元素。

蘇。

ArrayList:由數組實現的列表。允許快速隨機訪問元素,但是在列表中間插入和移除元素會很慢。ListIterator應該只用於從後向前遍歷ArrayList,而不是插入和移除元素。因為那比LinkedList貴多了。

鏈接列表:

順序訪問得到優化,鏈表中間插入和刪除的開銷都不大。隨機訪問相對較慢。(改用ArrayList。)也有以下當事人

方法:addfirst()、addlast()、getfirst()、getlast()、removefirst()和。

RemoveLast(),這些方法(未在任何接口或基類中定義)使LinkedList能夠用作堆棧、隊列和雙向隊列。

1.4地圖(映射)

Map是映射鍵對象和值對象的集合,它的每個元素都包含壹對鍵對象和值對象。映射不從集合接口繼承。從Map集合中檢索元素時,只要給定key對象,就會返回對應的value對象。

繪制地圖的常用方法:

1添加和刪除操作:

[html]查看純文本打印?

Object put (object key,object value):向集合中添加壹個元素。

Object remove(Object KEY):刪除與鍵相關的元素。

Void putAll(Map t):將特定圖像中所有元素添加到該圖像中。

Void clear():從圖像中刪除所有映射。

2查詢操作:

Object get(Object key):獲取與關鍵字key相關的值。映射集中的關鍵對象不允許重復,即equals()方法對任意兩個關鍵對象的比較結果為假。但是,任何數量的鍵都可以排他地映射到同壹個值對象。

地圖的功能方法

方法put(對象鍵,對象。

Value)添加壹個“值”(妳想要的)和壹個與“值”關聯的“鍵”(用它來找)。方法get(對象

Key)返回與給定鍵相關聯的值。可以使用containsKey()和containsValue()來測試映射是包含“鍵”還是“值”。

標準Java類庫包含幾種不同的映射:hashmap、treemap、鏈接hashmap,

WeakHashMap,

IdentityHashMap .它們都有相同的基本接口圖,但在行為、效率、排序策略、保存對象的生命周期和判斷鍵的等價性方面有所不同。

執行效率是Map的壹大問題。看看get()要做什麽。

什麽東西,妳就明白為什麽在ArrayList中搜索“key”相當慢了。這正是HashMap提高速度的方式。

位次。HashMap使用壹個特殊的值,稱為“哈希代碼”(hash

代碼)來代替緩慢的鍵搜索。“哈希碼”是“相對唯壹的”表示對象的int值,它是通過變換對象的壹些信息而產生的。所有Java對象都是

可以生成哈希代碼,因為hashCode()是在基類對象中定義的方法。

HashMap使用對象的hashCode()進行快速查詢。這種方法可以顯著提高性能。

映射:維護“鍵-值對”的關聯性,這樣就可以通過“鍵”找到“值”。

Hashmap:基於哈希表的map的實現。插入和查詢“鍵值對”的成本是固定的。妳可以通過構造函數設置容量和裝載因子來調整容器的性能。

LinkedHashMap:類似於HashMap,但是在遍歷HashMap時,獲取“鍵值對”的順序是其插入順序或最近最少使用(LRU)順序。只比HashMap慢壹點。它在叠代訪問中速度更快,因為它使用鏈表來維護內部順序。

樹形圖:

基於紅黑樹的數據結構的實現。當查看“鍵”或“鍵值對”時,它們被排序(順序由Comparabel或Comparator決定)。樹形圖的特點是

所以,妳得到的結果是排序的。TreeMap是唯壹具有subMap()方法的映射,它可以返回壹個子樹。

weakashmao:weak key)地圖,並且地圖中使用的對象也允許釋放:這是為了解決特殊問題而設計的。如果除了映射到壹個“鍵”之外沒有其他引用,該“鍵”可以被垃圾收集器回收。

Identifyhash map::使用= =而不是equals()來比較“鍵”。旨在解決特殊問題。

1.4差異

1.4.1,收藏和地圖的區別

每個容器中存儲的元素數量是不同的。

集合類型中,每個位置只有壹個元素。

Map類型,保存鍵值對,就像壹個小型數據庫。

1.4.2,其各自子公司的子類

收藏品

- List:元素將以特定的順序存儲。所以拿出來的順序可能和放進去的順序不壹樣。

-數組列表/鏈接列表/向量

- Set:不能包含重復的元素。

-哈希集/樹集

地圖

-散列表

-哈希表

-樹狀圖

1.4.3,其他功能

列表、集合和貼圖將所有持有的對象視為對象類型。

集合、列表、集合和映射都是接口,不能實例化。

從它們繼承的ArrayList、Vector、Hashtable和HashMap都是具體的類,所以它們可以被實例化。

vector容器確切地知道它持有的對象屬於什麽類型。向量不檢查邊界。

摘要

1.如果涉及堆棧、隊列等操作,要考慮List對於需要快速插入或刪除的元素,應該使用LinkedList對於需要快速隨機訪問的元素,應該使用ArrayList。

2.如果程序在單線程環境中,或者訪問只在壹個線程中,那麽考慮異步類會更有效率。如果多個線程可以同時操作壹個類,那麽應該使用同步類。

3.除了使用TreeSet,TreeMap當需要排序時,妳應該使用HashSet,HashMap,因為它們效率更高。

4.特別註意哈希表的操作,作為鍵的對象要正確復制equals和hashCode方法。

5.容器類只能保存對象引用(指向對象的指針),而不能將對象信息復制到序列中的某個位置。壹旦對象被放入容器,它的類型信息就丟失了。

6.盡量返回接口而不是實際類型,比如返回List而不是ArrayList,這樣以後如果需要用LinkedList替換ArrayList,客戶端代碼就不需要修改了。這是針對抽象編程的。

註意:

1,集合沒有get()方法來獲取元素。只能通過叠代器()遍歷元素。

2.集合和集合具有完全相同的接口。

3、List,可以用get()方法壹次取出壹個元素。用數字選擇壹堆對象中的壹個,get(0)...(添加/獲取)

4,壹般用ArrayList。用LinkedList構造堆棧和隊列。

5.Map使用put(k,v)/get(k),也可以使用containsKey()/containsValue()檢查是否包含鍵/值。

HashMap將使用對象的hashCode來快速找到鍵。

6.映射中的元素可以分別從鍵序列和值序列中提取。

使用keySet()提取鍵序列,並為映射中的所有鍵生成壹個集合。

使用values()提取值序列,並生成地圖中所有值的集合。

為什麽壹個生成集合,壹個生成集合?這是因為鍵總是唯壹的,值允許重復。