亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java集合Collection

2019-11-06 06:07:45
字體:
來源:轉載
供稿:網友

java集合Collection


1. 集合的特點

集合是存儲一組對象的容器,長度可變。集合類存放的都是對象的引用,而非對象本身。任意類型的數據都可以存到集合,存進去后的元素類型默認是Object。集合類型主要有3種:set(集)、list(列表)和map(映射)。其中Set代表無序、不可重復的集合;List代表有序、重復的集合;而Map則代表具有映射關系的集合。

2. 集合框架圖

這里寫圖片描述

Collection單列集合

(接口)List: 實現類 ArrayList LinkedList Vector (接口)Set: 實現類 HashSet TreeSet LinkedHashSet

Map雙列集合

(接口)map: 實現類 HashMap Hashtable TreeMap PRoperties

ArrayList、Vector、HashMap、HashSet的默認初始容量、加載因子、擴容增量? http://www.cnblogs.com/xiezie/p/5511840.html

3. Collection接口

特點 Collection用于表示一組單值對象的集合,這些對象也稱為元素。Collection接口定義了一系列抽象方法,規范了對單值類型的集合的操作標準。Collection 接口是 List、Set 和 Queue 接口的父接口,該接口里定義的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。常用方法 獲取存儲的元素總數:size(*)添加元素:add、addAll(*)迭代所有元素:iterator(*)移除元素:remove、removeAll清空集合:clear是否是空集合:isEmpty是否包含某個元素:contains、containsAll取交集:retainAll(Collection)轉換成傳統的數組類型:toArray

Collections

java.util.Collections是集合類的一個工具類/幫助類,此類不能實例化,其中提供了一系列靜態方法,用于對集合中元素進行排序、搜索以及線程安全等各種操作。常用方法 sort 排序max/min 求最值fill 填充reverse 反轉

代碼

Integer[] arr = new Integer[] { 2, 1, 3 }; List<Integer> list1 = Arrays.asList(arr);List<Integer> list2 = new ArrayList<>(list1);list2.add(4);System.out.println(list2);//[2, 1, 3, 4]Collections.reverse(list2);System.out.println(list2);//[4, 3, 1, 2]System.out.println(Collections.max(list2));//4System.out.println(Collections.min(list2));//1Collections.sort(list2);System.out.println(list2);//[1, 2, 3, 4]Collections.fill(list2, 2);System.out.println(list2);//[2, 2, 2, 2]

4. List接口

元素特點 有序(存入和取出的順序一致);可重復;集合中的每個元素都有其對應的順序索引。JDK API中List接口的實現類常用的有:ArrayList、LinkedListVector。常用方法 List 除了從Collection集合中繼承的方法外,添加了一些根據索引來操作集合元素的方法。新增的方法: 刪除:remove(int index)修改:set(int index,Object obj) 獲?。篻et(int index)插入:add(int index,Object obj) addAll(int index, Collection c) 查找某個對象的索引(從前往后):indexOf(Object o) 查找某個對象的索引(從后往前): lastIndexOf(Object obj)subList(int fromIndex, int toIndex):返回列表中指定的 fromIndex(包括)和 toIndex(不包括)之間的部分視圖。ListIterator listIterator():返回列表迭代器對象ListIterator listIterator(int index):返回從指定位置開始的列表迭代器對象ListIterator接口獨有的方法:(可以反向遍歷) add(E e) 將指定的元素插入列表(可選操作)。boolean hasprevious() 如果以逆向遍歷列表,列表迭代器有多個元素,則返回 true。 int nextIndex() 返回對 next 的后續調用所返回元素的索引。E previous() 返回列表中的前一個元素。int previousIndex() 返回對 previous 的后續調用所返回元素的索引。void remove() 從列表中移除由 next 或 previous 返回的最后一個元素(可選操作)。 void set(E e)用指定元素替換 next 或 previous 返回的最后一個元素(可選操作)。

ArrayList實現類

ArrayList 是 List 接口的典型實現類,本質上,ArrayList是對象引用的一個變長數組。List 接口的大小可變數組的實現。實現了所有可選列表操作,并允許包括 null 。默認初始容量為10。當集合容量不夠時,默認是增加原來集合元素個數的一半特點: 底層是數組結構;適合搜索,不適合增刪改(空間是連續的); 版本較新,線程不安全,不同步,效率比較高。

構造方法摘要 :

ArrayList() 構造一個初始容量為 10 的空列表。 ArrayList(Collection<? extends E> c) 構造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的。 ArrayList(int initialCapacity) 構造一個具有指定初始容量的空列表

和數組的轉換

調用Arrays的asList(Abject o)方法

代碼

Integer[] arr = new Integer[] { 1, 2, 3 };List<Integer> list1 = Arrays.asList(arr);// list1.add("c");//java.lang.UnsupportedOperationExceptionList<Integer> list2 = new ArrayList<>(list1);list2.add(4);//可以使用

java.lang.UnsupportedOperationException是不支持功能異常,常常出現在使用Arrays.asList()后調用add,remove這些方法時。 這是由于:    Arrays.asList() 返回java.util.ArraysArrayList,而不是ArrayList。ArraysArrayList和ArrayList都是繼承AbstractList,remove,add等方法在AbstractList中是默認throw UnsupportedOperationException而且不作任何操作。ArrayList override這些方法來對list進行操作,但是Arrays$ArrayList沒有override remove(int),add(int)等,所以throw UnsupportedOperationException。  解決方法是轉換為ArrayList!

LinkedList

對于頻繁的插入或刪除元素的操作,建議使用LinkedList類,效率較高。特點: 底層采用的是鏈表結構適合做增刪改,不適合搜索(空間是不連續)

特有的方法

將元素插入列表開頭:addFirst(E e)將元素插入列表結尾:addLast(E e)返回此列表的第一個元素:getFirst() 返回此列表的最后一個元素:getLast() 移除并返回此列表第一個元素: removeFirst()移除并返回此列表的最后一個元素: removeLast()//等等特殊方法

LinkedList內部有個內部類Node,這樣

private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; }}LinkedList:雙向鏈表除了保存數據,還定義了兩個變量:prev變量記錄前一個元素的位置next變量記錄后一個元素的位置刪除元素時,只需改變前后兩個元素的prev和next值。

Vector

古老的實現類、線程安全的,但效率要低于ArrayList。特點: 版本較老,線程安全的,同步的,效率比較低底層采用的是數組結構

比較

ArrayList和Vector 的對比 特點 底層:數組結構 ArrayList 線程不同步,效率高,不安全(單線程訪問時) Vector 線程同步,效率低,安全(多線程訪問時)ArrayList和LinkedList的對比
底層結構 常用方法 特點
ArrayList 數組 List接口中的方法 搜索速度比較快,而增刪改較慢(空間是連續的)
LinkedList 鏈表 List接口中的方法和特有方法 增刪改速度比較快,而搜索比較慢(空間是不連續的)

5. Set接口

元素特點 **無序的;**Set集合說無序,這個無序是說在內存中保存沒有順序,其中的TreeSet等表現出來的有序,也只是在遍歷時顯示的有順序。元素不能重復;不支持索引; Set集合 一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素,對 e1 和 e2,并且最多包含一個 null 元素。Set接口是Collection的子接口,set接口沒有提供額外的方法。Set 集合不允許包含相同的元素,如果試把兩個相同的元素加入同一個 Set 集合中,最終只能添加一個。Set 判斷兩個對象是否相同不是使用 == 運算符, 而是Hash系列的根據Set equals 和hashcode方法,有序系列的根據compareTo或compare方法。Set接口的實現類: 1)HashSet:按照哈希值來存取集合中的對象2)TreeSet:有序的對象集3)LinkedHashSet:按照哈希算法來存取集合中的對象,遍歷輸出時保持元素的添加順序

HashSet

HashSet是Set接口的典型實現,大多數情況使用Set集合時都使用這個實現類。HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能。當向HashSet集合中添加元素時,HashSet會調用該對象的HashCode()方法來得到這個對象的hashCode值,然后根據hashCode值決定該對象在HashSet 中的存儲位置。 2)特點: 底層采用哈希表結構,是無序的;HashSet**線程不安全;**集合元素可以為null。

3)為什么用哈希算法來存儲集合中的元素?

因為Set集合想要保證不重復性,因此每一個對象放入到集合中,就意味著要和集合中的每一個元素都比較一次,那么這樣的效率極低,所以用哈希算法來存儲,因為hashCode不相等的兩個對象肯定是兩個不相同的對象(散列函數的結論),如果HashCode相同,那就再判斷equals方法,這樣就大大減少了工作量,提高了效率。

4)對于存放在Set容器中的對象,對應的類一定要寫equals()和hashCode(Object obj)方法,以實現對象相等規則。

