點擊上方“全球Java架構師集中營”,選擇“設爲星標”
技術文章第一時間送達!
包含的模塊:
本文分爲十九個模塊,分別是:Java 基礎、容器、多線程、反射、對象拷貝、Java Web 、異常、網絡、設計模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM
共包含 208 道面試題,本文的宗旨是爲讀者朋友們整理一份詳實而又權威的面試清單,下面一起進入主題吧。
一. Java 基礎模塊
1.JDK 和 JRE 有什麼區別?
JDK:Java Development Kit 的簡稱,Java 開發工具包,提供了 Java 的開發環境和運行環境。
2.== 和 equals 的區別是什麼?
== 解讀:
基本類型:比較的是值是否相同;
-
String x = "string";
-
String y = "string";
-
String z = new String("string");
-
System.out.println(x==y); // true
-
System.out.println(x==z); // false
-
System.out.println(x.equals(y)); // true
-
System.out.println(x.equals(z)); // true
代碼解讀:因爲 x 和 y 指向的是同一個引用,所以 == 也是 true,而 new String()方法則重寫開闢了內存空間,所以 == 結果爲 false,而 equals 比較的一直是值,所以結果都爲 true。
equals 解讀:
首先來看默認情況下 equals 比較一個有相同值的對象,代碼如下:
-
class Cat {
-
public Cat(String name) {
-
this.name = name;
-
}
-
private String name;
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
}
-
Cat c1 = new Cat("精彩猿筆記");
-
Cat c2 = new Cat("精彩猿筆記");
-
System.out.println(c1.equals(c2)); // false
輸出結果出乎我們的意料,竟然是 false?這是怎麼回事,看了 equals 源碼就知道了,源碼如下:
-
public boolean equals(Object obj) {
-
return (this == obj);
-
}
原來 equals 本質上就是 ==。
-
String s1 = new String("精彩猿筆記");
-
String s2 = new String("精彩猿筆記");
-
System.out.println(s1.equals(s2)); // true
同樣的,當我們進入 String 的 equals 方法,找到了答案,代碼如下:
-
public boolean equals(Object anObject) {
-
if (this == anObject) {
-
return true;
-
}
-
if (anObject instanceof String) {
-
String anotherString = (String)anObject;
-
int n = value.length;
-
if (n == anotherString.value.length) {
-
char v1[] = value;
-
char v2[] = anotherString.value;
-
int i = 0;
-
while (n-- != 0) {
-
if (v1[i] != v2[i])
-
return false;
-
i++;
-
}
-
return true;
-
}
-
}
-
return false;
-
}
3.兩個對象的 hashCode() 相同,則 equals() 也一定爲 true,對嗎?
-
String str1 = "精彩";
-
String str2 = "筆記";
-
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
-
System. out. println(str1. equals(str2));
執行的結果:
4.final 在 Java 中有什麼作用?
final 修飾的類叫最終類,該類不能被繼承。
5.Java 中的 Math. round(-1. 5) 等於多少?
6.String 屬於基礎的數據類型嗎?
7.Java 中操作字符串都有哪些類?它們之間有什麼區別?
StringBuffer和StringBuilder都繼承自抽象類AbstractStringBuilder。
8.String str="i"與 String str=new String(“i”)一樣嗎?
9.如何將字符串反轉?
-
// StringBuffer reverse
-
StringBuffer stringBuffer = new StringBuffer();
-
stringBuffer. append("abcdefg");
-
System. out. println(stringBuffer. reverse()); // gfedcba
-
// StringBuilder reverse
-
StringBuilder stringBuilder = new StringBuilder();
-
stringBuilder. append("abcdefg");
-
System. out. println(stringBuilder. reverse()); // gfedcba
10.String 類的常用方法都有那些?
indexOf():返回指定字符的索引。
11.抽象類必須要有抽象方法嗎?
-
abstract class Cat {
-
public static void sayHi() {
-
System. out. println("hi~");
-
}
-
}
上面代碼,抽象類並沒有抽象方法但完全可以正常運行。
12.普通類和抽象類有哪些區別?
普通類不能包含抽象方法,抽象類可以包含抽象方法。
13.抽象類能使用 final 修飾嗎?
14.接口和抽象類有什麼區別?
實現:抽象類的子類使用 extends 來繼承;接口必須使用 implements 來實現接口。
15.Java 中 IO 流分爲幾種?
按功能來分:輸入流(input)、輸出流(output)。16 位傳輸以字符爲單位輸入輸出數據。
16.BIO、NIO、AIO 有什麼區別?
BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,併發處理能力低。
17.Files的常用方法都有哪些?
Files. exists():檢測文件路徑是否存在。
二. Java 容器模塊
18.Java 容器都有哪些?
Java 容器分爲 Collection 和 Map 兩大類,其下又有很多子類,如下所示:
Collection
ArrayList
Set
19.Collection 和 Collections 有什麼區別?
Collection 是一個集合接口,它提供了對集合對象進行基本操作的通用接口方法,所有集合都是它的子類,比如 List、Set 等。
20.List、Set、Map 之間的區別是什麼?
21. HashMap 和 Hashtable 有什麼區別?
HashMap是繼承自AbstractMap類,而HashTable是繼承自Dictionary類。不過它們都實現了同時實現了map、Cloneable(可複製)、Serializable(可序列化)這三個接口。
22.如何決定使用 HashMap 還是 TreeMap?
23.說一下 HashMap 的實現原理?
24.說一下 HashSet 的實現原理?
25.ArrayList 和 LinkedList 的區別是什麼?
數據結構實現:ArrayList 是動態數組的數據結構實現,而 LinkedList 是雙向鏈表的數據結構實現。
26.如何實現數組和 List 之間的轉換?
數組轉 List:使用 Arrays. asList(array) 進行轉換。
-
// list to array
-
List<String> list = new ArrayList<String>();
-
list. add("☞精◈彩◈猿◈筆◈記☜");
-
list. add("的博客");
-
list. toArray();
-
// array to list
-
String[] array = new String[]{"☞精◈彩◈猿◈筆◈記☜","的博客"};
-
Arrays. asList(array);
27.ArrayList 和 Vector 的區別是什麼?
線程安全:Vector 使用了 Synchronized 來實現線程同步,是線程安全的,而 ArrayList 是非線程安全的。
Array 可以存儲基本數據類型和對象,ArrayList 只能存儲對象。
29.在 Queue 中 poll()和 remove()有什麼區別?
相同點:都是返回第一個元素,並在隊列中刪除返回的對象。
-
Queue<String> queue = new LinkedList<String>();
-
queue. offer("string"); // add
-
System. out. println(queue. poll());
-
System. out. println(queue. remove());
-
System. out. println(queue. size());
30.哪些集合類是線程安全的?
31.迭代器 Iterator 是什麼?
32.Iterator 怎麼使用?有什麼特點?
-
List<String> list = new ArrayList<>();
-
Iterator<String> it = list. iterator();
-
while(it. hasNext()){
-
String obj = it. next();
-
System. out. println(obj);
-
}
Iterator 的特點是更加安全,因爲它可以確保,在當前遍歷的集合元素被更改的時候,就會拋出 ConcurrentModificationException 異常。
33.Iterator 和 ListIterator 有什麼區別?
Iterator 可以遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List。
34.怎麼確保一個集合不能被修改?
-
List<String> list = new ArrayList<>();
-
list. add("x");
-
Collection<String> clist = Collections. unmodifiableCollection(list);
-
clist. add("y"); // 運行時此行報錯
-
System. out. println(list. size());
三. Java 多線程模塊
35.並行和併發有什麼區別?
並行:多個處理器或多核處理器同時處理多個任務。
36.線程和進程的區別?
37.守護線程是什麼?
38.多線程有幾種實現方式?
-
繼承Thread類
-
實現Runnable接口
-
實現Callable接口通過FutureTask包裝器來創建Thread線程
-
通過線程池創建線程,使用線程池接口ExecutorService結合Callable、Future實現有返回結果的多線程。
39.說一下 Runnable和 Callable有什麼區別?
40.線程有哪些狀態?
初始(NEW):新創建了一個線程對象,但還沒有調用start()方法。
41.sleep() 和 wait() 有什麼區別?
類的不同:sleep() 來自 Thread,wait() 來自 Object。
42.notify()和 notifyAll()有什麼區別?
43.線程的 run() 和 start() 有什麼區別?
44.創建線程池有哪幾種方式?
newSingleThreadExecutor():它的特點在於工作線程數目被限制爲 1,操作一個無界的工作隊列,所以它保證了所有任務的都是被順序執行,最多會有一個任務處於活動狀態,並且不允許使用者改動線程池實例,因此可以避免其改變線程數目;
45.線程池都有哪些狀態?
RUNNING:這是最正常的狀態,接受新的任務,處理等待隊列中的任務。
46.線程池中 submit() 和 execute() 方法有什麼區別?
execute():只能執行 Runnable 類型的任務。
47.在 Java 程序中怎麼保證多線程的運行安全?
方法一:使用安全類,比如 Java. util. concurrent 下的類。
-
Lock lock = new ReentrantLock();
-
lock. lock();
-
try {
-
System. out. println("獲得鎖");
-
} catch (Exception e) {
-
// TODO: handle exception
-
} finally {
-
System. out. println("釋放鎖");
-
lock. unlock();
-
}
48.多線程中 synchronized 鎖升級的原理是什麼?
49.什麼是死鎖?
50.怎麼防止死鎖?
儘量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設置超時時間,超時可以退出防止死鎖。
51.ThreadLocal 是什麼?有哪些使用場景?
52.說一下 synchronized 底層實現原理?
53.synchronized 和 volatile 的區別是什麼?
volatile 是變量修飾符;synchronized 是修飾類、方法、代碼段。
54.synchronized 和 Lock 有什麼區別?
synchronized 可以給類、方法、代碼塊加鎖;而 lock 只能給代碼塊加鎖。
55.synchronized 和 ReentrantLock 區別是什麼?
ReentrantLock 使用起來比較靈活,但是必須有釋放鎖的配合動作;
56.說一下 atomic 的原理?
···
四. Java 反射模塊
57.什麼是反射?
反射是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲 Java 語言的反射機制。
58.什麼是 Java 序列化?什麼情況下需要序列化?
想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
59.動態代理是什麼?有哪些應用?
60.怎麼實現動態代理?
···
五. Java 對象拷貝模塊
61.爲什麼要使用克隆?
克隆的對象可能包含一些已經修改過的屬性,而 new 出來的對象的屬性都還是初始化時候的值,所以當需要一個新的對象來保存當前對象的“狀態”就靠克隆方法了。
62.如何實現對象克隆?
實現 Cloneable 接口並重寫 Object 類中的 clone() 方法。
63.深拷貝和淺拷貝區別是什麼?
淺拷貝:當對象被複制時只複製它本身和其中包含的值類型的成員變量,而引用類型的成員對象並沒有複製。
六. Java Web模塊
64.JSP 和 servlet 有什麼區別?
JSP 是 servlet 技術的擴展,本質上就是 servlet 的簡易方式。servlet 和 JSP 最主要的不同點在於,servlet 的應用邏輯是在 Java 文件中,並且完全從表示層中的 html 裏分離開來,而 JSP 的情況是 Java 和 html 可以組合成一個擴展名爲 JSP 的文件。JSP 側重於視圖,servlet 主要用於控制邏輯。
65.JSP 有哪些內置對象?作用分別是什麼?
request:封裝客戶端的請求,其中包含來自 get 或 post 請求的參數;
66.說一下 JSP 的 4 種作用域?
page:代表與一個頁面相關的對象和屬性。
67.session 和 cookie 有什麼區別?
存儲位置不同:session 存儲在服務器端;cookie 存儲在瀏覽器端。
68.說一下 session 的工作原理?
69.如果客戶端禁止 cookie 能實現 session 還能用嗎?
70.spring mvc 和 struts 的區別是什麼?
攔截級別:struts2 是類級別的攔截;spring mvc 是方法級別的攔截。
71.如何避免 SQL 注入?
72.什麼是 XSS 攻擊,如何避免?
73.什麼是 CSRF 攻擊,如何避免?
驗證請求來源地址;
七. Java 異常模塊
74.throw 和 throws 的區別?
throw:是真實拋出一個異常。
75.final、finally、finalize 有什麼區別?
final:是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和變量,則表示此方法和此變量不能在被改變,只能使用。
76.try-catch-finally 中哪個部分可以省略?
77.try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?
78.常見的異常類有哪些?
NullPointerException 空指針異常
八. 網絡模塊
79.http 響應碼 301 和 302 代表的是什麼?有什麼區別?
301:永久重定向;302:暫時重定向。
80.forward 和 redirect 的區別?
forward 是轉發 和 redirect 是重定向:
81.簡述 tcp 和 udp的區別?
tcp 面向連接,udp 面向非連接即發送數據前不需要建立鏈接;
82.tcp 爲什麼要三次握手,兩次不行嗎?爲什麼?
第一次握手:A給B打電話說,你可以聽到我說話嗎?
如果採用兩次握手,那麼只要服務器發出確認數據包就會建立連接,但由於客戶端此時並未響應服務器端的請求,那此時服務器端就會一直在等待客戶端,這樣服務器端就白白浪費了一定的資源。若採用三次握手,服務器端沒有收到來自客戶端的再此確認,則就會知道客戶端並沒有要求建立請求,就不會浪費服務器的資源。
83.說一下 tcp 粘包是怎麼產生的?
發送端粘包:發送端需要等緩衝區滿才發送出去,造成粘包;
物理層:利用傳輸介質爲數據鏈路層提供物理連接,實現比特流的透明傳輸。
85.get 和 post 請求有哪些區別?
get 請求會被瀏覽器主動緩存,而 post 不會。
86.如何實現跨域?
服務器端運行跨域 設置 CORS 等於 *;
87.說一下 JSONP 實現原理?
···
九. 設計模式模塊
88.說一下你熟悉的設計模式?
單例模式:保證被創建一次,節省系統開銷。
89.簡單工廠和抽象工廠有什麼區別?
簡單工廠:用來生產同一等級結構中的任意產品,對於增加新的產品,無能爲力。
十. Spring/Spring MVC模塊
90.爲什麼要使用 spring?
spring 提供 ioc 技術,容器會幫你管理依賴的對象,從而不需要自己創建和管理依賴對象了,更輕鬆的實現了程序的解耦。
91.解釋一下什麼是 aop?
92.解釋一下什麼是 ioc?
93.spring 有哪些主要模塊?
spring core:框架的最基礎部分,提供 ioc 和依賴注入特性。
94.spring 常用的注入方式有哪些?
setter 屬性注入
95.spring 中的 bean 是線程安全的嗎?
有狀態就是有數據存儲功能。
96.spring 支持幾種 bean 的作用域?
singleton:spring ioc 容器中只存在一個 bean 實例,bean 以單例模式存在,是系統默認值;
97.spring 自動裝配 bean 有哪些方式?
no:默認值,表示沒有自動裝配,應使用顯式 bean 引用進行裝配。
98.spring 事務實現方式有哪些?
聲明式事務:聲明式事務也有兩種實現方式,基於 xml 配置文件的方式和註解方式(在類上添加 @Transaction 註解)。
99.說一下 spring 的事務隔離?
ISOLATION_DEFAULT:用底層數據庫的設置隔離級別,數據庫設置的是什麼我就用什麼;
100.說一下 spring mvc 運行流程?
spring mvc 先將請求發送給 DispatcherServlet。
101.spring mvc 有哪些組件?
前置控制器 DispatcherServlet。
102.@RequestMapping 的作用是什麼?
103.@Autowired 的作用是什麼?
···
十一. Spring Boot/Spring Cloud模塊
104.什麼是 spring boot?
spring boot 是爲 spring 服務的,是用來簡化新 spring 應用的初始搭建以及開發過程的。
105.爲什麼要用 spring boot?
配置簡單
106.spring boot 核心配置文件是什麼?
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優先加載,且 boostrap 裏面的屬性不能被覆蓋;
107.spring boot 配置文件有哪幾種類型?它們有什麼區別?
spring. RabbitMQ. port=5672
yml 配置如下:
-
spring:
-
RabbitMQ:
-
port: 5672
108.spring boot 有哪些方式可以實現熱部署?
使用 devtools 啓動熱部署,添加 devtools 庫,在配置文件中把 spring. devtools. restart. enabled 設置爲 true;
109.jpa 和 hibernate 有什麼區別?
110.什麼是 spring cloud?
111.spring cloud 斷路器的作用是什麼?
112.spring cloud 的核心組件有哪些?
Eureka:服務註冊於發現。
十二. Hibernate模塊
113.爲什麼要使用 hibernate?
hibernate 是對 jdbc 的封裝,大大簡化了數據訪問層的繁瑣的重複性代碼。
114.什麼是 ORM 框架?
115.hibernate 中如何在控制檯查看打印的 SQL 語句?
116.hibernate 有幾種查詢方式?
117.hibernate 實體類可以被定義爲 final 嗎?
118.在 hibernate 中使用 Integer 和 int 做映射有什麼區別?
119.hibernate 是如何工作的?
讀取並解析配置文件。
120.get()和 load()的區別?
121.說一下 hibernate 的緩存機制?
122.hibernate 對象有哪些狀態?
臨時/瞬時狀態:直接 new 出來的對象,該對象還沒被持久化(沒保存在數據庫中),不受 Session 管理。
123.在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?
getCurrentSession 會綁定當前線程,而 openSession 則不會。
124.hibernate 實體類必須要有無參構造函數嗎?爲什麼?
···
十三. MyBatis模塊
125.MyBatis 中 #{}和 ${}的區別是什麼?
#{}是預編譯處理,${}是字符替換。在使用 #{}時,MyBatis 會將 SQL 中的 #{}替換成“?”,配合 PreparedStatement 的 set 方法賦值,這樣可以有效的防止 SQL 注入,保證程序的運行安全。
126.MyBatis 有幾種分頁方式?
分頁方式:邏輯分頁和物理分頁。
127.RowBounds 是一次性查詢全部結果嗎?爲什麼?
128.MyBatis 邏輯分頁和物理分頁的區別是什麼?
邏輯分頁是一次性查詢很多數據,然後再在結果中檢索分頁的數據。這樣做弊端是需要消耗大量的內存、有內存溢出的風險、對數據庫壓力較大。
129.MyBatis 是否支持延遲加載?延遲加載的原理是什麼?
130.說一下 MyBatis 的一級緩存和二級緩存?
一級緩存:基於 PerpetualCache 的 HashMap 本地緩存,它的聲明週期是和 SQLSession 一致的,有多個 SQLSession 或者分佈式的環境中數據庫操作,可能會出現髒數據。當 Session flush 或 close 之後,該 Session 中的所有 Cache 就將清空,默認一級緩存是開啓的。
131.MyBatis 和 hibernate 的區別有哪些?
靈活性:MyBatis 更加靈活,自己可以寫 SQL 語句,使用起來比較方便。
132.MyBatis 有哪些執行器(Executor)?
SimpleExecutor:每執行一次 update 或 select 就開啓一個 Statement 對象,用完立刻關閉 Statement 對象;
133.MyBatis 分頁插件的實現原理是什麼?
134.MyBatis 如何編寫一個自定義插件?
自定義插件實現原理:
MyBatis 自定義插件針對 MyBatis 四大對象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)進行攔截:
-
public interface Interceptor {
-
Object intercept(Invocation invocation) throws Throwable;
-
Object plugin(Object target);
-
void setProperties(Properties properties);
-
}
setProperties 方法是在 MyBatis 進行配置插件的時候可以配置自定義相關屬性,即:接口實現對象的參數配置;
-
@Intercepts({@Signature(type = Executor. class, method = "query",
-
args = {MappedStatement. class, Object. class, RowBounds. class, ResultHandler. class})})
-
public class TestInterceptor implements Interceptor {
-
public Object intercept(Invocation invocation) throws Throwable {
-
Object target = invocation. getTarget(); //被代理對象
-
Method method = invocation. getMethod(); //代理方法
-
Object[] args = invocation. getArgs(); //方法參數
-
// do something . . . . . . 方法攔截前執行代碼塊
-
Object result = invocation. proceed();
-
// do something . . . . . . . 方法攔截後執行代碼塊
-
return result;
-
}
-
public Object plugin(Object target) {
-
return Plugin. wrap(target, this);
-
}
-
}
十四. RabbitMQ模塊
135.RabbitMQ 的使用場景有哪些?
搶購活動,削峯填谷,防止系統崩塌。
136.RabbitMQ 有哪些重要的角色?
生產者:消息的創建者,負責創建和推送數據到消息服務器;
137.RabbitMQ 有哪些重要的組件?
Channel(信道):消息推送使用的通道。
138.RabbitMQ 中 vhost 的作用是什麼?
139.RabbitMQ 的消息是怎麼發送的?
140.RabbitMQ 怎麼保證消息的穩定性?
提供了事務的功能。
141.RabbitMQ 怎麼避免消息丟失?
把消息持久化磁盤,保證服務器重啓消息不丟失。
142.要保證消息持久化成功的條件有哪些?
聲明隊列必須設置持久化 durable 設置爲 true.
143.RabbitMQ 持久化有什麼缺點?
144.RabbitMQ 有幾種廣播類型?
direct(默認方式):最基礎最簡單的模式,發送方把消息發送給訂閱方,如果有多個訂閱者,默認採取輪詢的方式進行消息發送。
145.RabbitMQ 怎麼實現延遲消息隊列?
通過消息過期後進入死信交換器,再由交換器轉發到延遲消費隊列,實現延遲功能;
146.RabbitMQ 集羣有什麼用?
高可用:某個服務器出現問題,整個 RabbitMQ 還可以繼續使用;
147.RabbitMQ 節點的類型有哪些?
磁盤節點:消息會存儲到磁盤。
148.RabbitMQ 集羣搭建需要注意哪些問題?
各節點之間使用“–link”連接,此屬性不能忽略。
149.RabbitMQ 每個節點是其他節點的完整拷貝嗎?爲什麼?
存儲空間的考慮:如果每個節點都擁有所有隊列的完全拷貝,這樣新增節點不但沒有新增存儲空間,反而增加了更多的冗餘數據;
150.RabbitMQ 集羣中唯一一個磁盤節點崩潰了會發生什麼情況?
不能創建隊列
151.RabbitMQ 對集羣節點停止順序有要求嗎?
···
十五. Kafka
152.kafka 可以脫離 zookeeper 單獨使用嗎?爲什麼?
kafka 不能脫離 zookeeper 單獨使用,因爲 kafka 使用 zookeeper 管理和協調 kafka 的節點服務器。
153.kafka 有幾種數據保留的策略?
154.kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?
155.什麼情況會導致 kafka 運行變慢?
cpu 性能瓶頸
156.使用 kafka 集羣需要注意什麼?
···
十六. Zookeeper模塊
157.zookeeper 是什麼?
zookeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務,是 google chubby 的開源實現,是 hadoop 和 hbase 的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
158.zookeeper 都有哪些功能?
集羣管理:監控節點存活狀態、運行請求等。
159.zookeeper 有幾種部署模式?
單機部署:一臺集羣上運行;
160.zookeeper 怎麼保證主從節點的狀態同步?
161.集羣中爲什麼要有主節點?
162.集羣中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還可以使用嗎?
163.說一下 zookeeper 的通知機制?
···
十七. MySQL模塊
164.數據庫的三範式是什麼?
第一範式(1NF):強調的是列的原子性,即數據庫表的每一列都是不可分割的原子數據項。
165.一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 MySQL 數據庫,又插入了一條數據,此時 id 是幾?
表類型如果是 MyISAM ,那 id 就是 8。
166.如何獲取當前數據庫版本?
167.說一下 ACID 是什麼?
Atomicity(原子性):一個事務(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被恢復(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。即,事務不可分割、不可約簡。
168.char 和 varchar 的區別是什麼?
char(n) :固定長度類型,比如訂閱 char(10),當你輸入"abc"三個字符的時候,它們佔的空間還是 10 個字節,其他 7 個是空字節。
varchar(n) :可變長度,存儲的值是每個值佔用的字節再加上一個用來記錄其長度的字節的長度。
169.float 和 double 的區別是什麼?
float 最多可以存儲 8 位的十進制數,並在內存中佔 4 字節。
170.MySQL 的內連接、左連接、右連接有什麼區別?
171.MySQL 索引是怎麼實現的?
172.怎麼驗證 MySQL 的索引是否滿足需求?
173.說一下數據庫的事務隔離?
transaction-isolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
READ-UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、髒讀、不可重複讀)。
174.說一下 MySQL 常用的引擎?
InnoDB 引擎:InnoDB 引擎提供了對數據庫 acid 事務的支持,並且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據容量的數據庫系統。MySQL 運行的時候,InnoDB 會在內存中建立緩衝池,用於緩衝數據和索引。但是該引擎是不支持全文搜索,同時啓動也比較的慢,它是不會保存表的行數的,所以當進行 select count(*) from table 指令的時候,需要進行掃描全表。由於鎖的粒度小,寫操作是不會鎖定全表的,所以在併發度較高的場景下使用會提升效率的。
175.說一下 MySQL 的行鎖和表鎖?
表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖衝突的概率最高,併發量最低。
176.說一下樂觀鎖和悲觀鎖?
樂觀鎖:每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數據。
177.MySQL 問題排查都有哪些手段?
使用 show processlist 命令查看當前所有連接信息。
178.如何做 MySQL 的性能優化?
爲搜索字段創建索引。
十八. Redis模塊
179.Redis 是什麼?都有哪些使用場景?
Redis 是一個使用 C 語言開發的高速緩存數據庫。
記錄帖子點贊數、點擊數、評論數;
180.Redis 有哪些功能?
數據緩存功能
181.Redis 和 memcache 有什麼區別?
存儲方式不同:memcache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小;Redis 有部份存在硬盤上,這樣能保證數據的持久性。
182.Redis 爲什麼是單線程的?
183.什麼是緩存穿透?怎麼解決?
緩存穿透:指查詢一個一定不存在的數據,由於緩存是不命中時需要從數據庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,造成緩存穿透。
184.Redis 支持的數據類型有哪些?
185.Redis 支持的 Java 客戶端都有哪些?
186.jedis 和 Redisson 有哪些區別?
jedis:提供了比較全面的 Redis 命令的支持。
187.怎麼保證緩存和數據庫數據的一致性?
合理設置緩存的過期時間。
188.Redis 持久化有幾種方式?
RDB(Redis Database):指定的時間間隔能對你的數據進行快照存儲。
189.Redis 怎麼實現分佈式鎖?
190.Redis 分佈式鎖有什麼缺陷?
191.Redis 如何做內存優化?
192.Redis 淘汰策略有哪些?
volatile-lru:從已設置過期時間的數據集(server. db[i]. expires)中挑選最近最少使用的數據淘汰。
193.Redis 常見的性能問題有哪些?該如何解決?
···
十九. JVM模塊
194.說一下 JVM 的主要組成部分?及其作用?
類加載器(ClassLoader)
195.說一下 JVM 運行時數據區?
程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器,字節碼解析器的工作是通過改變這個計數器的值,來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能,都需要依賴這個計數器來完成;
196.說一下堆棧的區別?
功能方面:堆是用來存放對象的,棧是用來執行程序的。
197.隊列和棧是什麼?有什麼區別?
隊列和棧都是被用來預存儲數據的。
198.什麼是雙親委派模型?
啓動類加載器(Bootstrap ClassLoader),是虛擬機自身的一部分,用來加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數所指定的路徑中並且被虛擬機識別的類庫;
199.說一下類裝載的執行過程?
加載:根據查找路徑找到相應的 class 文件然後導入;
200.怎麼判斷對象是否可以被回收?
引用計數器:爲每個對象創建一個引用計數,有對象引用時計數器 +1,引用被釋放時計數 -1,當計數器爲 0 時就可以被回收。它有一個缺點不能解決循環引用的問題;
201.Java 中都有哪些引用類型?
強引用:發生 gc 的時候不會被回收。
202.說一下 JVM 有哪些垃圾回收算法?
標記-清除算法:標記無用對象,然後進行清除回收。缺點:效率不高,無法清除垃圾碎片。
203.說一下 JVM 有哪些垃圾回收器?
Serial:最早的單線程串行垃圾回收器。
204.詳細介紹一下 CMS 垃圾回收器?
205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什麼區別?
新生代回收器:Serial、ParNew、Parallel Scavenge
206.簡述分代垃圾回收器是怎麼工作的?
把 Eden + From Survivor 存活的對象放入 To Survivor 區;
207.說一下 JVM 調優的工具?
jconsole:用於對 JVM 中的內存、線程和類等進行監控;
208.常用的 JVM 調優的參數都有哪些?
-Xms2g:初始化推大小爲 2g;