色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

怎樣才能自學Java集合框架

錢諍諍2年前16瀏覽0評論

怎樣才能自學Java集合框架?

Java集合常見問題答疑

集合框架

ArrayList 和 Vector 的區別。這兩個類都實現了 List 接口(List 接口繼承了 Collection 接口),他們都是有序集合,即存儲在這兩個集合中的元素的位置都是有順序的,相當于一種動態的數組,我們以后可以按位置索引號取出某個元素,并且其中的數據是允許重復的,這是HashSet 之類的集合的最大不同處,HashSet 之類的集合不可以按索引號去檢索其中的元素,也不允許有重復的元素(本來題目問的與 hashset 沒有任何關系,但為了說清楚 ArrayList 與 Vector 的功能,我們使用對比方式,更有利于說明問題)。接著才說 ArrayList 與 Vector 的區別,這主要包括兩個方面。? 同步性:Vector 是線程安全的,也就是說是它的方法之間是線程同步的,而 ArrayList 是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用 ArrayList,因為它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用 Vector,因為不需要我們自己再去考慮和編寫線程安全的代碼。備注:對于 Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住 Vector 與 Hashtable 是舊的,是 java 一誕生就提供了的,它們是線程安全的,ArrayList 與 HashMap 是 java2 時才提供的,它們是線程不安全的。所以,我們先講老的。

數據增長:ArrayList 與 Vector 都有一個初始的容量大小,當存儲進它們里面的元素的個數超過了容量時,就需要增加 ArrayList 與 Vector 的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數在內存空間利用與程序效率之間要取得一定的平衡。Vector 默認增長為原來兩倍,而ArrayList 的增長策略在文檔中沒有明確規定(從源代碼看到的是增長為原來的 1.5倍)。ArrayList 與 Vector 都可以設置初始的空間大小,Vector 還可以設置增長的空間大小,而 ArrayList 沒有提供設置增長空間的方法。總結:即 Vector 增長原來的一倍,ArrayList 增加原來的 0.5 倍。

說說 ArrayList,Vector, LinkedList 的存儲性能和特性。ArrayList 和 Vector 都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector 由于使用了synchronized 方法(線程安全)。通常性能上較 ArrayList 差,而 LinkedList 使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快 。ArrayList 在查找時速度快,LinkedList 在插入與刪除時更具優勢。快速失敗 (fail-fast) 和安全失敗 (fail-safe) 的區別是什么?Iterator 的安全失敗是基于對底層集合做拷貝,因此,它不受源集合上修改的影響。java.util 包下面的所有的集合類都是快速失敗的,而 java.util.concurrent 包下面的所有的類都是安全失敗的。快速失敗的迭代器會拋出ConcurrentModificationException 異常,而安全失敗的迭代器永遠不會拋出這樣的異常。hashmap 的數據結構。在 java 編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,hashmap 也不例外。Hashmap 實際上是一個數組和鏈表的結合體(在數據結構中,一般稱之為 “鏈表散列 “) 編輯

enter image description here

