摘要:是哈希表實現的,中的數據是無序的,可以放入,但只能放入一個,兩者中的值都不能重復,就如數據庫中唯一約束。四和的相同點和區別相同兩者都是基于哈希表實現的內部也都是通過單鏈表解決沖突問題同樣實現了序列化和克隆接口區別繼承的父類不同。
一.Arraylist與LinkedList有什么區別?
1、ArrayList是實現了基于動態數組的數據結構,因為地址連續,一旦數據存儲好了,查詢操作效率會比較高,但是插入和刪除操作效率比較低。
2、LinkedList基于鏈表的數據結構,地址是任意的,所以在開辟內存空間的時候不需要等一個連續的地址,所以增刪的時候其它元素的位置不用移動,增刪效率高,但查詢時通過指針移動查找,所以查詢效率低
1.線程安全問題,vector是java早期就有的,是線程安全的;arraylist是java2才出現,是線程不安全的。因為vector支持多線程操作,所以性能上比不上arraylist
2.集合擴充問題,vector擴容默認增加原來的一倍,Arraylist默認增加原來的0.5倍
(vector可以由我們自己設置增長的大小,arraylist沒有提供相關方法
1.TreeSet 是二叉樹實現的,Treeset中的數據是自動排好序的,不允許放入null值 。
2.HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如數據庫中唯一約束 。
相同:
(1)兩者都是基于哈希表實現的
(2)內部也都是通過單鏈表解決沖突問題
(3)同樣實現了序列化和克隆接口
區別:
(1)繼承的父類不同。AbstractMap和dictionary
(2) 線程安全不同,hashmap不同步,hashtable同步
(3)是否提供contains方法,hashmap不提供contains方法而改成了containsValue和containskey避免誤解
(4)key和value是否允許null,前者允許(key為null時放在table[0]),后者不允許。
(5)hash值不同,hashtable直接使用對象的hashcode(),而hashmap重新計算hash,
(6)初始化容量不同,hashtable默認容量11.hashmap16
hashmap內部維護一個存儲數據的Entry數組,hashmap采用鏈表解決沖突,每一個Entry本質上是一個單向鏈表,當準備添加一個鍵值對時,首先通過hash(key)方法計算哈希值,然后通過indexFor(hash,length)求出對應的存儲位置,然后插入該位置對應的鏈表頭中
六.談談fail-fast機制?fial-fast機制是集合中的一種錯誤機制,當多個線程對同一個集合的內容進行操作時,就可能發生fail-fast事件。例如一個線程對某個集合進行訪問的過程,該集合的內容被其它線程修改了,就會拋出currentModificationException異常,產生fail-fast事件。
原理:每次調用next方法,在實際訪問前,都會調用checkformodification方法,該方法會檢查當前的Modcount值和預期的Modcount值是否相等,如果不等就會拋currentModificationException異常
(1)在單線程遍歷過程中,如果要進行remove操作,可以調用迭代器的remove方法而不是集合的remove方法,(因為迭代器的remove方法不能指定元素,只能remove當前遍歷過的那個元素,所以調用該方法不會發生fail-fast現象)
(2)使用java并發包(java.util.concurrent)中的類來代替Arraylist和hashmap,比如CopyOnWriteArrayList(COW)寫時復制容器,在讀寫時是線程安全的,該容器在add,remove等操作時,并不是在原數組上修改,而是在原數組上拷貝一份,在新數組上修改,待完成后才將舊數組的引用指向新數組。所以CopyOnWrite容器只能保證數據的最終一致性,并不能保證數據的實時一致性
(1)從速度上看:System.arraycopy > clone > Arrays.copyOf > for
(2)for速度慢是因為每次都要從起點開始尋找指定下標,并且每次循環都要判斷是否達到數組最大長度
(3)system.arrayCopy()是一個native方法,(本地方法,即c/c++已經編譯成機器碼的方法)
事實上,java中只有一維數組,二維數組其實就是一個存放了數組的數組,創建一個二維數組時,一個數組對象所占的空間在堆上被分配,然后這個數組中的每一個元素空間又有一個引用指向另一個數組,這樣就構成了一個二維數組
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69160.html
摘要:本文是作者自己對中線程的狀態線程間協作相關使用的理解與總結,不對之處,望指出,共勉。當中的的數目而不是已占用的位置數大于集合番一文通版集合番一文通版垃圾回收機制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關聯任何信息和著任何元數據(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...
摘要:強大的表單驗證前端掘金支持非常強大的內置表單驗證,以及。面向對象和面向過程的區別的種設計模式全解析后端掘金一設計模式的分類總體來說設計模式分為三大類創建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強大的 Angular 表單驗證 - 前端 - 掘金Angular 支持非常強大的內置表單驗證,maxlength、minlength、required 以及 patt...
摘要:接口在類庫中有很多具體的實現。接口的意義是為各種具體的集合提供了最大化的統一操作方式。集合類框架的基本接口代表一組對象,每一個對象都是他的子元素不包含重復元素的有序的,可以包含重復元素將映射到的對象,不能重復。 寫在之前: 這篇文章是自己面試過程中,總結出來的關于Java集合類的總結。每次面試之前來出來看看,速度快,也能很迅速的回憶一些細節問題。發布這篇文章,不僅僅是希望大家臨陣磨槍,...
摘要:寫這篇總結,主要是記錄下自己的學習經歷,算是自己對知識的一個回顧。這個階段學習的時候,要學會使用開發工具,比如或者來學習。這個階段需要自己對自己有很強的自律去學習,不要看了一半就放棄了。 showImg(https://segmentfault.com/img/bVbaNtw?w=1232&h=822); 寫這篇總結,主要是記錄下自己的學習經歷,算是自己對知識的一個回顧。也給想要學習 ...
閱讀 3486·2021-11-12 10:36
閱讀 2857·2021-09-22 15:35
閱讀 2807·2021-09-04 16:41
閱讀 1163·2019-08-30 15:55
閱讀 3574·2019-08-29 18:43
閱讀 2070·2019-08-23 18:24
閱讀 1412·2019-08-23 18:10
閱讀 1921·2019-08-23 11:31