記錄一下最近面試遇到的問題稠通,持續(xù)更新ing
電話面試:
1 nio不是很熟
http://ifeve.com/java-nio-all/
2 kafka中間件的好處有什么? -> 可靠性 -> 它是如何保障它的可靠性
http://www.importnew.com/24973.html
3 redis集群用過嘛
4 hello world 做了什么?
編譯,即把我們寫好的java文件啊鸭,通過javac命令編譯成字節(jié)碼纲酗,也就是我們常說的.class文件窝趣。
運行,則是把編譯聲稱的.class文件交給Java虛擬機(JVM)執(zhí)行推正。
5 常用gc算法 ->
1)引用計數(shù)法 -> 存在循環(huán)引用的缺陷 -> 針對其缺陷 -> 根搜索算法、
2)標記清除算法 -> 效率低 空間碎片 -> 復制算法 -> 較多的復制效率很低 -> 標記整理算法
3)分代回收法 這種算法并沒有什么新的思路宝惰,只是根據(jù)對象的存活周期的不同植榕,將內(nèi)存劃分為幾塊。一般是把java堆分成新生代和老年代尼夺,這樣就可以根絕各個年代的特點采取最適當?shù)氖占惴ㄗ鸩小T谛律校看卫厥諘r都發(fā)現(xiàn)大批對象的死去淤堵,只有少量存活寝衫,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集拐邪。而老年代中因為對象存活率高慰毅,沒有額外空間對它進行分配擔保,就必須使用”標記-清理”或者“標記-整理”算法來進行回收扎阶。
6 一個請求中間都做了什么
7 SpringBoot用了哪些設計模式 xml和注解的bean統(tǒng)一管理是什么設計模式
8 你平時都用了哪些設計模式汹胃,為什么要用它
9 10億個數(shù)據(jù)的業(yè)務要如何處理
10 mysql的版本是什么?
11 常用的數(shù)據(jù)結構是什么东臀?-> ArrayList HashMap
-> hashMap底層是什么统台?
-> 數(shù)組鏈表紅黑樹
-> 為什么要用紅黑樹
-> 性能好相對于鏈表每個節(jié)點減少一半的可能
12 常用的orm模型框架是什么 -> mybatis -> 原理?
13 你平時用過哪些異步框架啡邑?
14 內(nèi)存溢出如何排查?
15 一個發(fā)生概率為1%的問題要如何調(diào)查井赌?
16 你平時如何做性能優(yōu)化的谤逼?
17 平時遇到過慢sql嘛? 如何優(yōu)化的仇穗?
18 用jdk幾流部? -> 8 -> 有哪些新特性?
19 redis為什么比數(shù)據(jù)庫快纹坐?
20 redis如何持久化枝冀?
21 一個增強for循環(huán)運行期間刪掉一個元素會怎樣?
22 threadLocal
當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,每個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本,是線程隔離的耘子。線程隔離的秘密在于ThreadLocalMap類(ThreadLocal的靜態(tài)內(nèi)部類)
線程局部變量是局限于線程內(nèi)部的變量果漾,屬于線程自身所有,不在多個線程間共享谷誓。Java 提供 ThreadLocal
類來支持線程局部變量绒障,是一種實現(xiàn)線程安全的方式。但是在管理環(huán)境下(如 web
服務器)使用線程局部變量的時候要特別小心捍歪,在這種情況下户辱,工作線程的生命周期比任何應用變量的生命周期都要長鸵钝。任何線程局部變量一旦在工作完成后沒有釋放,Java
應用就存在內(nèi)存泄露的風險庐镐。
ThreadLocal的方法:void set(T value)恩商、T get()以及T initialValue()。
ThreadLocal是如何為每個線程創(chuàng)建變量的副本的:
首先必逆,在每個線程Thread內(nèi)部有一個ThreadLocal.ThreadLocalMap類型的成員變量threadLocals怠堪,這個threadLocals就是用來存儲實際的變量副本的,鍵值為當前ThreadLocal變量末患,value為變量副本(即T類型的變量)研叫。初始時,在Thread里面璧针,threadLocals為空嚷炉,當通過ThreadLocal變量調(diào)用get()方法或者set()方法,就會對Thread類中的threadLocals進行初始化探橱,并且以當前ThreadLocal變量為鍵值申屹,以ThreadLocal要保存的副本變量為value,存到threadLocals隧膏。然后在當前線程里面哗讥,如果要使用副本變量,就可以通過get方法在threadLocals里面查找胞枕。
總結:
a杆煞、實際的通過ThreadLocal創(chuàng)建的副本是存儲在每個線程自己的threadLocals中的
b、為何threadLocals的類型ThreadLocalMap的鍵值為ThreadLocal對象腐泻,因為每個線程中可有多個threadLocal變量决乎,就像上面代碼中的longLocal和stringLocal;
c派桩、在進行get之前构诚,必須先set,否則會報空指針異常铆惑;如果想在get之前不需要調(diào)用set就能正常訪問的話范嘱,必須重寫initialValue()方法
23 線程池
24 給你四個線程 一個主線程 如果并行的處理任務
25 hashcode 方法 和 equals方法
26 問:對象的比較,怎么判斷兩個對象相等员魏?
答:equals方法
問:Integer里Integer a = new Integer(123), Integer b = 123, a==b?
答:不相等
問:Integer里Integer a = new Integer(123), Integer b = new Integer(123), a==b?
答:不相等
問:Integer里Integer a = new Integer(123), int b = 123, a==b?
答:相等
27 問:常用的List實現(xiàn)有哪些丑蛤?
答:ArrayList 和 LinkedList, CopyOnWriteArrayList
問:ArrayList 和 LinkedList的區(qū)別
答:ArrayList是array實現(xiàn)的,讀更快逆趋;LinkedList是鏈表實現(xiàn)的盏阶,寫更快
問:ArrayList怎么擴容的,擴容到多大闻书?
答:申請空間名斟,copy一份出去脑慧,1.5倍
問:ConcurrentHashMap原理
答:線程同步基于Segment加鎖,效率比對整個HashMap加鎖效率高
問:ConcurrentHashMap怎么實現(xiàn)線程安全
答:分段鎖
問:ConcurrentHashMap默認多少個分段鎖
答:2的n次方
問:與hashtable區(qū)別
答:HashTable用synchronized保證線程安全砰盐,競爭激烈情況下效率低下
問: ?ConcurrentHashMap是如何解決并發(fā)沖突的
答: 使用Segment在每個桶上加鎖
問:volatile的作用
答:可見性闷袒,防止CPU指令重排
問:原子類atomicinteger
答:cas
問:CAS原理
答:campare and swap 樂觀鎖
28 數(shù)據(jù)庫不同的存儲引擎?
https://www.cnblogs.com/shijiaqi1066/p/3857808.html
https://www.cnblogs.com/sunsky303/p/8274586.html
29 redis的數(shù)據(jù)結構 及存儲策略 -> String,Hash,Set,List,SortedSet,pub/sub,Transaction
->
30 設計一個線程池需要關心什么?
31 redis String是如何存儲的岩梳?如何擴容囊骤?
32 常見線程池
①newSingleThreadExecutor
單個線程的線程池,即線程池中每次只有一個線程工作冀值,單線程串行執(zhí)行任務
②newFixedThreadExecutor(n)
固定數(shù)量的線程池也物,沒提交一個任務就是一個線程,直到達到線程池的最大數(shù)量列疗,然后后面進入等待隊列直到前面的任務完成才繼續(xù)執(zhí)行
③newCacheThreadExecutor(推薦使用)
可緩存線程池滑蚯,當線程池大小超過了處理任務所需的線程,那么就會回收部分空閑(一般是60秒無執(zhí)行)的線程抵栈,當有任務來時告材,又智能的添加新線程來執(zhí)行。
④newScheduleThreadExecutor
大小無限制的線程池古劲,支持定時和周期性的執(zhí)行線程
33 你最得意的項目是什么斥赋?你在項目中擔當著什么樣的角色?
最得意的應該屬于繪制海報balabalabala ,現(xiàn)在在團隊應該屬于基層的中級開發(fā)人員
34 數(shù)據(jù)庫不同的存儲引擎
35 redis 支持的數(shù)據(jù)結構有哪些
redis 支持五種數(shù)據(jù)類型
string 字符串
hash 哈希
list 列表
set 集合
sorted set 有序集合
-> String是如何存儲的产艾?
https://www.cnblogs.com/idiotgroup/p/5450157.html
36 類加載的過程
類加載的過程主要分為三個部分:
加載
鏈接
初始化
而鏈接又可以細分為三個小部分:
驗證
準備
解析
https://blog.csdn.net/ln152315/article/details/79223441
37 數(shù)據(jù)庫事務隔離級別
https://blog.csdn.net/ln152315/article/details/79156655
38 線程池設計思路
https://www.cnblogs.com/chinaifae/p/10193774.html
代碼面試:
/** 評測題目 1
* 請用java實現(xiàn)以下shell腳本的功能
* cat /home/admin/logs/webx.log | grep "Login" | uniq -c | sort -nr | head -n 10
* 假設webx.log 內(nèi)容以下:
? ? ? Login2
? ? ? Login1
? ? ? Login1
? ? ? Login3
? ? ? uniq -c 的結果:
? ? ? 1 Login2
? ? ? 2 Login1
? ? ? 1 Login3
**/
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
? ? public static void main(String[] args) throws Exception {
? ? ? ? Optional.of("/home/admin/logs/webx.log")
? ? ? ? ? ? ? ? .map(Paths::get)
? ? ? ? ? ? ? ? .map(e -> {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? return Files.lines(e, Charset.defaultCharset())
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .filter(s -> s.contains("Login"))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
? ? ? ? ? ? ? ? ? ? } catch (Exception err) {
? ? ? ? ? ? ? ? ? ? ? ? return null;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .ifPresent(map -> map.keySet()
? ? ? ? ? ? ? ? ? ? ? ? .parallelStream()
? ? ? ? ? ? ? ? ? ? ? ? .sorted(Comparator.comparing(map::get).reversed())
? ? ? ? ? ? ? ? ? ? ? ? .limit(10)
? ? ? ? ? ? ? ? ? ? ? ? .forEach(e -> System.out.println(map.get(e) + " " + e)));
? ? }
}
/**
* 問1 如果內(nèi)存不足怎么辦疤剑?問2 如何提升它的性能?
*/
參照:https://www.cnblogs.com/goody9807/p/6425399.html