面試集錦(六)資料結構(1)

zhusir發表於2018-08-22

java集合框架

collection和map

collection子類:

1.list 元素有序可重複

實現:arraylist類似動態陣列,長度可變,預設10

不是執行緒安全的,可用vector代替

linkedlist.類似於雙向連結串列.適合增刪,不是執行緒安全的

arraylist,適用於查詢

2.set 元素無序不可重複(根據hashcode確定位置)

實現:hashset,底層基於hashmap實現

linkedhashset.基於linkedhashmap實現,與hashset區別是增加了鏈式表結構

treeset:是一種二叉排序樹

3.queue

實現:queue+list - > linkedlist

map

鍵值對形式,key不能重複,value允許為空

實現類:hashmap

執行緒安全的map:currenthashmap, 不僅執行緒安全而且效率高(底層紅黑樹查詢效率較高)

陣列和連結串列的區別

1.陣列固定長度,容易浪費或不足,連結串列可以動態分配

2.陣列是在棧中(除了new出來的)分配,方便但是自由度差,連結串列是在堆中分配,自由度大但是管理麻煩

3.陣列用下標進行訪問,速度快,連結串列必須從頭訪問,速度慢

4.連結串列適合增刪

hashmap和hashtable的區別

1.hashmap是執行緒不安全的,hashtable是執行緒安全的

2.hashmap鍵,值都允許null存在,hashtable則不允許

3.執行緒原因,hashmap效率相對較高

hashmap的實現機制

1。維護一個每個元素都是一個連結串列的陣列,連結串列中的每個節點是一個entry【】鍵值對的陣列

2.實現了陣列+連結串列的特性,所以增刪查改都很快

3.每個新加入的節點放在連結串列首,然後該新加入的節點指向原連結串列首

4.對於每個key,對應的陣列索引下標示int i = hash(key,hashcode)& (len - 1)

堆,棧,佇列的區別

棧 用來存放區域性變數,形參或者計算的中間結果,變數所處的作用域一旦結束就立即釋放,先進後出

堆 用來存放陣列和new的物件或者成員變數,凡是new出來的都存在堆中(新建物件),不自動回收,使用者不能訪問

佇列 線性結構,先進先出(實現樹的層次遍歷)

string,stringbuffer和stringbuild區別

string每次操作字串時都會生成新的物件

stringbuffer不會生成新物件,而且是執行緒安全的

stringbuilder是執行緒不安全的(推薦常用)

演算法思想

1.貪心演算法(區域性最優解)

2.分治演算法(將規模為n的問題分為k個小問題,每個問題相互獨立且性質相同,求出小問題的解即得原問題的解)

3.動態規劃演算法(與分治法類似,前一問題為後一問題提供資訊,根據可能的解保留最優解,丟棄其他區域性解)

4.回溯演算法(搜尋嘗試的過程,當不滿足條件時回溯返回)

5.遞迴演算法(對重複問題分解為子問題,有一個遞迴終止條件)

抽象類和介面的區別

1.繼承方面:一個類只可以繼承一個類,可以實現多個介面

2.抽象方法方面:介面中全是抽象方法,抽象類中即可以有抽象方法,又可以有方法體

3.構造方法方面:介面中無構造方法。抽象類中有構造方法

4.例項化方面:抽象類不可以被例項化,介面不可以被繼承

5.修飾符方面:抽象類中方法可以用除了private以外的修飾符,介面中預設是public的

6.實現速度方面:抽象類比介面速度快

7.新增新方法時:抽象類不需要更改當前程式碼,但是介面需要更改實現該介面的類

object類的公用方法

1.equals判斷是否相等

2.clone克隆物件

3.tostring

4.hashcode方法

5.執行緒同步的方法

6.getclass獲取和當前類有關的資訊

jdk1.8新特性

1.允許介面新增一個非抽象的方法實現,只需要使用default關鍵字即可

2.lambda表示式(允許把一個函式作為一個方法的引數傳遞進方法中)

4.Date time api加強對時間和日期的處理

5.optinal類,用來解決空指標異常

如何實現對樹的層次遍歷--->佇列

連結串列(更改指標)

連結串列面試常見型別

結構:資料域+下一個節點的指標域

作用:資料的儲存按照一定的順序存放,可以在任意節點增加,刪除

型別:單向連結串列,雙向連結串列,迴圈連結串列

優點:順序結構,適合增刪

缺點:有指標域,佔用空間大;只知道頭節點的地址,查詢麻煩

1.連結串列反轉:定義三個指標,分別記錄當前遍歷到的結點,它的前一個結點以及後一個結點,然後依次遍歷,將當前結點的指標指向上一個結點

2.從尾到頭列印連結串列(反轉順序第一時間想到棧)

3.合併有序連結串列

4.判斷連結串列是否有環:定義兩個指標,我們用兩個指標去遍歷:first指標每次走一步,second指標每次走兩步,如果first指標和second指標相遇,說明有環。

5.求連結串列的倒數第k個結點

我們定義兩個指標,第一個指標從連結串列的頭指標開始遍歷向前走k-1步,第二個指標保持不動:從第k步開始,第二個指標也開始從連結串列的頭指標開始遍歷,由於兩個指標的距離保持在k-1,當第一個(走在前面的)指標到達連結串列的尾結點時,第二個指標(走在後面的)指標正好是倒數第k個結點.。




相關文章