集合相關的一些面試題分析

2021-09-28 20:01:31 字數 4094 閱讀 7116

1.單列集合:

均是collection根介面的實現類

list:是乙個有序可重複的,可以利用索引快速查詢

單列集合

底層特點

區別使用

arraylist

陣列查詢快,增刪慢,不安全,效率高

1. arraylist底層使用的是陣列(存讀資料效率高,插入刪除特定位置效率低)

一般程式只用arraylist

linklist

鍊錶查詢慢,增刪快,不安全,效率高

1.linkedlist底層使用的是雙向迴圈鍊錶資料結構(插入,刪除效率特別高)

當資料特別多,而且經常需要插入刪除元素時建議選用linkedlist.

vector

陣列查詢快,增刪慢,安全,效率低

1.所有方法都是同步的。可以由兩個執行緒安全地訪問乙個vector物件

取出使用的是列舉,與迭代器類似

備註:arraylist****自動擴充機制

實現機制:arraylist.ensurecapacity(int mincapacity)

首先得到當前elementdata屬性的長度oldcapacity。然後通過判斷oldcapacity和mincapacity引數誰大來決定是否需要擴容, 如果mincapacity大於oldcapacity,那麼我們就對當前的list物件進行擴容。

擴容的的策略為:取(oldcapacity * 3)/2 + 1和mincapacity之間更大的那個。然後使用陣列拷貝的方法,把以前存放的資料轉移到新的陣列物件中。如果mincapacity不大於oldcapacity那麼就不進行擴容。

set:是乙個不可重複的

set特點

底層特性

hashset

無序、唯一

雜湊表根據物件的hashcode(雜湊值即物件在雜湊表中的位置)和equals(如果產生雜湊衝突使用)方法來決定的。如果我們往集合中存放自定義的物件,那麼保證其唯一,就必須複寫hashcode和equals方法建立屬於當前物件的比較方式。

linkedhashset

有序、唯一

鍊錶+雜湊表

根據hashcode的值來決定元素的儲存位置,但同時它還用乙個鍊錶來維護元素的插入順序,插入的時候即要計算hashcode又要維護鍊錶

treeset

有序、唯一

紅黑樹(自平衡排序二叉樹)

treeset指定排序規則:方式一:元素自身具備比較性;方式二:容器具備比較性 分為:自然排序和定製排序

enumset

有序列舉型別

訪問速度快,批量操作快

備註:\1. 二叉樹知識:

先去尋找是否有相同節點,如果沒就開闢乙個新的節點,和上一級根節點比較大的話放在左邊,小的換放在右邊

取出的時候先取出所有的左邊的元素再取自己最後取出右邊的

\2. treeset排序

一:自然排序(在元素中寫排序規則)

treeset (底層就是乙個二叉樹)

會呼叫compareto方法比較元素大小,然後按公升序排序。所以自然排序中的元素物件,都必須實現了comparable介面—à提供自然排序,否則會丟擲異常。treeset只允許存入同一類的元素否則就會丟擲型別轉換異常

二:定製排序(在集合中寫排序規則)

treeset還有一種排序就是定製排序,定製排序時候,需要關聯乙個 comparator物件(實現comparator介面),由comparator提供排序邏輯。

遍歷方式:

\1. 增強for迴圈:

可以簡化陣列,集合的遍歷

\2. 迭代器:

iterator是迭代器介面,迭代器介面的方法 hashnext()是用於判斷是否有下乙個元素. next()是取出下乙個元素的方法 在迭代的時候盡量不要用add或者remove方法 來改變集合的長度,因為迭代器記憶的是之前的長度. 導致併發修改異常.

使用迭代器更加執行緒安全,因為它可以確保,在當前遍歷的集合元素被更改的時候,它會丟擲concurrentmodificationexception。

2.雙列集合:

map:使用鍵值對儲存。map會維護與key有關聯的值。兩個key可以引用相同的物件,但key不能重複,典型的key是string型別,但也可以是任何物件,每個key只能對映乙個value

​ 保證key的唯一性依賴於它本身的方法和使用hashcode和equals方法(如果是乙個類的鍵,重寫hashcode,equals)

​ 雜湊表結構是一種陣列+鍊錶的結構:

