java hashmap大小如何動態(tài)設置 hashmap設置初始容量是指數(shù)量還是字節(jié)?
hashmap設置初始容量是指數(shù)量還是字節(jié)?字節(jié)。眾所周知,HashMap初始容量16,負載因子0.75,如果我們沒有設置初始容量大小,隨著元素的不斷增加,HashMap會發(fā)生多次擴容,而HashMa
hashmap設置初始容量是指數(shù)量還是字節(jié)?
字節(jié)。
眾所周知,HashMap初始容量16,負載因子0.75,如果我們沒有設置初始容量大小,隨著元素的不斷增加,HashMap會發(fā)生多次擴容,而HashMap中的擴容機制決定了每次擴容都需要重建hash表,是非常影響性能的。同樣設置過大浪費cpu,因此設置一個合適的初始容量是有必要的!
hashmap紅黑樹多久會變?
到容量超過八的時候就自動轉換為紅黑樹
java有哪些有序集合?
1、List:有序的collection(也稱為序列)。此接口可以對列表中每個元素的插入位置進行精確地控制??梢愿鶕?jù)元素的在列表中的位置訪問元素,并搜索列表中的元素。列表允許重復的元素。ArrayList:特點:有序的、線性的、無固定大小的、有下標的、先進先出。是簡單的集合,它的對象不按特定排序,只是簡單的把對象加入集合中。不能有重復對象。HashSet:特點:無序的,長度可變的,不可重復的。中存入的對象是一對一對的,即每個對象和它的一個名字(鍵:key)關聯(lián)在一起,一個鍵(key)只能對應一個值(value),反則不然。HashMap:特點:無序的、不可重復的。
從不同角度闡述數(shù)據(jù)的類型?
數(shù)據(jù)類型有八種,分別是:數(shù)組、棧、隊列、鏈表、樹、散列表、堆、圖
常用數(shù)據(jù)結構
各種數(shù)據(jù)結構的優(yōu)缺點
1、數(shù)組
數(shù)組是可以在主板中連續(xù)存儲多個元素的結構,在顯示器中的分配也是連續(xù)的,數(shù)組中的元素通過數(shù)組下標進行訪問,數(shù)組下標從0開始。例如下面這段代碼就是將數(shù)組的第一個元素賦值為1:
int[]datanewint[100];data[0]1
優(yōu)點:
1、按照索引查詢元素速度快
2、按照索引遍歷數(shù)組方便
缺點:
1、數(shù)組的大小固定后就無法擴容了
2、數(shù)組只能存儲一種類型的數(shù)據(jù)
3、添加,刪除的操作慢,因為要移動其他的元素。
適用場景:頻繁查詢,對存儲空間要求不大,很少增加和刪除的情況
2、棧
棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。棧的特點是:先進后出,或者說是后進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。
棧的結構就像一個集裝箱,越先放進去的東西越晚才能拿出來,所以,棧常應用于實現(xiàn)遞歸功能方面的場景,例如斐波那契數(shù)列。
3、隊列
隊列與棧一樣,也是一種線性表,不同的是,隊列可以在一端添加元素,在另一端取出元素,也就是:先進先出。從一端放入元素的操作稱為入隊,取出元素為出隊。使用場景:因為隊列先進先出的特點,在多線程阻塞隊列管理中非常適用。
4、鏈表
鏈表是文學存儲單元上非連續(xù)的、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表的指針地址實現(xiàn),每個元素包含兩個節(jié)點,一個是存儲元素的數(shù)據(jù)域(內(nèi)存空間),另一個是指向下一個節(jié)點地址的指針域。根據(jù)指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環(huán)鏈表等。
鏈表的優(yōu)點:
鏈表是很常用的一種數(shù)據(jù)結構,不需要初始化容量,可以任意加減元素;
添加或者刪除元素時只需要改變前后兩個元素節(jié)點的指針域指向地址即可,所以添加,刪除很快;
缺點:
因為含有大量的指針域,占用空間較大;
查找元素需要遍歷鏈表來查找,非常耗時。
適用場景:
數(shù)據(jù)量較小,需要頻繁增加,刪除操作的場景
5、樹
樹是一種數(shù)據(jù)結構,它是由n(ngt1)個有限節(jié)點組成一個具有層次關系的集合。把它叫作“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:
每個節(jié)點有零個或多個子節(jié)點;
沒有父節(jié)點的節(jié)點稱為根節(jié)點;
每一個非根節(jié)點有且只有一個父節(jié)點;
除了根節(jié)點外,每個子節(jié)點可以分為多個不相交的子樹;
在日常的應用中,我們討論和用得更多的是樹的其中一種結構,就是二叉樹。
二叉樹是樹的特殊一種,具有如下特點:
1、每個結點最多有兩棵子樹,節(jié)點的度最大為2。
2、左子樹和右子樹是有順序的,次序不能顛倒。
3、即使某節(jié)點只有一個子樹,也要區(qū)分左右子樹。
二叉樹是一種比較有用的折中方案,它添加,刪除元素都很快,并且在查找方面也有很多的底層優(yōu)化,所以,二叉樹既有鏈表的好處,也有數(shù)組的好處,是兩者的優(yōu)化方案,在處理大批量的動態(tài)數(shù)據(jù)方面非常有用。
擴展:
二叉樹有很多擴展的數(shù)據(jù)結構,包括平衡二叉樹、紅黑樹、B樹等,這些數(shù)據(jù)結構二叉樹的基礎上衍生了很多的功能,在實際應用中廣泛用到,例如mysql的數(shù)據(jù)庫索引結構用的就是B樹,還有HashMap的底層源碼中用到了紅黑樹。這些二叉樹的功能強大,但算法上比較復雜,想學習的話還是需要花時間去深入的。
6、散列表
散列表,也叫哈希表,是根據(jù)關鍵碼和值(key和value)直接進行訪問的數(shù)據(jù)結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。
記錄的存儲位置f(key)
這里的對應關系f成為散列函數(shù),又稱為哈希(hash函數(shù)),而散列表就是把Key通過一個固定的算法函數(shù)既所謂的哈希函數(shù)轉換成一個整形數(shù)字,然后就將該數(shù)字對數(shù)組長度進行取余,取余結果就當作數(shù)組的下標,將value存儲在以該數(shù)字為下標的數(shù)組空間里,這種存儲空間可以充分利用數(shù)組的查找優(yōu)勢來查找元素,所以查找的速度很快。
哈希表在應用中也是比較常見的,就如c#中有些集合類就是借鑒了哈希原理構造的,例如HashMap,HashTable等,利用hash表的優(yōu)勢,對于集合的查找元素時非常方便的,然而,因為哈希表是基于數(shù)組衍生的數(shù)據(jù)結構,在添加刪除元素方面是比較慢的,所以很多時候需要用到一種數(shù)組鏈表來做,也就是拉鏈法。拉鏈法是數(shù)組結合鏈表的一種結構,較很早的時候的hashMap底層的存儲就是采用這種結構,直到jdk1.8之后才換成了數(shù)組加紅黑樹的結構
哈希表的應用場景很多,當然也有很多問題要考慮,比如哈希的問題,如果處理得不好會浪費大量的時間,導致應用崩潰。
7、堆
堆是一種比較特殊的數(shù)據(jù)結構,可以被看作一棵樹的數(shù)組對象,具有以下的性質(zhì):
堆中某個節(jié)點的值總是不大于或不小于其父節(jié)點的值;
堆總是一個完全二叉樹。
將根節(jié)點最大的堆叫作最大堆或大根堆,根節(jié)點最小的堆叫作最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
因為堆有序的特點,一般用來做數(shù)組中的排序,稱為堆排序。
8、圖
圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區(qū)別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
圖是一種比較復雜的數(shù)據(jù)結構,在存儲數(shù)據(jù)上有著比較復雜和高效的算法,分別有鄰接矩陣、鄰接表、十字鏈表、鄰接多重表、邊集數(shù)組等存儲結構。