5)重寫hashCode方法的基本原則: 在程序運行時,同一個對象多次調用hashCode()方法應該返回相同的值;當兩個對象的equals方法比較返回true時,這兩個對象的hashCode()方法返回值也應該相同。對象中用作equals方法比較的屬性,都應該用來計算hashCode值。6) 不同對象的哈希值有可能一樣如果兩個對象的equals 比較結果為true,則哈希值肯定一樣兩個對象的哈希值一樣,但equals結果不一定為true

LinkedHashSet

1)LinkedHashSet是HaseSet的子類。是根據元素的hashCode值來決定元素的存儲位置,但同時使用鏈表維護元素的次序,使得元素看起來像是插入順序保證的。2)特點 底層是鏈表和哈希表的雙實現;存入和取出的順序一致;不允許元素重復。

TreeSet

1)TreeSet 是 SortedSet 接口的實現類,TreeSet 可以確保集合元素處于排序狀態。2)特點: 底層采用二叉樹結構,實現對元素的排序功能元素不能重復

3)TreeSet有兩種排序方法:自然排序和定制排序

要添加的元素類型自己實現Comparable,重寫compareTo方法在創建TreeSet對象時,指定Comparator接口對象,重寫compare方法

4)特殊方法:

first(): 返回此 set 中當前第一個(最低)元素。 floor(E e) : 返回此 set 中小于等于給定元素的最大元素;如果不存在這樣的元素,則返回 null。last(): 返回此 set 中當前最后一個(最高)元素。 lower(E e) : 返回此 set 中嚴格小于給定元素的最大元素;如果不存在這樣的元素,則返回 null。 等等

6. Map接口

特點

Map與Collection并列存在。用于保存具有映射關系的數據:Key-Value ;Map中的key和value都可以是任何引用類型的數據,value可以重復; Map中的key用Set來存放,不允許重復,即作為map的key類型,需重寫hashCode()和equals()方法;常用String類作為Map的鍵,key和value之間存在一對一的關系,即通過指定的key能找到唯一、確定的value值。常用方法: clear():從此映射中移除所有映射關系(可選操作)boolean containsKey(Object key): 如果此映射包含指定鍵的映射關系,則返回 true。boolean containsValue(Object value): 如果此映射將一個或多個鍵映射到指定值,則返回 true。 entrySet(): 返回此映射中包含的映射關系的 Set 視圖。boolean equals(Object o): 比較指定的對象與此映射是否相等。V get(Object key) : 返回指定鍵所映射的值;如果此映射不包含該鍵的映射關系,則返回 null。 int hashCode(): 返回此映射的哈希碼值。boolean isEmpty() : 如果此映射未包含鍵-值映射關系,則返回 true。Set keySet() : 返回此映射中包含的鍵的 Set 視圖。V put(K key, V value) : 將指定的值與此映射中的指定鍵關聯(可選操作)。void putAll( m) : 從指定映射中將所有映射關系復制到此映射中(可選操作)。 V remove(Object key): 如果存在一個鍵的映射關系,則將其從此映射中移除(可選操作)。int size(): 返回此映射中的鍵-值映射關系數。Collection values() : 返回此映射中包含的值的 Collection 視圖。

Map繼承樹

這里寫圖片描述Map常用的實現類:HashMap、TreeMapProperties。

HashMap

1)HashMap是Map接口使用頻率最高的類,允許null值和null鍵,與HashSet一樣,不保證映射順序。2)HashMap**判斷兩個key相等的標準是**:兩個key通過equals()方法返回true,并且hashCode值也相同。3)HashMap**判斷兩個value相等的標準是**:兩個value通過equals()方法返回true。

4)特點:

底層是哈希表結構,鍵是無序的;一般要重寫 hashcode和equals方法;版本比較新,線程不安全、不同步的、效率高,允許null鍵null值。

5)LinkedHashMap是HashMap的子類,與LinkedHashSet類似,LinkedHashMap可以維護Map的迭代順序:迭代順序與key-value對的插入順序一致,

TreeMap

