有三種主要類型的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()提取值序列,並生成地圖中所有值的集合。
為什麽壹個生成集合,壹個生成集合?這是因為鍵總是唯壹的,值允許重復。