1.Java的HashMap是如何工作的?
HashMap是一個針對數據結構的鍵值,每個鍵都會有相應的值,關鍵是識別這樣的值。
HashMap 基於 hashing 原理,我們通過 put ()和 get ()方法儲存和獲取對象。當我們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓后找到 bucket 位置來儲存值對象。當獲取對象時,通過鍵對象的 equals ()方法找到正確的鍵值對,然后返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每個 LinkedList 節點中儲存鍵值對對象。
參考:
2.什么是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引發ConcurrentModifcationException在底層集合迭代過程中被修改。故障安全作為發生在實例中的一個副本迭代是不會拋出任何異常的。快速失敗的故障安全范例定義了當遭遇故障時系統是如何反應的。例如,用於失敗的快速迭代器ArrayList和用於故障安全的迭代器ConcurrentHashMap。
3.Java BlockingQueue是什么?
Java BlockingQueue是一個並發集合util包的一部分。BlockingQueue隊列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
4.什么時候使用ConcurrentHashMap?
在問題2中我們看到ConcurrentHashMap被作為故障安全迭代器的一個實例,它允許完整的並發檢索和更新。當有大量的並發更新時,ConcurrentHashMap此時可以被使用。這非常類似於Hashtable,但ConcurrentHashMap不鎖定整個表來提供並發,所以從這點上ConcurrentHashMap的性能似乎更好一些。所以當有大量更新時ConcurrentHashMap應該被使用。
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系統中都使用裝潢模式)等,反正基本原則就是揀自己最熟悉的、用得最多的作答,以免言多必失。
設計模式: