Java後臺研發面試題彙總
2019 年校招馬上開始,開始著手準備面試。
只寫自己想到的可以回答的點,不作深入分析,理解出錯的地方還請指正。
需要研讀的幾本書:
- java程式設計思想
- 大型網站技術架構:核心原理與案例分析
- java併發程式設計的藝術(應對校招足以,java併發程式設計實戰還是等工作積累了一些經驗再研讀)
- 深入理解jvm虛擬機器(針對JDK1.7,版本略老,帶著批判的眼光看吧)
- 深入分析JavaWeb技術內幕
- Redis實戰 和 Redis設計與實現
Java 相關
多型
面向物件的三大基本特徵:封裝、繼承、多型。
依賴關係:繼承依賴封裝,多型依賴繼承。
為了實現多型需要有封裝和繼承。多型的最終目的在我看來就是為了解耦。
多型的三個必要條件:
- 要有繼承
- 要有方法的重寫
- 父類引用指向子類物件
class Animal {
public void name() {
System.out.println("Animal");
}
}
class Cat extends Animal{
@Override
public void name() {
System.out.println("Cat");
}
}
class Dog extends Animal{
@Override
public void name() {
System.out.println("Dog" );
}
}
public class Test {
public static void fun(Animal animal) {
animal.name();
}
public static void main(String[] args) {
fun(new Dog());
fun(new Cat());
}
}
但是即便是出現了多型,也未曾完全消除耦合。
你看,Animal 的實現類還是被耦合在了程式碼裡。
曾經在學 JDBC 時遇到一個問題:如此優雅的操作資料庫的程式碼為何出現了一個不合時宜的
Class.forName("com.mysql.jdbc.Driver");
SPI 與 IOC 應運而出。沒錯它們的出現也還是為了解耦(實現類不再耦合在業務邏輯裡了)。
HashMap和Hashtable的區別
HashMap和Hashtable都實現了Map介面,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:執行緒安全性,同步(synchronization),以及速度。
HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是執行緒安全的,多個執行緒可以共享一個Hashtable;而如果沒有正確的同步的話,多個執行緒是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴充套件性更好。
另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它執行緒改變了HashMap的結構(增加或者移除元素),將會丟擲ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會丟擲ConcurrentModificationException異常。但這並不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。
由於Hashtable是執行緒安全的也是synchronized,所以在單執行緒環境下它比HashMap要慢。如果你不需要同步,只需要單一執行緒,那麼使用HashMap效能要好過Hashtable。
HashMap不能保證隨著時間的推移Map中的元素次序是不變的。
ConcurrentHashMap和Hashtable的區別
Hashtable和ConcurrentHashMap有什麼分別呢?它們都可以用於多執行緒的環境,但是當Hashtable的大小增加到一定的時候,效能會急劇下降,因為迭代時需要被鎖定很長的時間。因為ConcurrentHashMap引入了分割(segmentation),不論它變得多麼大,僅僅需要鎖定map的某個部分,而其它的執行緒不需要等到迭代完成才能訪問map。簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。
http://www.importnew.com/7166.html
併發相關
volatile
只能保證可見性,區域性有序性,不能保證原子性。
可見性:一個執行緒修改了共享變數的值,其他執行緒能夠立刻得知這個修改。
共享變數為在堆中的變數(JDK7以後Class變數也是在堆中分配記憶體了),對於在區域性變量表(JVM虛擬機器棧-棧幀)的變數,一般都是分配線上程獨享的 TLAB (Thread Local Allocation Buffer)中。每個方法(不包含 native 方法)執行的同時都會建立一個棧幀結構,方法執行過程,對應著虛擬機器棧幀的入棧到出棧的過程。
volatile的記憶體語義:
- 當寫一個 volatile 變數時,JMM 會把該執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體。
- 當讀一個 volatile 變數時,JMM 會把該執行緒對應的本地記憶體置為無效。執行緒接下來將從主記憶體中讀取共享變數。
synchronized
作業系統相關
網路相關
OSI 與 TCP/IP 參考模型
劃分原則是:
(1)網路中各結點都有相同的層次;
(2)不同結點的同等層具有相同的功能;
(3)同一結點內相鄰層之間通過介面通訊;
(4)每一層使用下層提供的服務,並向其上層提供服務;
(5)不同結點的同等層按照協議實現對等層之間的通訊。
各層的作用:
- 物理層:在物理媒體上傳輸原始的資料位元流。
- 資料鏈路層:將資料分成一個個資料幀,以資料幀為單位傳輸。有應有答, 遇錯重發。
- 網路層:將資料分成一定長度的分組,將分組穿過通訊子網,從信源選擇路- 徑後傳到信宿。
- 傳輸層:提供不具體網路的高效、經濟、透明的端到端資料傳輸服務。
- 會話層:程序間的對話也稱為會話,會話層管理不同主機上各程序間的對話。
- 應用層:提供應用程式訪問OSI環境的手段。
TCP/IP三次握手四次揮手
HTTP
Http 與 Https 的區別
HTTP 的URL 以http:// 開頭,而HTTPS 的URL 以https:// 開頭
HTTP 是不安全的,而 HTTPS 是安全的
HTTP 標準埠是80 ,而 HTTPS 的標準埠是443
在OSI 網路模型中,HTTP工作於應用層,而HTTPS 的安全傳輸機制工作在傳輸層
HTTP 無法加密,而HTTPS 對傳輸的資料進行加密
HTTP無需證書,而HTTPS 需要CA機構頒發的SSL證書
設計模式
單例模式
屬於建立型模式。
策略模式
屬於行為型模式。
在策略模式(Strategy Pattern)中,一個類的行為或其演算法可以在執行時更改。
該模式完美的說明了介面或者說多型的好處:解耦。
介面更多描述的是行為。
工廠模式
資料庫
Mysql 中 MyISAM 和 InnoDB 的區別有哪些?
InnoDB支援事務,MyISAM不支援,對於InnoDB每一條SQL語言都預設封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務;
InnoDB支援外來鍵,而MyISAM不支援。對一個包含外來鍵的InnoDB錶轉為MYISAM會失敗;
InnoDB是聚集索引,資料檔案是和索引綁在一起的,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而MyISAM是非聚集索引,資料檔案是分離的,索引儲存的是資料檔案的指標。主鍵索引和輔助索引是獨立的。
InnoDB不儲存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變數儲存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快;
Innodb不支援全文索引,而MyISAM支援全文索引,查詢效率上MyISAM要高;
如何選擇:
1. 是否要支援事務,如果要請選擇innodb,如果不需要可以考慮MyISAM;2. 如果表中絕大多數都只是讀查詢,可以考慮MyISAM,如果既有讀寫也挺頻繁,請使用InnoDB。
3. 系統奔潰後,MyISAM恢復起來更困難,能否接受;
4. MySQL5.5版本開始Innodb已經成為Mysql的預設引擎(之前是MyISAM),說明其優勢是有目共睹的,如果你不知道用什麼,那就用InnoDB,至少不會差。
事務的 ACID 屬性
1. 原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
2. 一致性(Consistency)
事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。
3. 隔離性(Isolation)
事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
4. 永續性(Durability)
永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來的其他操作和資料庫故障不應該對其有任何影響。
資料庫提供的 4 種事務隔離級別: