collection集合 地址_java.util包下的集合
Java 集合可分為?Collection 和?Map 兩種體系
1.Collection接口:單列數據,定義了存取一組對象的方法的集合
- List:元素有序、可重復的集合
- Set:元素無序、不可重復的集合
ArrayList是對象引用的一個”變長”數組,
ArrayList的JDK1.8之前與之后的實現區別?
JDK1.7:ArrayList像餓漢式,直接創建一個初始容量為10的數組
JDK1.8:ArrayList像懶漢式,一開始創建一個長度為0的數組,當添加第一個元素時再創建一個始容量為10的數組
Arrays.asList(…) 方法返回的 List 集合,既不是 ArrayList 實例,也不是 Vector實例。Arrays.asList(…) 返回值是一個固定長度的 List 集合
雙向鏈表,內部沒有聲明數組,而是定義了Node類型的first和last,用于記錄首末元素。同時,定義內部類Node,作為LinkedList中保存數據的基本結構
對于頻繁的插入或刪除元素的操作,建議使用LinkedList類,效率較高
JDK1.0就有了,大多數操作與ArrayList相同,區別之處在于Vector是線程安全的
雖然線程安全,但還是不使用,因為它實在是太慢了,一般是ArrayList,插入和刪除頻繁時,就使用LinkedList
面試題:請問ArrayList/LinkedList/Vector的異同?談談你的理解?ArrayList底層是什么?擴容機制?Vector和ArrayList的最大區別?
ArrayList和LinkedList的異同二者都線程不安全,相對線程安全的Vector,執行效率高。此外,ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。對于新增和刪除操作add(特指插入)和remove,LinkedList比較占優勢,因為ArrayList要移動數據。
Vector和ArrayList幾乎是完全相同的,唯一的區別在于Vector是同步類(synchronized),屬于強同步類。因此開銷就比ArrayList要大,訪問要慢。正常情況下,大多數的Java程序員使用ArrayList而不是Vector,因為同步完全可以由程序員自己來控制。Vector每次擴容請求其大小的2倍空間,而ArrayList是1.5倍。Vector還有一個子類Stack。
(2) Set接口的實現類常用的有:HashSet、TreeSet和LinkedHashSet
Set接口是Collection的子接口,set接口沒有提供額外的方法;
Set 集合不允許包含相同的元素,如果試把兩個相同的元素加入同一個 Set 集合中,則添加操作失敗;
Set 判斷兩個對象是否相同不是使用?== 運算符,而是根據?equals() 方法
HashSet 是?Set 接口的典型實現,大多數時候使用?Set 集合時都使用這個實現類;
HashSet 按?Hash 算法來存儲集合中的元素,因此具有很好的存取、查找、刪除性能
無序、線程不安全,元素可以為null
HashSet 集合判斷兩個元素相等的標準:兩個對象通過 hashCode()?方法比較相等,并且兩個對象的 equals() 方法返回值也相等
存放在Set容器中的對象,對應的類一定要重寫equals()和hashCode(Object?obj)方法,以實現對象相等規則
底層是數組,16,0.75,擴容為2倍
重寫兩個方法需要保證:相等的對象必須具有相等的散列碼(直接使用系統提供的)
HashSet 的子類
LinkedHashSet 根據元素的?hashCode 值來決定元素的存儲位置,但它同時使用雙向鏈表維護元素的次序,這使得元素看起來是以插入順序保存的
LinkedHashSet插入性能略低于?HashSet,但在迭代訪問?Set?里的全部元素時有很好的性能
不允許集合元素重復
TreeSet 是?SortedSet 接口的實現類,TreeSet 可以確保集合元素處于排序狀態
底層是紅黑樹
兩種排序方法:自然排序和定制排序。默認情況下,TreeSet 采用自然排序
有序,查詢速度比list快
難題:
2.Map接口:雙列數據,保存具有映射關系“key-value對”的集合
Map 中的?key?用Set來存放,不允許重復,即同一個?Map 對象所對應的類,須重寫hashCode()和equals()方法
key 和?value 都可以是任何引用類型的數據
key 和?value 之間存在單向一對一關系,即通過指定的?key 總能找到唯一的、確定的?value
HashMap是?Map?接口使用頻率最高的實現類
Set keySet():返回所有key構成的Set集合
Collection values():返回所有value構成的Collection集合
Set entrySet():返回所有key-value對構成的Set集合
- HashMap是 Map 接口使用頻率最高的實現類。
- 允許使用null鍵和null值,與HashSet一樣,不保證映射的順序。
- 所有的key構成的集合是Set:無序的、不可重復的。所以,key所在的類要重寫:equals()和hashCode()
- 所有的value構成的集合是Collection:無序的、可以重復的。所以,value所在類要重寫:equals()
- 一個key-value構成一個entry
- 所有的entry構成的集合是Set:無序的、不可重復的
- HashMap 判斷兩個 key 相等的標準是:兩個 key 通過 equals() 方法來返回true,hashCode 值也相等。
- HashMap 判斷兩個 value相等的標準是:兩個 value 通過 equals() 方法返回 true。
面試題:負載因子值的大小,對HashMap有什么影響
負載因子的大小決定了HashMap的數據密度。
負載因子越大密度越大,發生碰撞的幾率越高,數組中的鏈表越容易長,造成查詢或插入時的比較次數增多,性能會下降。
負載因子越小,就越容易觸發擴容,數據密度也越小,意味著發生碰撞的幾率越小,數組中的鏈表也就越短,查詢和插入時比較的次數也越小,性能會更高。但是會浪費一定的內容空間。而且經常擴容也會影響性能,建議初始化預設大一點的空間。
按照其他語言的參考及研究經驗,會考慮將負載因子設置為0.7~0.75,此時平均檢索長度接近于常數。
(2)LinkedHashMap
LinkedHashMap 是?HashMap 的子類
在HashMap存儲結構的基礎上,使用了一對雙向鏈表來記錄添加元素的順序
與LinkedHashSet類似,LinkedHashMap 可以維護?Map 的迭代
迭代順序與?Key-Value 對的插入順序一致
TreeMap存儲 Key-Value 對時,需要根據 key-value 對進行排序。
TreeMap 可以保證所有的?Key-Value 對處于有序狀態。
TreeSet底層使用紅黑樹結構存儲數據
TreeMap 的 Key 的排序:
- 自然排序:TreeMap 的所有的 Key 必須實現 Comparable 接口,而且所有的 Key 應該是同一個類的對象,否則將會拋出 ClasssCastException
- 定制排序:創建 TreeMap 時,傳入一個 Comparator 對象,該對象負責對 TreeMap 中的所有 key 進行排序。此時不需要 Map 的 Key 實現 Comparable 接口?
TreeMap判斷兩個key相等的標準:兩個key通過compareTo()方法或者compare()方法返回0。
Properties 類是?Hashtable 的子類,該對象用于處理屬性文件
由于屬性文件里的?key-value 都是字符串類型,所以?Properties?里的?key?和?value 都是字符串類型
存取數據時,建議使用setProperty(String key,String value)方法和?getProperty(String key)方法
看到這里,你知道Collections和Collection的區別嗎?
Collections 是一個操作?Set、List 和?Map 等集合的工具類
Collections 中提供了一系列靜態的方法對集合元素進行排序、查詢和修改等操作,還提供了對集合對象設置不可變、對集合對象實現同步控制等方法
操作數組的工具類:Arrays
線程同步問題
1、一些知識點
v. 同步代碼塊中的同步監視器(鎖)和共享數據的理解。
? ?同步監視器:任何一個類的對象都可以是鎖;多個線程共用一把鎖。
???共享數據:多個線程共同操作的數據;
???需要同步機制將共享數據包起來,這樣線程安全,注意性能。
2、數組和集合的區別
數組聲明了它容納的元素的類型,而集合不聲明。
數組是靜態的,一個數組實例具有固定的大小,一旦創建了就無法改變容量了。而集合是可以動態擴展容量,可以根據需要動態改變大小,集合提供更多的成員方法,能滿足更多的需求。
數組的存放的類型只能是一種(基本類型/引用類型),集合存放的類型可以不是一種(不加泛型時添加的類型是Object)。
數組是java語言中內置的數據類型,是線性排列的,執行效率或者類型檢查都是最快的。
總結
以上是生活随笔為你收集整理的collection集合 地址_java.util包下的集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 萤火虫算法_智能优化算法萤火虫算法
- 下一篇: halcon机器视觉算法原理与编程实战_