Question
1.關(guān)于try catch final 執(zhí)行順序問題:
* java面試題20--如果catch里面有return語句浑侥,finally里面的代碼還會(huì)執(zhí)行嗎谷炸?
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序執(zhí)行到這一步的時(shí)候越锈,這里不是return a 而是 return 30莫换;這個(gè)返回路徑就形成了
* 但是呢俯树,它發(fā)現(xiàn)后面還有finally,所以繼續(xù)執(zhí)行finally的內(nèi)容晕城,a=40
* 再次回到以前的路徑,繼續(xù)走return 30叠纷,形成返回路徑之后,這里的a就不是a變量了勺择,而是常量30
*/
} finally {
a = 40;
}
// return a;
}
- try catch final
/*
* java面試題20--如果catch里面有return語句创南,finally里面的代碼還會(huì)執(zhí)行嗎?
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序執(zhí)行到這一步的時(shí)候酵幕,這里不是return a 而是 return 30扰藕;這個(gè)返回路徑就形成了
* 但是呢,它發(fā)現(xiàn)后面還有finally芳撒,所以繼續(xù)執(zhí)行finally的內(nèi)容邓深,a=40
* 再次回到以前的路徑,繼續(xù)走return 30,形成返回路徑之后笔刹,這里的a就不是a變量了芥备,而是常量30
*/
} finally {
a = 40;
return a; //如果這樣,就又重新形成了一條返回路徑舌菜,由于只能通過1個(gè)return返回萌壳,所以這里直接返回40
}
// return a;
}
結(jié)論
1).try 中如果發(fā)生異常,catch 會(huì)捕獲,如果在如果在catch中return 一個(gè)值,虛擬機(jī)會(huì)記錄這個(gè)值或者這個(gè)值的引用,如果在finally 中對(duì)這個(gè)值修改,引用會(huì)影響到返回值,但是int 這種的就不會(huì)了.因?yàn)闀?huì)把return 放到最后執(zhí)行,并且返回的是之前記錄的值,而不是代碼中看到的值
2).另外,如果在try 中發(fā)生異常,沒有catch 語句,只有finally 語句,并且在finally 中return 一個(gè)返回值,相當(dāng)于這次的異常被虛擬機(jī)拋棄,因?yàn)楹瘮?shù)仍然形成了閉環(huán),導(dǎo)致對(duì)于上層來說,相當(dāng)于函數(shù)依然正常執(zhí)行.
-
關(guān)于十進(jìn)制和十六進(jìn)制的加法規(guī)則
image.png
不難看出,debug 顯示十進(jìn)制數(shù)值, 會(huì)把非十進(jìn)制數(shù)值轉(zhuǎn)換成十進(jìn)制在進(jìn)行計(jì)算
非靜態(tài)內(nèi)部類的初始化方式
public class A{
class B{
}
}
A a = new A();
A.B b = a.new B();
非靜態(tài)內(nèi)部類屬于對(duì)象,用過對(duì)象實(shí)例化
- & 和 && 的區(qū)別
&和&&都是可以作為邏輯運(yùn)算符的,其邏輯運(yùn)算規(guī)則是相同的。
但&作為邏輯運(yùn)算符時(shí)袱瓮,即使第一個(gè)操作符是false缤骨,那么它仍然會(huì)計(jì)算第二個(gè)操作符。&&短路與尺借,如果第一個(gè)操作符為false绊起,那么它不會(huì)再去計(jì)算第二個(gè)操作符。
6.散列表hashmap散列沖突解決辦法
開放尋指法
當(dāng)散列沖突之后 插入到 沖突位置下一個(gè)數(shù)組位置中 如果依然沖突依次往后找
在查找的時(shí)候同樣需要從hash運(yùn)算出的位置依次向后找 直到遍歷到找到的元素燎斩,或者空元素停止
值得注意的是 刪除過程中我們不能簡(jiǎn)單的做一個(gè)刪除 否則會(huì)讓查找算法失效虱歪,解決辦法是刪除的時(shí)候 我們標(biāo)記為delete 這樣查找的時(shí)候,遍歷到delete栅表,就跳過繼續(xù)查找直到空或者找到相等元素
但是這種方式在沖突很多的笋鄙,情況下 時(shí)間復(fù)雜度會(huì)退回到o(n)
第二種則是我們hashmap中常見的,把沖的的元素在沖突位置生成鏈表或者紅黑樹