Java面試筆試相關瑣碎知識點,整理,持續更新。。。直到拿到offer。。。
1. 靜態塊:用static聲明,JVM加載類時執行,僅執行一次
構造塊:類中直接用{}定義,每一次創建對象時執行
執行順序優先級:靜態塊>main()>構造塊>構造方法
父類靜態成員和靜態塊、子類靜態成員和靜態塊、父類構造方法、子類構造方法
靜態塊按照聲明順序執行。
2. A.java用來運行一個.class文件,java test(不加.class後綴)
B.javadoc用來生成api文檔
C.jar用來生成jar包
D.javac用來把.java文件編譯爲.class文件,java test.java(加.java後綴)
3. java的垃圾回收機制是對象被賦值NULL,該對象就成爲可回收對象。
4. 繼承Thread,若不執行start()而是執行run(),則只是方法調用,並不是啓動一個線程。
5. 靜態變量只能在類主體中定義,不能在方法體中定義。
6. JDK中提供的java、javac、jar等開發工具也是用Java編寫的。
7. String類重寫了equals方法,類型不同返回false。
8. 一個java文件中包括內部類可以有多個publicclass
9. 單例模式:構造函數私有和唯一實例的特點
10. Servlet的體系結構
11. 構造方法不能被子類繼承,final修飾沒意義。
12. JVM中一個字節以下的整型數據會在JVM啓動的時候加載進內存,除非用new Integer()顯示創建對象,否則都是同一個對象。
13. JDBC中,創建Statement是不傳參的,PreparedStatement是需要傳入SQL語句的。
14. 構造方法不需要同步化,子類可以覆蓋父類的同步方法。
15. 方法可以和類同名,和構造方法唯一區別是構造方法沒有返回值。
16. vector是線程安全的,所以效率低,ArrayList不是線程安全。線程安全還包括statck、enumeration、hashtable(hashmap不是線程安全),其他基本都是非線程安全的類和接口。
17. j=j++;//相當於temp=j;j=j+1;j=temp;,java用了中間緩存機制。
18. System.out.println(false?10.9:9);輸出9.0,後面的9自動類型轉換爲double。當後兩個表達式有一個是常量表達式,另外一個類型是T時,常量表達式可以被T表示時,輸出結果仍然是T類型。
19. HashMap,TreeMap 未進行同步考慮,是線程不安全的。
HashTable 和 ConcurrentHashMap 都是線程安全的。區別在於他們對加鎖的範圍不同,HashTable 對整張Hash表進行加鎖,而ConcurrentHashMap將Hash表分爲16桶(segment),每次只對需要的桶進行加鎖。
Collections 類提供了synchronizedXxx()方法,可以將指定的集合包裝成線程同步的集合。比如,
List list =Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(newHashSet());
20. 實現抽象方法需要有兩同兩小一大原則:方法名相同,參數類型相同。子類返回類型小於等於父類方法返回類型,子類拋出異常小於等於父類方法拋出異常,子類訪問權限大於等於父類方法訪問權限。
21. wait()、notify()和notifyAll()是 Object類 中的方法;Condition是在java 1.5中才出現的,它用來替代傳統的Object的wait()、notify()實現線程間的協作,相比使用Object的wait()、 notify(),使用Condition1的await()、signal()這種方式實現線程間協作更加安全和高效。
22. 數值型變量在默認情況下爲Int型,byte和short型在計算時會自動轉換爲int型計算,結果也是int 型。所以a1*a2的結果是int 型的。
23. 解決哈希衝突常用的兩種方法是:開放定址法和鏈地址法
開放定址法:當衝突發生時,使用某種探查(亦稱探測)技術在散列表中形成一個探查(測)序列。沿此序列逐個單元地查找,直到找到給定的關鍵字,或者碰到一個開放的地址(即該地址單元爲空)爲止(若要插入,在探查到開放的地址,則可將待插入的新結點存人該地址單元)。查找時探查到開放的 地址則表明表中無待查的關鍵字,即查找失敗。
鏈地址法:將所有關鍵字爲同義詞的結點鏈接在同一個單鏈表中。若選定的散列表長度爲m,則可將散列表定義爲一個由m個頭指針組成的指針數 組T[0..m-1]。凡是散列地址爲i的結點,均插入到以T[i]爲頭指針的單鏈表中。T中各分量的初值均應爲空指針。
24. 使用匿名內部類時,必須繼承一個類或實現一個接口
匿名內部類由於沒有名字,因此不能定義構造函數
匿名內部類中不能含有靜態成員變量和靜態方法
25. 對於Integer var = ? 在-128 至127 範圍內的賦值,Integer 對象是在IntegerCache.cache 產生,會複用已有對象,這個區間內的Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用equals 方法進行判斷。
26. intValue()是把Integer對象類型變成int的基礎數據類型;
parseInt()是把String 變成int的基礎數據類型;
Valueof()是把String 轉化成Integer對象類型;
27. 對於外部類來說,只有兩種修飾,public和默認(default),因爲外部類放在包中,只有兩種可能,包可見和包不可見。
對於內部類來說,可以有所有的修飾,因爲內部類放在外部類中,與成員變量的地位一致,所以有四種可能。
28. 靜態屬性和靜態方法只是可以繼承沒有表現出多態性。因爲靜態方法和靜態屬性沒有采用動態綁定。具體表現就是,將子類實例向上轉型則會調用到基類中的靜態方法和屬性,不轉型就調用子類自身的靜態方法和屬性。編譯器不推薦通過實例去調用靜態方法和屬性,因爲這種調用方式容易造成混淆。實際上,在Java的規範中,Java對於類的方法和屬性採用了兩種完全不同的處理機制:對於方法,使用重載機制實現了多態性;對於屬性,使用的是同名屬性隱藏機制。所謂的同名屬性隱藏機制是指:在具有父子關係的兩個類中,子類中相同名字的屬性會使得從父類中繼承過來的同名屬性變得不可見,不管類型是否一致,名稱一致的兩個屬性就是同名屬性。在子類中,無法簡單地通過屬性名稱來獲取父類中的屬性,而是必須通過父類名稱加屬性名稱(super.變量名)的方法纔可以訪問父類中的該屬性。一般而言,爲了代碼容易閱讀,極其不建議在父類和子類中使用同名屬性。
29. 如果想在循環語句中刪除集合中某元素,就要用迭代器iterator的remove()方法,它會維護一個標誌用來記錄目前是否是可刪除狀態。
30. 數組複製的效率System.arraycopy>clone>Arrays.copyOf>for循環。
31. Boolean flag = false; if (flag= true){…}//JAVA的賦值運算是有返回值的,賦了什麼值,就返回什麼值。Boolean修飾的變量爲包裝類型,初始化值爲false,進行賦值時會調用Boolean.valueOf(booleanb)方法自動裝箱,因此賦值後flag值爲true,輸出文本true。 如果使用==比較,則輸出文本false。if的語句比較,除boolean外的其他類型都不能使用賦值語句,否則會提示無法轉成布爾值。
32. 包裝類的“==”運算在不遇到算術運算的情況下不會自動拆箱,包裝類的equals()方法不處理數據轉型。
33. Java中類是單繼承,但接口可以多繼承,Interfere1 extendsInterface2,Interface3...
34. equals和==的區別 ==操作比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。
35. toLowerCase 是重新 new String()。
36. 要注意兩個問題:
1,字符串在java中存儲在字符串常量區中
2,==判斷的是對象引用是否是同一個引用,判斷字符串相等要用equals方法
首先判斷a==MESSAGE 同一份字符串常量在內存中只有一份,因此是同一地址,返回true
再次比較(b+c)==MESSAGE這相當於 newString(b+c)==MESSAGE 這裏new了一個String對象,所以返回false。
private static final String MESSAGE="taobao";
public static void main(String[]args){
String a ="tao"+"bao";
String b="tao";
String c="bao";
System.out.println(a==MESSAGE);
System.out.println((b+c)==MESSAGE);
}
37. 子類重寫父類方法時,訪問權限不能小於原訪問權限。兩同(方法名、參數列表)兩小(返回值類型、異常)一大(子類權限比父類大或相等)
38. 加載驅動方法:1、Class.forName();2、DriverManager.registerDriver();3、System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”)。
39. HashMap中的key可以爲null,但不能是可變對象,因爲會導致hashCode改變,除非保證改變成員變量時保證hash值不變(重寫hash方法)。
40. equals方法重寫通常必須重寫hashCode方法。對象相同,hashcode必定相同;hashcode相同,對象不一定相同;hashcode不同,對象必定不同。
41. count++,並非原子性操作,而是讀取count值,+1操作,寫回count,“讀取-修改-寫入”的操作序列。
42. Comparable和Comparator接口,對集合對象或者數組對象排序,有兩種實現方式:(1)對象實現Comparable接口(自然順序);(2)定義比較器,實現Comparator接口(比較器)。
43. 持續更新。。。