1.Java的HashMap是如何工做的?
HashMap是一個針對數據結構的鍵值,每一個鍵都會有相應的值,關鍵是識別這樣的值。javascript
HashMap 基於 hashing 原理,咱們經過 put ()和 get ()方法儲存和獲取對象。當咱們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓後找到 bucket 位置來儲存值對象。當獲取對象時,經過鍵對象的 equals ()方法找到正確的鍵值對,而後返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每一個 LinkedList 節點中儲存鍵值對對象。css
參考:前端
2.什麼是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引起ConcurrentModifcationException在底層集合迭代過程當中被修改。故障安全做爲發生在實例中的一個副本迭代是不會拋出任何異常的。快速失敗的故障安全範例定義了當遭遇故障時系統是如何反應的。例如,用於失敗的快速迭代器ArrayList和用於故障安全的迭代器ConcurrentHashMap。ajax
3.Java BlockingQueue是什麼?
Java BlockingQueue是一個併發集合util包的一部分。BlockingQueue隊列是一種支持操做,它等待元素變得可用時來檢索,一樣等待空間可用時來存儲元素。算法
4.何時使用ConcurrentHashMap?
在問題2中咱們看到ConcurrentHashMap被做爲故障安全迭代器的一個實例,它容許完整的併發檢索和更新。當有大量的併發更新時,ConcurrentHashMap此時能夠被使用。這很是相似於Hashtable,但ConcurrentHashMap不鎖定整個表來提供併發,因此從這點上ConcurrentHashMap的性能彷佛更好一些。因此當有大量更新時ConcurrentHashMap應該被使用。spring
5.哪個List實現了最快插入?
LinkedList和ArrayList是另個不一樣變量列表的實現。ArrayList的優點在於動態的增加數組,很是適合初始時總長度未知的狀況下使用。LinkedList的優點在於在中間位置插入和刪除操做,速度是最快的。數據庫
LinkedList實現了List接口,容許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操做使LinkedList可被用做堆棧(stack),隊列(queue)或雙向隊列(deque)。設計模式
ArrayList實現了可變大小的數組。它容許全部元素,包括null。 每一個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增長,可是增加算法並無定義。當須要插入大量元素時,在插入前能夠調用ensureCapacity方法來增長ArrayList的容量以提升插入效率。
6.Iterator和ListIterator的區別
ListIterator有add()方法,能夠向List中添加對象,而Iterator不能。
ListIterator和Iterator都有hasNext()和next()方法,能夠實現順序向後遍歷,可是ListIterator有hasPrevious()和previous()方法,能夠實現逆向(順序向前)遍歷。Iterator就不能夠。
ListIterator能夠定位當前的索引位置,nextIndex()和previousIndex()能夠實現。Iterator沒有此功能。
均可實現刪除對象,可是ListIterator能夠實現對象的修改,set()方法能夠實現。Iierator僅能遍歷,不能修改。
7.什麼是CopyOnWriteArrayList,它與ArrayList有何不一樣?
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中全部可變操做(add、set等等)都是經過對底層數組進行一次新的複製來實現的。相比較於ArrayList它的寫操做要慢一些,由於它須要實例的快照。
CopyOnWriteArrayList中寫操做須要大面積複製數組,因此性能確定不好,可是讀操做由於操做的對象和寫操做不是同一個對象,讀之間也不須要加鎖,讀和寫之間的同步處理只是在寫完後經過一個簡單的」=」將引用指向新的數組對象上來,這個幾乎不須要時間,這樣讀操做就很快很安全,適合在多線程裏使用,絕對不會發生ConcurrentModificationException ,所以CopyOnWriteArrayList適合使用在讀操做遠遠大於寫操做的場景裏,好比緩存。
8.迭代器和枚舉之間的區別
若是面試官問這個問題,那麼他的意圖必定是讓你區分Iterator不一樣於Enumeration的兩個方面:
Iterator容許移除從底層集合的元素。
Iterator的方法名是標準化的。
9.Hashmap如何同步?
當咱們須要一個同步的HashMap時,有兩種選擇:
使用Collections.synchronizedMap(..)來同步HashMap。
使用ConcurrentHashMap的
這兩個選項之間的首選是使用ConcurrentHashMap,這是由於咱們不須要鎖定整個對象,以及經過ConcurrentHashMap分區地圖來得到鎖。
10.IdentityHashMap和HashMap的區別
IdentityHashMap是Map接口的實現。不一樣於HashMap的,這裏採用參考平等。
在HashMap中若是兩個元素是相等的,則key1.equals(key2)
在IdentityHashMap中若是兩個元素是相等的,則key1 == key2
11.mybatis的優缺點?
優勢:SQL寫在XML中,便於統一管理和優化
提供映射標籤,支持對象和數據庫的orm字段關係映射
能夠對SQL進行優化
缺點: SQL工做量大
mybagtis移植姓很差
不支持級聯
mybatis學習:
12.談談SSH整合?
struts(表示層)+spring(業務層)+hibernate(持久層)
struts是一個表示層的框架,主要用於接收請求,分發請求。struts其實屬於MVC中的VC層次的
hibernate是一個持久層的框架,主要負責與關係數據庫的操做
spring是一個業務層的框架,是一個整合的框架,可以很好的黏合表示層和持久層。
13.maven是什麼?有什麼做用?
是一個項目管理、構建工具
做用:幫助下載jar 尋找依賴,幫助下載依賴 熱部署、熱編譯
14.WEB 前端優化?
減小HTTP請求的數量(合併css、js、圖片)
利用瀏覽器的緩存機制
利用GZIP壓縮機制:只針對文本類資源有效
把CSS文件放在HTML開頭
把javascript文件放在HTML結尾
避免CSS表達式(判斷瀏覽器)
使用javascript壓縮
減小DNS查找
避免重定向
使用ajax
15.安全性測試
利用安全性測試技術,找到潛在的漏洞
16.事務隔離級別(4種)
Serializable(串行化):一個事務在執行過程當中徹底看不到其餘事物對數據庫所作的更新(事務執行的時候不容許別的事務併發執行,事務只能一個接着一個地執行,而不能併發執行)
Repeatable Read(可重複讀):一個事務在執行過程當中能夠看到其它事務已經提交的新插入的記錄,可是不能看到其它事務對已有記錄的更新
Read Commited(讀已提交數據):一個事務在執行過程當中能夠看到其它事務已經提交的新插入的記錄,並且能看到其它事務已經提交的對已有記錄的更新。
Read Uncommitted(讀未提交數據):一個事務在執行過程當中能夠看到其它事務沒有提交的新插入的記錄的更新,並且能看其它事務沒有提交到對已有記錄的更新
17.MYSQL存儲引擎(4種)
MyISAM它不支持事務,也不支持外鍵,尤爲是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT爲主的應用基本均可以使用這個引擎來建立表。
每一個MyISAM在磁盤上存儲成3個文件,其中文件名和表名都相同,可是擴展名分別爲:
.frm(存儲表定義)
MYD(MYData,存儲數據)
MYI(MYIndex,存儲索引)
InnoDB
InnoDB存儲引擎提供了具備提交、回滾和崩潰恢復能力的事務安全。可是對比MyISAM的存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。
1)自動增加列2)外鍵約束
MEMORY
memory使用存在內存中的內容來建立表。每一個MEMORY表實際對應一個磁盤文件,格式是.frm。MEMORY類型的表訪問很是快,由於它到數據是放在內存中的,而且默認使用HASH索引,可是一旦服務器關閉,表中的數據就會丟失,但表還會繼續存在。
MERGE
merge存儲引擎是一組MyISAM表的組合,這些MyISAM表結構必須徹底相同,MERGE表中並無數據,對MERGE類型的表能夠進行查詢、更新、刪除的操做,這些操做其實是對內部的MyISAM表進行操做。
18.事務傳播特性
1. PROPAGATION_REQUIRED: 若是存在一個事務,則支持當前事務。若是沒有事務則開啓
2. PROPAGATION_SUPPORTS: 若是存在一個事務,支持當前事務。若是沒有事務,則非事務的執行
3. PROPAGATION_MANDATORY: 若是已經存在一個事務,支持當前事務。若是沒有一個活動的事務,則拋出異常。
4. PROPAGATION_REQUIRES_NEW: 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的事務掛起。
5. PROPAGATION_NOT_SUPPORTED: 老是非事務地執行,並掛起任何存在的事務。
6. PROPAGATION_NEVER: 老是非事務地執行,若是存在一個活動事務,則拋出異常
7. PROPAGATION_NESTED:若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務,
19.簡述一下你瞭解的設計模式。
所謂設計模式,就是一套被反覆使用的代碼設計經驗的總結(情境中一個問題通過證明的一個解決方案)。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式令人們能夠更加簡單方便的複用成功的設計和體系結構。將已證明的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。
在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中給出了三類(建立型[對類的實例化過程的抽象化]、結構型[描述如何將類或對象結合在一塊兒造成更大的結構]、行爲型[對在不一樣的對象之間劃分責任和算法的抽象化])共23種設計模式,包括:Abstract Factory(抽象工廠模式),Builder(建造者模式),Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式);Facade(門面模式),Adapter(適配器模式),Bridge(橋樑模式),Composite(合成模式),Decorator(裝飾模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解釋器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(責任鏈模式)。
面試被問到關於設計模式的知識時,能夠揀最經常使用的做答,例如:
工廠模式:工廠類能夠根據條件生成不一樣的子類實例,這些子類有一個公共的抽象父類而且實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做(多態方法)。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。
代理模式:給一個對象提供一個代理對象,並由代理對象控制原對象的引用。實際開發中,按照使用目的的不一樣,代理能夠分爲:遠程代理、虛擬代理、保護代理、Cache代理、防火牆代理、同步化代理、智能引用代理。
適配器模式:把一個類的接口變換成客戶端所期待的另外一種接口,從而使本來因接口不匹配而沒法在一塊兒使用的類可以一塊兒工做。
模板方法模式:提供一個抽象類,將部分邏輯以具體方法或構造器的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法(多態實現),從而實現不一樣的業務邏輯。
除此以外,還能夠講講上面提到的門面模式、橋樑模式、單例模式、裝潢模式(Collections工具類和I/O系統中都使用裝潢模式)等,反正基本原則就是揀本身最熟悉的、用得最多的做答,以避免言多必失。
設計模式: