高級(jí)java開發(fā)的面試題總結(jié)
1、 static關(guān)鍵字的作用,,平時(shí)開發(fā)用在什么地方,?
答:主要有三種用法。
①修飾成員變量,,用static修飾的成員變量就成為靜態(tài)變量,,靜態(tài)變量只會(huì)存在一份,在類被加載時(shí)會(huì)初始化,,且只會(huì)加載一次,,通過類名訪問。一般可以用static和final定義一些String類型,,boolean類型,int類型的變量作為常量,,可以減少資源的消耗,。
②static修飾方法,,該方法就被定義為靜態(tài)方法,靜態(tài)方法是不能被方法重寫的,,通過類名調(diào)用,。一般用static定義一些工具類的方法。
③用static修飾代碼塊,,該代碼塊就被定義為靜態(tài)代碼塊,,靜態(tài)代碼塊在類初始化時(shí)被執(zhí)行,且執(zhí)行一次,。一般用于初始化一些靜態(tài)的成員變量的值,。
2、static修飾的成員變量和非static修飾的成員變量有什么區(qū)別,?分別存在什么區(qū)域,?
答:靜態(tài)成員變量在內(nèi)存中只會(huì)存在一份,是通過類名訪問,,存在于靜態(tài)區(qū)中,。非靜態(tài)成員變量是隨著對(duì)象的創(chuàng)建而存在的,可以有多份,,通過創(chuàng)建的對(duì)象訪問,,存在于堆內(nèi)存中。
3,、說(shuō)一下類初始化的順序,。
答:靜態(tài)成員變量、靜態(tài)代碼塊,、實(shí)例成員變量,,實(shí)例代碼塊,構(gòu)造器,,實(shí)例方法,。
4、常用的集合類型有哪些,?
答:有Map,、Set、List是比較常用的,。
5,、List常用的實(shí)現(xiàn)類有哪些?ArrayList和LinkedList底層實(shí)現(xiàn)原理是什么,?
答:List常用的實(shí)現(xiàn)類有ArrayList和LinkedList,。ArrayList底層原理是數(shù)組+動(dòng)態(tài)擴(kuò)容機(jī)制實(shí)現(xiàn)的,LinkedList底層原理是用Node結(jié)點(diǎn)形成的鏈表實(shí)現(xiàn)的。
6,、在開發(fā)中如何選擇使用ArrayList和LinkedList,?
答:ArrayList是數(shù)組實(shí)現(xiàn),所以通過下標(biāo)訪問效率最快,,但是缺點(diǎn)是如果增刪比較頻繁的情況下,,需要經(jīng)常擴(kuò)容,性能不是很好,。LinkedList在增刪的情況下,,效率較高,但是訪問集合中的元素時(shí)都需要從第一個(gè)元素開始遍歷,,效率較低,。所以如果增刪的情況較多的時(shí)候,可以使用LinkedList,。查詢較多時(shí)使用ArrayList,。
7、List集合如果要排序有哪些實(shí)現(xiàn)方式,?
①使用List接口定義的sort()方法,。
list.sort(Comparator.comparingInt(User::getAge));
②使用Collections的sort()方法,排序的對(duì)象需要實(shí)現(xiàn)Comparable接口,,重寫compareTo()方法,。
//實(shí)現(xiàn)Comparable接口
public class User implements Comparable<User> {
//重寫compareTo方法
@Override
public int compareTo(User user) {
return Integer.compare(this.getAge(), user.getAge());
}
}
使用Collections的sort()方法
Collections.sort(list);
//如果不想實(shí)現(xiàn)Comparable接口,也可以使用這個(gè)方法
Collections.sort(list,Comparator.comparingInt(User::getAge));
③使用Stream流操作的sort()方法,,傳入一個(gè)Comparator接口,。
list.stream().sorted(Comparator.comparingInt(User::getAge)).collect(Collectors.toList());
8、ArrayList是線程安全的嗎,?有什么方式可以讓ArrayList變成線程安全的,?
答:不是線程安全的。
使用Collections的synchronizedList()方法包裝可獲得線程安全的ArrayList,。
List<String> list = Collections.synchronizedList(new ArrayList<>());
9,、你是怎么在項(xiàng)目中使用redis的?
答:這其實(shí)是考了“redis常用的應(yīng)用場(chǎng)景”這個(gè)問題,。
①利用redis讀寫速度快的特點(diǎn),,可以做熱點(diǎn)數(shù)據(jù)的儲(chǔ)存,降低數(shù)據(jù)庫(kù)查詢的壓力,。
②利用redis鍵值設(shè)置有效期的特性,,做一些限時(shí)的業(yè)務(wù)。比如手機(jī)驗(yàn)證碼,。
③利用setnx命令的特性,,可以實(shí)現(xiàn)分布式鎖。
10、使用Redis實(shí)現(xiàn)分布式鎖的原理是什么,?
答:利用setnx命令的特性,。使用setnx一個(gè)lockKey字符串作為鍵,,當(dāng)前的時(shí)間+上鎖時(shí)間作為value,。如果返回是0,表示已經(jīng)被上鎖了,,需要等待鎖持有者釋放鎖,;如果返回1,則表示獲得了鎖,??蛻舳酸尫沛i的話執(zhí)行del命令刪除lockKey對(duì)應(yīng)的鍵值。
11,、如果使用分布式鎖加鎖后,,由于一些異常的原因沒有執(zhí)行解鎖的操作,怎么辦,?
答:一般解鎖操作會(huì)放在finally代碼塊中執(zhí)行,。如果有極端情況下沒有執(zhí)行到解鎖的操作,可以通過key對(duì)應(yīng)的時(shí)間戳判斷是否超時(shí),,然后使用GETSET命令去進(jìn)行解鎖,,通過判斷返回的時(shí)間戳是否是超時(shí)的key對(duì)應(yīng)的時(shí)間戳,確認(rèn)是否成功上鎖,。
12,、如果加分布式鎖的時(shí)候,業(yè)務(wù)操作時(shí)間比較長(zhǎng),,造成長(zhǎng)時(shí)間的阻塞,,有什么解決方案?
答:可以在加鎖時(shí)啟動(dòng)一個(gè)watch dog(看門狗)線程,,每隔10秒檢查一下,,如果客戶端還持有鎖則加長(zhǎng)lockKey的生存時(shí)間?;蛘呖梢钥紤]用zookeeper實(shí)現(xiàn)的分布式鎖,,因?yàn)閦k實(shí)現(xiàn)原理是基于事件監(jiān)聽的方式來(lái)實(shí)現(xiàn)。
13,、MySQL性能優(yōu)化的策略有哪些,?
①?gòu)?fù)雜的多表查詢可以拆成多句簡(jiǎn)單查詢。
②返回盡量少的列,,按需返回,,嚴(yán)禁使用select *。
③盡量使用索引列做查詢條件和排序條件。
④使用復(fù)合索引要遵循最左匹配原則,。
14,、MySQL索引創(chuàng)建的原則是什么?
①對(duì)于查詢頻率高的字段,,創(chuàng)建索引,。
②對(duì)排序、分組,、聯(lián)合查詢頻率高的字段創(chuàng)建索引,。
③如果多個(gè)列都需要設(shè)置索引,可以考慮創(chuàng)建復(fù)合索引,。
④盡量選擇數(shù)據(jù)量較少的列作為索引,。
⑤一個(gè)表的索引數(shù)量不宜過多,會(huì)降低查詢的效率,。
15,、雪花算法是什么原理?
答:使用一個(gè) 64 bit 的 long 型的數(shù)字作為全局唯一 id,。是由時(shí)間戳,、機(jī)房id、機(jī)器id,、序號(hào)組成的,。結(jié)合了UUID的全局唯一的特點(diǎn),又具有自增主鍵有順序的特點(diǎn),。
16,、為什么雪花算法生成的主鍵有字符串類型和long類型兩種類型?
答:因?yàn)楹蠖朔祷亟o前端一個(gè)long類型時(shí),,會(huì)有可能產(chǎn)生丟失精度的問題,,所以會(huì)有字符串的類型,彌補(bǔ)這個(gè)問題,。
17,、談一談MySQL鎖機(jī)制。
主要有以下幾種鎖:
表鎖,。開銷小,,加鎖快;不會(huì)出現(xiàn)死鎖,;鎖定粒度大,,發(fā)生鎖沖突的概率最高,并發(fā)度最低,。
行鎖,。開銷大,,加鎖慢;會(huì)出現(xiàn)死鎖,;鎖定粒度最小,,發(fā)生鎖沖突的概率最低,并發(fā)度也最高,。
在MySQL中只有InnoDB存儲(chǔ)引擎可以使用行鎖,。行鎖又分為以下兩種形式:
讀鎖(共享鎖):當(dāng)讀取一條數(shù)據(jù)時(shí),會(huì)加上讀鎖,,其他事務(wù)如果要讀取是可以的,,如果要修改則要等事務(wù)釋放才可以。
寫鎖(排他鎖):這個(gè)比較簡(jiǎn)單,,當(dāng)有一個(gè)事務(wù)要修改數(shù)據(jù)時(shí),就會(huì)給這些行加上寫鎖,。在加鎖期間,,不允許其他事務(wù)加上任何的鎖,只有當(dāng)這個(gè)事務(wù)釋放了,,才可以加鎖操作,。
在這次面試中,其實(shí)也不是特別難,,大部分都回答得不錯(cuò),,但是有兩個(gè)問題不是很好。雪花算法為什么主鍵生成有兩種類型這個(gè)問題沒有答出來(lái),,還有分布式鎖長(zhǎng)時(shí)間阻塞的解決方案沒有詳細(xì)展開講,。
更多的java技術(shù)分享,關(guān)注一下吧,。