1)TreeMap存儲key-value對時,需要根據key-value對進行排序。TreeMap可以保證所有的key-value對處于有序狀態。2)TreeMap的key的排序: 自然排序:TreeMap的key必須實現Comparable接口,而且所有的key應該是同一個類的對象,否則將會拋出ClassCastException;定制排序:創建TreeMap時,傳入一個Comparator對象,該對象負責對key進行排序,此時不需要Map的key實現Comparable接口。3)TreeMap判斷兩個key相等的標準:兩個ket通過compareTo()方法或Compare()方法返回0;4)若使用自定義類作為TreeMap的key,屬性類需要重寫equals()和hashCode()方法,且equals()方法返回true時,compareTo()返回0。5)特點: 底層是二叉樹,可以實現對鍵排序

HashTable

1)HashTable是個古老的Map實現類,線程安全。2)與HashMap不同,HashTable不允許出現null作為key和value。3)與HashMap一樣,HashTable也不能保證key-value對的順序。4)HashTable判斷兩個key相等、兩個value相等的標準與HashMap相同。

Properties

1)Properties是HashTable的子類,該類用于處理屬性文件。2)特點: 用于讀取和寫入屬性文件(Xxx.properties)3)屬性文件格式要求 鍵值對;鍵和值都是String類型。4)常用方法 getProperty(String key): 獲取屬性 setProperty(String key,String value):設置屬性load(InputStream inStream) :加載屬性文件的數據到Properties集合中list(PrintStream out) :打印Properties集合中的元素到指定設備上store(OutputStream out, String comments) :將集合中的內容存儲到文件中

7. Iterator和Iterable

Iterable

Iterator是迭代器類,而Iterable是為了只要實現該接口就可以使用foreach,進行迭代.Iterable中封裝了Iterator接口,只要實現了Iterable接口的類,就可以使用Iterator迭代器了。這個迭代器是用接口定義的 iterator方法提供的。也就是iterator方法需要返回一個Iterator對象。

集合Collection、List、Set都是Iterable的實現類,所以他們及其他們的子類都可以使用foreach進行迭代。

//Iterable JDK源碼//可以通過成員內部類,方法內部類,甚至匿名內部類去實現Iteratorpublic interface Iterable<T>{ Iterator<T> iterator();}

Iterator

包含3個方法: hasNext(), next() , remove()。一開始迭代器在所有元素的左邊,調用next()之后,迭代器移到第一個和第二個元素之間,next()方法返回迭代器剛剛經過的元素。hasNext()若返回True,則表明接下來還有元素,迭代器不在尾部。remove()方法必須和next方法一起使用,功能是去除剛剛next方法返回的元素。

為什么一定要去實現Iterable這個接口呢? 為什么不直接實現Iterator接口呢?

Collection接口實現了Iterable接口,但并不直接實現Iterator接口。因為Iterator接口的核心方法next()或者hasNext(),是依賴于迭代器的當前迭代位置的。如果Collection直接實現Iterator接口,勢必導致集合對象中包含當前迭代位置的數據(指針)。當集合在不同方法間被傳遞時,由于當前迭代位置不可預置,那么next()方法的結果會變成不可預知。而Iterable則不然,每次調用都會返回一個從頭開始計數的迭代器。多個迭代器是互不干擾的。

8. 遍歷集合的幾種方式

使用迭代器Iterator的方式。

語法

Iterator iter = coll.iterator();while(iter.hasNext()){ Object obj = iterm.next();} 遍歷過程中,不允許做集合元素的增刪改的,只能使用Iterator本身的remove方法做刪除。

使用增強for循環的方式。

語法

