一、集合與數(shù)組的區(qū)別
相同點(diǎn):都是用來(lái)存儲(chǔ)數(shù)據(jù)的。不同點(diǎn):1.集合帶array的,底層由數(shù)組實(shí)現(xiàn),還有一部分由其他方式(樹(shù)、鏈表等)實(shí)現(xiàn)。2.數(shù)組大小固定,而集合沒(méi)有固定的大小,更方便存儲(chǔ)。3.數(shù)組只能放一種類(lèi)型,集合不考慮泛型可以存多種類(lèi)型。4.集合放基本類(lèi)型是通過(guò)裝箱拆箱(包裝類(lèi)與基本數(shù)據(jù)類(lèi)型的轉(zhuǎn)換)來(lái)實(shí)現(xiàn)的。(寫(xiě)泛形的時(shí)候不能用int,而要用Integer)
二、幾種常用集合之間的關(guān)系
Map接口自成一系,是以鍵值對(duì)(Key,Value)方式存儲(chǔ)數(shù)據(jù)的,屬于雙列集合。Set接口的實(shí)現(xiàn)類(lèi): HashSet、LinkedHashSet、TreeSet。List接口的實(shí)現(xiàn)類(lèi):ArrayList、LinkedList、Vector(線(xiàn)程安全)。Queue接口的實(shí)現(xiàn)類(lèi) : LinkedList、PriorityQueue。(沒(méi)怎么用過(guò),混個(gè)臉熟)Map接口的實(shí)現(xiàn)類(lèi):HashMap、TreeMap、Hashtable(線(xiàn)程安全)。
三、每種集合的性質(zhì)
3.1Collection接口(單列)
Collection接口的常用方法:
add(T t) //添加指定元素
remove(T t) //刪除指定元素
isEmpty() //集合是否為空
iterator() //獲得迭代器(Iterator類(lèi)型),一般用于遍歷
size() //獲得元素的個(gè)數(shù)
contains(T t) //是否包含某元素
3.1.1.List 有序,可重復(fù)
List接口的常用方法
add(int index, T t) //向指定位置添加元素
remove(int index) //刪除指定元素
get(int index) //獲取指定位置的元素
set(int index, T t) //修改指定位置的元素
indexOf(T t) //獲取指定元素的位置
ArrayList 底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢(xún)快,增刪慢。ArrayList的常用方法都是從List繼承來(lái)的,就不多說(shuō)了。LinkedList 底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢(xún)慢,增刪快。LinkedList 的常用方法:
getFirst() //獲取第一個(gè)元素
getLast() //獲取最后一個(gè)元素
offer(T t) //在最后位置追加元素
offerFirst(T t) //在開(kāi)頭位置追加元素
offerLast(T t) //在最后位置追加元素
removeFirst() //刪除第一個(gè)元素
removeLast() //刪除最后一個(gè)元素
Vector 底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,線(xiàn)程安全,效率低。使用方法和ArrayList基本一樣。
3.1.2.Set 不可重復(fù)
方法:常用的都是從Collection繼承到的,就輕松了許多。HashSet (無(wú)序,唯一)底層數(shù)據(jù)結(jié)構(gòu)是哈希表。如何保證唯一:hashCode()和equals()LinkedHashSet(有序,唯一)底層數(shù)據(jù)結(jié)構(gòu)是鏈表和哈希表。鏈表保證有序,哈希表保證唯一。TreeSet(有序,唯一)
底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹(shù)。
1.如何排序(add()方法的重載):自然排序(無(wú)參add()調(diào)用Comparable的compareTo()方法)定制排序 (add(? extends Comparator)調(diào)用類(lèi)實(shí)現(xiàn)的compare()方法)注:裝載時(shí)若自然排序無(wú)法進(jìn)行排序會(huì)報(bào)錯(cuò),所以對(duì)裝進(jìn)集合的類(lèi)實(shí)現(xiàn)Comparator接口進(jìn)行自定義排序
2.如何保證唯一:根據(jù)比較的返回值是否為0來(lái)決定。
3.1.3.Queue 有序(FIFO先進(jìn)先出)
PriorityQueue 有序(定制排序、自然排序(也就是說(shuō)不是所謂的FIFO),我用的少,所以不是特別了解)
3.2Map接口(雙列)
put (K key,V value):把鍵與值添加到Map集合中
remove (K key):刪除key對(duì)應(yīng)的值
get(K key):根據(jù)指定的鍵,獲取對(duì)應(yīng)的值
containKey(K key):判斷是否包含指定的鍵
entrySet() :返回Map.Entry型對(duì)象,用于遍歷。(entry.getKey()/entry.getValue())
keySet(K key):獲取Map集合中所有的Key,存儲(chǔ)到set集合中(用于遍歷)
values(V value) :獲取Map集合中所有的Value,存儲(chǔ)到Collection集合中(用于遍歷)
3.2.1HashMap
HashMap的常用方法都繼承自Map接口,就不細(xì)說(shuō)了。HashMap是最常用的鍵值對(duì)存儲(chǔ)容器。
3.2.2.TreeMap
構(gòu)造器:TreeMap()//創(chuàng)建一個(gè)空TreeMap,keys按照自然排序TreeMap(Comparator comparator)//創(chuàng)建一個(gè)空TreeMap,按照自定義的comparator排序。3.2.3.Hashtable(線(xiàn)程安全)
與HashMap的異同:同:Hashtable和HashMap使用方法基本一致。異:HashMap線(xiàn)程不安全,而Hashtable是線(xiàn)程安全的;HashMap的K和V都可以為null,而Hashtable的K,V都不能為null。
四、總結(jié)
1.沒(méi)有其他要求時(shí),最常用ArrayList、HashMap;2.不能重復(fù)時(shí),用HashSet;3.需要線(xiàn)程安全時(shí),用Vector、Hashtable。