java面試基礎(一) 2016年5月3日
面向對象編程特性:抽象、封裝、繼承、多態
方法作用域: public 當前類、同包、子孫類、其他
protected 當前類、同包、子孫類
default 當前類、同包
private 當前類
八大基本數據類型:byte、short、int、long、float、double、char、boolean
float型賦值需要加入強制轉換:float f=(float)3.4
short s = 1;s=s+1; //錯誤需要強制轉換short s = 1;s = (short) (s + 1);
或者自動類型提升:short s = 1;s += 1;
goto爲保留字符
String是引用類型(區別在於是否可用null)
原始類型:byte、short、int、long、float、double、char、boolean
封裝類型:Byte、Short、Integer、Long、Float、Double、Character、Boolean
'&' '|' '^'(化作16位二進制進行運算)邏輯操作、'&&'、'||'爲條件操作(不說了,會短路,當判斷前面爲假,後面直接短路不判斷)
三者都是位運算,分別代表且、或、異或 計算方式:1&1=1,其他爲0。0|0=0,其他爲1。0^1或1^爲1,其他爲0
stack和heap:棧和堆,棧是一種線性集合、增刪改同一時間完成、後進先出。堆是棧組成的一個元素
Math.round(11.5)=12(計算方式+0.5求其floor,最接近的長整形)
Math.round(-11.5)=-11
源碼如下:
public static long round(double a) {
if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5
return (long)floor(a + 0.5d);
else
return 0;
}
switch是一個整形表達式,因此傳遞過來的應該是int、short、char
'~':取反運算:~1=0,~0=1(取反:小於或等於0的,取反+1,大於0的取反-1)
~9=~0000 0000 0000 0000 0000 0000 0000 1001
=~1111 1111 1111 1111 1111 1111 1111 0110(取反,32位操作系統)
=1111111111111111111111111111111111111111111111111111111111110110(64位操作系統)
=-10
負數變正數是通過補碼:
-33要知道其內存中儲存方式,先找出33的
0(代表正負數,0爲正數)000 0000 0010 0001
取反之後+1
1111 1111 1101 1110
1111 1111 1101 1111
'<<'(高位丟棄,地位補0)9<<3=72將9的位數向左移動三位(-9)<<3=-72(計算技巧,數據較小:左移n位相當於x*2^n)
'>>'(最高位爲0,則補0,反之亦然)9>>=1(計算技巧,數據較小:右移n位相當於x/2^n)
最快的算出2*8等於幾 2<<3
數組有length屬性,字符串有length()方法
label跳出多重嵌套循環
構造器Constructor不能被繼承,故不能重寫其Override方法
兩個equals相同,其一定有相同的hashcode,因爲其equals是用hashcode來判斷是否相等的
String是final最終類,不能被繼承
哈希算法:
(char)97=a //由哈希碼轉換爲字符串
a.hashCode() //由字符串轉換爲哈西碼
"abc".hashCode()=96354 //97=a,98=b,99=c。而96354是如何得到的呢?
java計算hashCode:
private int hash; // Default to 0
public int hashCode() {
int h = hash; //0
if (h == 0 && count > 0) {
int off = offset; //0
char val[] = value; //abc
int len = count; //3
for (int i = 0; i < len; i++) { //0 i<3 | 1 1<3 | 2 2<3
h = 31*h + val[off++]; //h=31*0+97=97
} //h=31*97+98=3105
//h=31*3105+99=96354
hash = h;
}
return h;
}
原創筆記。若有錯誤,請及時告知