for(元素類型 元素名:集合或數組名){ 訪問 元素名 syso(obj);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
隔壁老王国产在线精品| 精品亚洲一区二区三区在线播放| 亚洲四色影视在线观看| 精品国产一区久久久| 欧美丰满少妇xxxxx| 欧美日韩国产丝袜另类| 亚洲自拍偷拍一区| 色爱av美腿丝袜综合粉嫩av| 亚洲欧美中文在线视频| 精品中文视频在线| 精品动漫一区二区三区| 日韩在线观看网站| 懂色aⅴ精品一区二区三区蜜月| 国产精品成人免费电影| 国产午夜精品视频免费不卡69堂| 亚洲午夜精品久久久久久久久久久久| 成人网页在线免费观看| 亚洲精品电影网| 亚洲的天堂在线中文字幕| 欧美一级大片在线观看| 久久91精品国产91久久久| 国产精品一区二区三区免费视频| 久久视频在线看| 成年人精品视频| 91精品国产99久久久久久| 欧美成人h版在线观看| 欧美激情亚洲另类| 成人免费看吃奶视频网站| 亚洲石原莉奈一区二区在线观看| 国产一区二区三区在线观看网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩美女视频免费看| 一区二区三区美女xx视频| 一区二区三区 在线观看视| 欧洲成人在线视频| 国产精品久久久久av免费| 亚洲国产成人精品女人久久久| 日韩中文在线观看| 理论片在线不卡免费观看| 欧美激情综合亚洲一二区| 国产精品最新在线观看| 欧美激情精品久久久久久大尺度| 欧美日韩一区二区三区在线免费观看| 国产精品偷伦免费视频观看的| 日韩亚洲综合在线| 久久精品国产免费观看| 不卡av电影院| 欧美成人高清视频| 久久亚洲精品毛片| 精品毛片三在线观看| 国产精品www色诱视频| 欧美激情视频在线免费观看 欧美视频免费一| 青青精品视频播放| xxx成人少妇69| 亚洲国产成人精品久久| 中文字幕日韩精品有码视频| 夜夜嗨av色一区二区不卡| 97视频在线播放| 成人国产在线视频| 欧美极品在线播放| 亚洲已满18点击进入在线看片| 国产成人精品午夜| 久久久久五月天| 国产69精品久久久久99| 欧美激情一区二区三区久久久| 精品久久香蕉国产线看观看亚洲| 黄色成人在线播放| 欧美壮男野外gaytube| 国产精品video| 亚洲肉体裸体xxxx137| 欧美精品一区二区三区国产精品| 欧美www在线| 色综合天天综合网国产成人网| 国产成人福利视频| 中文在线不卡视频| 久久久久九九九九| 91在线无精精品一区二区| 狠狠爱在线视频一区| 91精品啪aⅴ在线观看国产| 亚洲国产精品视频在线观看| 中文字幕一区二区精品| 亚洲天堂男人天堂| 国产精品白丝av嫩草影院| 国内精品在线一区| 亚洲国产毛片完整版| 日本一区二区在线免费播放| 亚洲无亚洲人成网站77777| 疯狂做受xxxx欧美肥白少妇| 成人看片人aa| 欧美性xxxx极品hd满灌| 国产不卡在线观看| 亚洲一区二区三区四区在线播放| 久久久av网站| 中文字幕精品在线| 亚洲国产精品嫩草影院久久| 国产精品丝袜白浆摸在线| 亚洲国产精品美女| 欧美成人在线免费| 国产成人免费av电影| 伊人成人开心激情综合网| 日韩免费av在线| 97在线观看免费高清| 久久久久久久激情视频| 亚洲高清福利视频| 亚洲激情成人网| 97在线精品国自产拍中文| 国产精品视频一区二区三区四| 在线观看成人黄色| 国语对白做受69| 九九热r在线视频精品| 青青精品视频播放| 欧美日韩午夜剧场| 欧美激情在线播放| 欧美午夜美女看片| 国产亚洲精品久久久久久牛牛| 国产精品久久久久久久久男| 一区二区福利视频| 久久精品夜夜夜夜夜久久| 国产精品久久久久久网站| 国内久久久精品| 中日韩美女免费视频网址在线观看| 国产香蕉精品视频一区二区三区| 欧美极品少妇与黑人| 高潮白浆女日韩av免费看| 亚洲国产古装精品网站| 97婷婷大伊香蕉精品视频| 久久亚洲精品小早川怜子66| 国产97在线|亚洲| 亚洲精品一区av在线播放| 国产精品都在这里| 欧美第一淫aaasss性| 亚洲大尺度美女在线| 国产精品成人播放| 成人黄色在线观看| 欧美日韩国产123| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品第七影院| 亚洲xxxx视频| 91国产美女视频| 亚洲一区亚洲二区| 日韩中文在线观看| 国产午夜精品视频| 超在线视频97| 亚洲美女中文字幕| 日韩va亚洲va欧洲va国产| 久久久精品在线观看| 欧美大荫蒂xxx| 日韩精品免费电影| 91香蕉嫩草影院入口| 欧美性猛交xxxx黑人猛交| 国产大片精品免费永久看nba| 国产91精品久| 成人在线视频网站| 欧美激情在线观看视频| 日产精品99久久久久久| 91精品国产综合久久香蕉最新版| y97精品国产97久久久久久| 亚洲国产欧美久久| 国产精品一区久久久| 久久久久久久久久国产| 亚洲国产美女久久久久| 黑人巨大精品欧美一区二区一视频| 色妞一区二区三区| 91国产美女视频|