HashMap 的工作原理是什么?Java 中的 HashMap 是以鍵值對 (key-value) 的形式存儲元素的。HashMap 需要一個 hash 函數,它使用 hashCode()和 equals()方法來向集合 / 從集合添加和檢索元素。當調用 put() 方法的時候,HashMap 會計算 key 的 hash 值,然后把鍵值對存儲在集合中合適的索引上。 如果 key 已經存在了,value 會被更新成新值。HashMap 的一些重要的特性是它的容量 (capacity),負載因子 (load factor) 和擴容極限(threshold resizing)。Hashmap 什么時候進行擴容呢?當 hashmap 中的元素個數超過數組大小 loadFactor 時,就會進行數組擴容,loadFactor 的默認值為 0.75,也就是說,默認情況下,數組大小為 16,那么當hashmap 中元素個數超過 160.75=12 的時候,就把數組的大小擴展為 216=32,即擴大一倍,然后重新計算每個元素在數組中的位置,而這是一個非常消耗性能的操作,所以如果我們已經預知 hashmap 中元素的個數,那么預設元素的個數能夠有效的提高 hashmap 的性能。比如說,我們有 1000 個元素 new HashMap(1000),但是理論上來講 new HashMap(1024) 更合適,不過上面 annegu 已經說過,即使是 1000,hashmap 也自動會將其設置為 1024。 但是 new HashMap(1024) 還不是更合適的,因為 0.75*1000 < 1000, 也就是說為了讓 0.75 * size > 1000, 我們必須這樣 new HashMap(2048) 才最合適,既考慮了 & 的問題,也避免了 resize的問題。List、Map、Set 三個接口,存取元素時,各有什么特點?這樣的題屬于隨意發揮題:這樣的題比較考水平,兩個方面的水平:一是要真正明白這些內容,二是要有較強的總結和表述能力。如果你明白,但表述不清楚,在別人那里則等同于不明白。首先,List 與 Set 具有相似性,它們都是單列元素的集合,所以,它們有一個功共同的父接口,叫 Collection。Set 里面不允許有重復的元素,所謂重復,即不能有兩個相等(注意,不是僅僅是相同)的對象 ,即假設 Set 集合中有了一個 A 對象,現在我要向 Set 集合再存入一個 B 對象,但 B 對象與 A 對象 equals 相等,則 B 對象存儲不進去,所以,Set 集合的 add 方法有一個 boolean 的返回值,當集合中沒有某個元素,此時 add 方法可成功加入該元素時,則返回 true,當集合含有與某個元素 equals 相等的元素時,此時 add 方法無法加入該元素,返回結果為 false。Set 取元素時,沒法說取第幾個,只能以 Iterator 接口取得所有的元素,再逐一遍歷各個元素。List 表示有先后順序的集合, 注意,不是那種按年齡、按大小、按價格之類的排序。當我們多次調用 add(Obj e) 方法時,每次加入的對象就像火車站買票有排隊順序一樣,按先來后到的順序排序。有時候,也可以插隊,即調用 add(int index,Obj e) 方法,就可以指定當前對象在集合中的存放位置。一個對象可以被反復存儲進 List 中,每調用一次 add 方法,這個對象就被插入進集合中一次,其實,并不是把這個對象本身存儲進了集合中,而是在集合中用一個索引變量指向這個對象,當這個對象被add 多次時,即相當于集合中有多個索引指向了這個對象,如圖 x 所示。List 除了可以以 Iterator 接口取得所有的元素,再逐一遍歷各個元素之外,還可以調用get(index i) 來明確說明取第幾個。Map 與 List 和 Set 不同,它是雙列的集合,其中有 put 方法,定義如下:put(obj key,obj value),每次存儲時,要存儲一對 key/value,不能存儲重復的key,這個重復的規則也是按 equals 比較相等。取則可以根據 key 獲得相應的value,即 get(Object key) 返回值為 key 所對應的 value。另外,也可以獲得所有的 key 的結合,還可以獲得所有的 value 的結合,還可以獲得 key 和 value 組合成的 Map.Entry 對象的集合。List 以特定次序來持有元素,可有重復元素。Set 無法擁有重復元素, 內部排序。Map 保存 key-value 值,value 可多值。HashSet 按照 hashcode 值的某種運算方式進行存儲,而不是直接按 hashCode值的大小進行存儲。例如,"abc" ---> 78,"def" ---> 62,"xyz" ---> 65 在hashSet 中的存儲順序不是 62,65,78,這些問題感謝以前一個叫崔健的學員提出,最后通過查看源代碼給他解釋清楚,看本次培訓學員當中有多少能看懂源碼。LinkedHashSet 按插入的順序存儲,那被存儲對象的 hashcode 方法還有什么作用呢?學員想想! hashset 集合比較兩個對象是否相等,首先看 hashcode 方法是否相等,然后看 equals 方法是否相等。new 兩個 Student 插入到 HashSet 中,看HashSet 的 size,實現 hashcode 和 equals 方法后再看 size。同一個對象可以在 Vector 中加入多次。往集合里面加元素,相當于集合里用一根繩子連接到了目標對象。往 HashSet 中卻加不了多次的。Set 里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用 == 還是equals()? 它們有何區別?Set 里的元素是不能重復的,元素重復與否是使用 equals() 方法進行判斷的。equals() 和 == 方法決定引用值是否指向同一對象 equals() 在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。兩個對象值相同 (x.equals(y) == true),但卻可有不同的 hash code,這句話對不對?對。如果對象要保存在 HashSet 或 HashMap 中,它們的 equals 相等,那么,它們的 hashcode 值就必須相等。如果不是要保存在 HashSet 或 HashMap,則與 hashcode 沒有什么關系了,這時候 hashcode 不等是可以的,例如 arrayList 存儲的對象就不用實現 hashcode,當然,我們沒有理由不實現,通常都會去實現的。heap 和 stack 有什么區別。Java 的內存分為兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用于存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。堆是與棧作用不同的內存,一般用于存放不放在當前方法棧中的那些數據,例如,使用 new 創建的對象都放在堆里,所以,它不會隨方法的結束而消失。方法中的局部變量使用 final 修飾后,放在堆中,而不是棧中。Java 集合類框架的基本接口有哪些?集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它 自己的方式對元素進行保存和排序。有的集合類允許重復的鍵,有些不允許。Java 集合類提供了一套設計良好的支持對一組對象進行操作的接口和類。Java 集合類里面 最基本的接口有:Collection:代表一組對象,每一個對象都是它的子元素。Set:不包含重復元素的 Collection。List:有順序的 collection,并且可以包含重復元素。Map:可以把鍵 (key) 映射到值 (value) 的對象,鍵不能重復。HashSet 和 TreeSet 有什么區別?HashSet 是由一個 hash 表來實現的,因此,它的元素是無序的。add(),remove(),contains()TreeSet 是由一個樹形的結構來實現的,它里面的元素是有序的。因此,add(),remove(),contains() 方法的時間復雜度是 O(logn)。HashSet 的底層實現是什么?通過看源碼知道 HashSet 的實現是依賴于 HashMap 的,HashSet 的值都是存儲在 HashMap 中的。在 HashSet 的構造法中會初始化一個 HashMap 對象,HashSet 不允許值重復,因此,HashSet 的值是作為 HashMap 的 key 存儲在HashMap 中的,當存儲的值已經存在時返回 false。LinkedHashMap 的實現原理?LinkedHashMap 也是基于 HashMap 實現的,不同的是它定義了一個 Entryheader,這個 header 不是放在 Table 里,它是額外獨立出來的。LinkedHashMap 通過繼承 hashMap 中的 Entry, 并添加兩個屬性 Entrybefore,after, 和 header 結合起來組成一個雙向鏈表,來實現按插入順序或訪問順序排序。LinkedHashMap 定義了排序模式 accessOrder,該屬性為 boolean 型變量,對于訪問順序,為 true;對于插入順序,則為 false。一般情況下,不必指定排序模式,其迭代順序即為默認為插入順序。為什么集合類沒有實現 Cloneable 和 Serializable 接口?克隆 (cloning) 或者是序列化 (serialization) 的語義和含義是跟具體的實現相關的。因此,應該 由集合類的具體實現來決定如何被克隆或者是序列化。什么是迭代器 (Iterator)?Iterator 接口提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代 器實例的迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素, 但是不可以直接調用集合的 remove(Object Obj) 刪除,可以通過迭代器的 remove() 方法刪除。Iterator 和 ListIterator 的區別是什么?下面列出了他們的區別:Iterator 可用來遍歷 Set 和 List 集合,但是 ListIterator 只能用來遍歷 List。Iterator 對集合只能是前向遍歷,ListIterator 既可以前向也可以后向。ListIterator 實現了 Iterator 接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。數組 (Array) 和列表 (ArrayList) 有什么區別?什么時候應該使用 Array 而不是ArrayList?Array 可以包含基本類型和對象類型,ArrayList 只能包含對象類型。Array 大小是固定的,ArrayList 的大小是動態變化的。ArrayList 處理固定大小的基本數據類型的時候,這種方式相對比較慢。Java 集合類框架的最佳實踐有哪些?? 假如元素的大小是固 定的,而且能事先知道,我們就應該用 Array 而不是ArrayList。? 有些集合類允許指定初始容量。因此,如果我們能估計出存儲的元素的數目,我們可以設置 初始容量來避免重新計算 hash 值或者是擴容。? 為了類型安全,可讀性和健壯性的原因總是要使用泛型。同時,使用泛型還可以避免運行時的 ClassCastException。? 使用 JDK 提供的不變類 (immutable class) 作為 Map 的鍵可以避免為我們自己的類實現 hashCode()和 equals()方法。? 編程的時候接口優于實現。? 底層的集合實際上是空的情況下,返回長度是 0 的集合或者是數組,不要返回 null。Set 里的元素是不能重復的,那么用什么方法來區分重復與否呢?是用 == 還是equals()?它們有何區別?Set 里的元素是不能重復的,那么用 iterator() 方法來區分重復與否。equals() 是判讀兩個 Set 是否相等equals() 和 == 方法決定引用值是否指向同一對象 equals() 在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值Comparable 和 Comparator 接口是干什么的?列出它們的區別。Java 提供了只包含一個 compareTo() 方法的 Comparable 接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明輸入對象小于,等于,大于已經存在的對象。Java 提供了包含 compare() 和 equals() 兩個方法的 Comparator 接口。compare() 方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小于,等于,大于第二個參數。equals() 方法需要一個對象作為參數,它用來決定輸入參數是否和 comparator 相等。只有當輸入參數也是一個 comparator 并且輸入參數和當前 comparator 的排序結果是相同的時 候,這個方法才返回 true。Collection 和 Collections 的區別。collection 是集合類的上級接口, 繼承與它的接口主要是 set 和 list。collections 類是針對集合類的一個幫助類. 它提供一系列的靜態方法對各種集合的搜索, 排序, 線程安全化等操作。