​ jdk8引入了二叉樹,加快了查詢速度,當某乙個索引下的長度達到一定長度的時候,自動將鍊錶轉為二叉樹結構

​ 當有元素存進來先使用hashcode方法比較陣列中是否有相同的,沒有就開闢乙個新的索引位置,有就進行equals方法的比較相同的話不予新增,不同的話在索引下方鍊錶(jdk8達到長度後二叉樹)掛載

map特性

hashmap

鍵值對,key不能重複,但是value可以重複;允許null的鍵或值;儲存順序無序的,不同步的

key的實現就是hashset;value對應著放;

hashtable

執行緒安全的,不允許null的鍵或值; 同步的執行緒安全

hashtable內部的方法基本都經過synchronized修飾。 效率低,逐漸淘汰,轉而使用concurrenthashmap

concurrenthashmap

將資料分段儲存,然後給每一段資料配一把鎖,當乙個執行緒占用鎖訪問其中乙個段資料的時候,其他段的資料也能被其他執行緒訪問。 內部:是由segment陣列結構和hashentry陣列結構組成

在concurrenthashmap內部,段陣列是final的,並且其成員變數實際上也是final的,獲得鎖的順序是固定的,這可以確保不會出現死鎖 segment是一種可重入鎖reentrantlock,在concurrenthashmap裡扮演鎖的角色,hashentry則用於儲存鍵值對資料。乙個concurrenthashmap裡包含乙個segment陣列,segment的結構和hashmap類似,是一種陣列和鍊錶結構, 乙個segment裡包含乙個hashentry陣列,每個hashentry是乙個鍊錶結構的元素, 每個segment守護者乙個hashentry陣列裡的元素,當對hashentry陣列的資料進行修改時,必須首先獲得它對應的segment鎖。

linkedhashmap

此實現與 hashmap 相同

維護著乙個執行於所有條目的雙重鏈結列表。 儲存的資料是有序的。

treemap

對key排好序的map; 二叉樹進行儲存鍵和值

key 就是treeset, value對應每個key; key要實現comparable介面或treemap有自己的構造器;

properties

key和value都是string型別,用來讀配置檔案;

例項,資料來源的配置資訊

遍歷:​ 需要用到的方法:

​ public set keyset() : 將map所有的key封裝到乙個set的集合。

​ public v get(object key): 根據key(鍵)獲取map中對應的value(值)。

​ public set > entryset()>: 獲取所有的鍵值對物件集合。

​ public collection values() : 將 map中所有的value封裝到乙個collection體系的集合。

​ 第一種遍歷方式:

通過public set keyset()方法獲取到所有的鍵集合;

​ 遍歷鍵的集合得到每乙個鍵–à增強for

​ 根據鍵使用get方法在map中找到對應的value

通過public set > entryset()>獲取所有的鍵值對集合

迭代器遍歷鍵值對集合,獲取每乙個鍵值對物件/使用增強for迴圈獲取每乙個鍵值對物件

通過getkey,getvalue方法獲取鍵和值

通過public collection values()獲取到所有的值集合

鍵值對集合,獲取每乙個鍵值對物件/使用增強for迴圈獲取每乙個鍵值對物件

通過getkey,getvalue方法獲取鍵和值

通過public collection values()獲取到所有的值集合

遍歷集合獲取所有的值

一些面試題

q 您在什麼情況下會用到虛方法?它與介面有什麼不同?a 當在繼承類中想重寫某一方法時會用到虛方法 虛方法是類的成員函式,介面相當於抽象類.q override與過載有什麼區別?a override 就是覆蓋的意思,覆蓋父類的同名方法,而過載則是通過參數列來呼叫方法.q 值型別與引用型別有什麼區別?a...

一些面試題

1.如何檢視埠8080的程序 netstat anp grep 8080 lsof i 8080 2.在 tmp目錄下建立test.txt檔案,內容為 hello,world 用乙個命令寫出來。echo hello,world tmp test.txt 3.敘述下列服務的預設埠號。ftp 20,21...

一些面試題

1.給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 解 先選中前k個,從第k 1個元素到最後乙個元素為止,以k i i k 1,k 2,n 的概率選中第i個...