首頁  >  文章  >  Java  >  java集合框架學習筆記

java集合框架學習筆記

PHPz
PHPz原創
2017-04-04 10:36:581623瀏覽

java集合類別可以用來儲存數量不等的多個對象,並且可以實作常用的資料結構例如棧,佇列等。與數組不同,數組長度是不可變的,數組元素可以存放基本類型和對象類型而集合裡只能保存對象(實質上是對象的引用變量),Java集合大致可以分為SetList、和Map ,其中Set代表無序,不可重複的集合,List代表有序,可重複的集合,Map代表具有映射關係的集合,map中key唯一,value可重複。其中Set ,List 以及java5之後新增的Queue佇列是Collection下派生的子介面

#Set集合不允許包含相同的元素,集合中物件之間沒有明顯的順序

HashSet,LinkedHashSet,TreeSet,是Set的主要實作類別

其中HashSet 無法保證元素的排列順序,HashSet不是同步的,HashSet集合元素允許為null,當物件存入HashSet中時,HashSet會呼叫物件的hashCode方法到的物件的hashCode值,根據該hashCode值決定物件在HashSet中的儲存位置。 HashSet 中判斷兩個物件是否相等是透過比較equals()和hashCode()方法傳回值都相等來判斷的
LinkedHashSet 是HashSet的一個子類,但它同時使用鍊錶來維護元素的次序,這樣使得元素看起來是以插入的順序保存的,因為其需要維護元素的插入次序,所以性能略低於HashSet的性能,由於其依然是HashSet所以同樣元素不能重複

#TreeSet

#TreeSet是SortedSet介面的實作類,同樣TreeSet可以去保證集合元素處於排序狀態,TreeSet會呼叫集合元素的comparTo(Object obj)方法比較元素之間的大小關係,然後將集合元素升序排列,即自然排序。 TreeSet也可以透過Comparator介面實作客製化排序,在建立TreeSet集合物件時,提供一個Comparator物件與該TreeSet集合關聯,由該Comparator物件負責集合元素的排序邏輯。

各種Set效能比較

HashSet的效能總比TreeSet好,因為TreeSet需要額外的演算法來維護集合元素的順序,只有當需要保持排序的set 時才應該使用TreeSet否則都應使用HashSet 。另外LinkedHashSet是HashSet的子類,對應普通的插入,刪除操作,LinkedHashSet 比HashSet 的性能要稍微慢點,是因為維護鍊錶所帶來的的開銷造成的,不過因為有了鍊錶,遍歷LinkedHashSet時會更快一點。但是set的三個實作類別都不是執行緒安全的,通常可以使用Collections工具類別的synchronizedSortedSet方法來包裝該set集合,此操作最好在建立時進行
例如:SortedSet  s = Collections.synchronizedSortedSet(<a href="http://www.php.cn/wiki/165.html" target="_blank">new</a> TreeSet(...));

List 集合代表一个有序的.可以重复的集合,集合中的元素都有其对应的索引

ArrayList 与 Vector是List的两个典型实现,还有一个LinkedList

其中ArrayList和Vector类封装了一个动态的,允许再分配的Object[ ] 数组,当添加的元素个数超出该数组长度时,则初始长度会自动增加。ArrayList和Vector的显著区别是ArrayList不是线程安全的,而Vector是线程安全的,无需程序保证集合的同步性。因为Vector是线程安全的,所以Vector色性能要比ArrayList要低。即使需要保证线程安全,一般也不推荐使用Vector,而是使用Collections工具类的相关方法将ArrayList包装成一个线程安全的类。
Vector还有一个子类叫Stack栈,用于模拟栈这种数据结构,后进先出,由于是继承关系,所以Stack也是线程安全的,所以性能比较差,不推荐使用,如果需要使用栈这种数据结构,可以考虑使用LinkedList.
LinkedList 也是List 的实现类,它是一个基于链表实现的List,对于顺序访问集合中的元素进行了优化,特别是插入和删除元素是非常快,LinkedList既实现了List接口,又实现了Deque接口,由于实现了Deque接口可以作为栈来使用。 Queue集合用于模拟队列这种数据结构,先进后出 ,Deque是Queue的一个子接口,代表一个双端队列,允许从两端操作队列的元素。

LinkedList与ArrayList区别

由于ArrayList内部是以数组的形式来保存集合中的元素,因此随机访问集合元素时拥有较好的性能,而LinkedList是以链表的形式来保存集合的元素的,所以随机访问的性能较差,但是在插入、删除元素时性能非常出色。

Map用于保存具有映射关系的数据,key和value都可以是任何引用类型的数据,但是map的key值是唯一的不能重复

HashMap 和Hashtable是Map的两个实现类

Hashtable 是一个线程安全的Map实现类,但是HashMap不是线程安全的,所以HashMap的性能要稍好一点。
另外Hashtable不允许使用null作为key和value,试图将null放进Hashtable会引发空指针异常,但是HashMap可以使用null作为key和value,由于key不能重复,所以HashMap最多只有一个key为null,但是可以有多个value为null。
HashMap和Hashtable判断两个key相等额标准是两个key通过equals()和hashCode()方法返回值都相等。
LinkedHashMap 是HashMap的一个子类,LinkedHashMap也使用双向链表来维护key的次序,即迭代顺序与插入顺序保持一致。因为要维护元素的插入顺序,所有性能较HashMap略低。

TreeMap

Map下还有一个SortedMap接口,SortedMap接口又一个TreeMap实现类TreeMap保存key-value对时,需要根据key对节点进行排序,TreeMap排序分为自然排序和定制排序,自然排序时key必须实现Comparable接口,定时排序时,创建TreeMap时需要传入一个Comparator对象,由该对象对TreeMap中的key进行排序。与TreeSet类似。TreeMap 比 HashMap和Hashtable效率要慢,因为其要保持排序。

Collection与Collections的区别

Collection是Java的集合框架的一个接口
Collections 是集合框架中的一个工具类,该工具类提供了大量方法对集合元素进行排序,查询,修改等操作,还提供了将集合对象设置为不可变,对象集合实现同步控制的一些方法。

以上是java集合框架學習筆記的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn