1、有幾種常見集合?各有什麼特點?
collection是所有集合類的根介面,collections是提供集合操作的工具類,常用的集合有:
set代表無序集合,無序不可重複,有hashset,treeset
list代表有序集合,有序可重複,有arraylist,linkedlist
map集合儲存鍵值對,常用的有hashmap,treemap
2、在哪些場景使用這些集合?
list裡存放的物件是有序的,同時也是可以重複的,其特點是list關注的是索引,擁有一系列和索引相關的方法,查詢速度快,往list集合裡插入或刪除資料時,會伴隨著後面資料的移動,所有插入刪除資料速度慢。
arraylist是基於陣列的,在初始化arraylist時,會構建空陣列,當發覺同時新增乙個或者是多個元素,陣列長度不夠時,就擴容。
linkedlist是基於鍊錶的,它是乙個雙向鍊錶,每個節點維護了乙個prev和next指標。
總結:根據其特點,經常使用查詢,list的實現類如arraylist可以提供更快速的訪問,如果經常新增刪除元素,選擇linkedlist基於鍊錶更快的刪除,如果想讓容器的元素能夠按照他們的插入次序進行有序儲存,使用list,list是乙個有序容器,他按照插入順序進行儲存。
set不允許有重複物件,無序容器,無法保證每個元素的儲存順序,treeset通過comparator維護乙個排序順序,如果你想保證插入元素的唯一性,也就是你不想有重複值的出現,那麼可以選擇乙個 set 的實現類,比如 hashset、linkedhashset 或者 treeset。
以鍵和值的形式進行資料儲存那麼 map。
private setroles = new hashset();list list = new arraylist();
//將查詢條件封裝到map中
mapmap = new hashmap();
map.put("reportdate", reportdate);
3、hashset是怎麼保證唯一性的?
hashset的底層儲存資料結構是雜湊表, 它是根據雜湊值和equals方法來確保集合元素的唯一性
原理:如果乙個元素要存入,首先會判斷集合是否存在與該元素的hashcode相同的元素, 如果不存在,則把元素存入hashset集合,如果存在,則繼續呼叫equals繼續比較,如果equals方法返回true,證明集合已經存在該元素,所以不新增,如果返回false,證明該元素在集合中存在乙個相同雜湊值,內容不同的元素,所以把該元素新增到與該元素相同雜湊值的元素後面。
4、hashmap的底層結構,實現原理?
jdk1.8 之前 hashmap 底層是 陣列和鍊錶 結合在一起使用也就是 鍊錶雜湊。hashmap 通過 key 的 hashcode 經過擾動函式處理過後得到 hash 值,然後通過 (n-1)&hash 判斷當前元素存放的位置(這裡的 n 指的是陣列的長度),如果當前位置存在元素的話,就判斷該元素與要存入的元素的 hash 值以及 key 是否相同,如果相同的話,直接覆蓋,不相同就通過拉鍊法解決衝突。
所謂擾動函式指的就是 hashmap 的 hash 方法。使用 hash 方法也就是擾動函式是為了防止一些實現比較差的 hashcode() 方法 換句話說使用擾動函式之後可以減少碰撞。
jdk 1.8 hashmap 的 hash 方法原始碼:
static final int hash(object k)
複製**
對比一下 jdk1.7的 hashmap 的 hash 方法原始碼.
static final int hash(int h)複製**
相比於jdk1.8 的hash 方法 ,jdk 1.7 的hash 方法的效能會稍差一點點,因為畢竟擾動了4 次。
所謂 「拉鍊法」 就是:將鍊錶和陣列相結合。也就是說建立乙個鍊錶陣列,陣列中每一格就是乙個鍊錶。若遇到雜湊衝突,則將衝突的值加到鍊錶中即可。
相比於之前的版本,jdk1.8之後在解決雜湊衝突時有了較大的變化,當鍊表長度大於閾值(預設為8)時,將鍊錶轉化為紅黑樹,以減少搜尋時間。
treemap、treeset以及jdk1.8之後的hashmap底層都用到了紅黑樹。紅黑樹就是為了解決二叉查詢樹的缺陷,因為二叉查詢樹在某些情況下會退化成乙個線性結構。
編輯| web小專案
PHP簡答和程式筆試題目
答 php全稱 hypertext preprocessor,是一種用來開發動態 的伺服器指令碼語言。答 echo是乙個語言結構,沒有返回值。print是乙個函式,返回int型別的值 只能列印int string print r 是乙個函式,返回bool型別值,按結構輸出變數的值,列印關於變數的易於...
筆試題 Multicore簡答題(上)
1 記憶體中儲存區域不同。全域性和靜態存在靜態區中,區域性儲存在堆疊中。2 作用域不同 全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。...
JAVA面試題 簡答題
1.和 的區別 1 和 都可以用作邏輯與的運算子,表示邏輯與 and 當運算子兩邊表示式結果都為true時,整個運算結果才為true 否則,只要有一邊表示式為false,則運算結果為false。2 具有短路功能,即如果第乙個表示式結果為false,則不會計算第二個表示式,直接返回false 3 可以...