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個...