2019年Java面試題中高級系列228道java
Java面試題(一)程序員
第一篇更新1~20題的答案解析面試
第二篇更新21~50題答案解析數據庫
第三篇更新51~95題答案解析數組
Java面試題(二)緩存
第四篇更新1~20題答案解析數據結構
第五篇更新21~50題答案解析多線程
Java面試題(二)併發
5一、ArrayList 與 LinkedList 的不區別?app
5二、用哪兩種方式來實現集合的排序?
5三、Java 中怎麼打印數組?
5四、Java 中的 LinkedList 是單向鏈表仍是雙向鏈表?
5五、Java 中的 TreeMap 是採用什麼樹實現的?(答案)
5六、Hashtable 與 HashMap 有什麼不一樣之處?
5七、Java 中的 HashSet,內部是如何工做的?
5八、寫一段代碼在遍歷 ArrayList 時移除一個元素?
5九、咱們能本身寫一個容器類,而後使用 for-each 循環碼?
60、ArrayList 和 HashMap 的默認大小是多數?
6一、有沒有可能兩個不相等的對象有有相同的 hashcode?
6二、兩個相同的對象會有不一樣的的 hash code 嗎?
6三、咱們能夠在 hashcode() 中使用隨機數字嗎?
6四、Java 中,Comparator 與 Comparable 有什麼不一樣?
6六、在我 Java 程序中,我有三個 socket,我須要多少個線程來處理?
6七、Java 中怎麼建立 ByteBuffer?
6八、Java 中,怎麼讀寫 ByteBuffer ?
6九、Java 採用的是大端仍是小端?
70、ByteBuffer 中的字節序是什麼?
7一、Java 中,直接緩衝區與非直接緩衝器有什麼區別?
7二、Java 中的內存映射緩存區是什麼?
7三、socket 選項 TCP NO DELAY 是指什麼?
7四、TCP 協議與 UDP 協議有什麼區別?
7五、Java 中,ByteBuffer 與 StringBuffer 有什麼區別?(答案)
7六、Java 中,編寫多線程程序的時候你會遵循哪些最佳實踐?
7七、說出幾點 Java 中使用 Collections 的最佳實踐
7八、說出至少 5 點在 Java 中使用線程的最佳實踐。
7九、說出 5 條 IO 的最佳實踐(答案)
80、列出 5 個應該遵循的 JDBC 最佳實踐
本篇更新21-50題的答案
5一、ArrayList 與 LinkedList 的不區別?
最明顯的區別是 ArrrayList 底層的數據結構是數組,支持隨機訪問,而LinkedList 的底層數據結構書鏈表,不支持隨機訪問。使用下標訪問一個元素,ArrayList 的時間複雜度是 O(1),而 LinkedList 是 O(n)。
5二、用哪兩種方式來實現集合的排序?
你可使用有序集合,如 TreeSet 或 TreeMap,你也可使用有順序的的集合,如 list,而後經過 Collections.sort() 來排序。
5三、Java 中怎麼打印數組?
你可使用 Arrays.toString() 和 Arrays.deepToString() 方法來打印數組。因爲數組沒有實現 toString() 方法,因此若是將數組傳遞給 System.out.println()方法,將沒法打印出數組的內容,可是 Arrays.toString() 能夠打印每一個元素。
5四、Java 中的 LinkedList 是單向鏈表仍是雙向鏈表?
是雙向鏈表,你能夠檢查 JDK 的源碼。在 Eclipse,你可使用快捷鍵 Ctrl + T,直接在編輯器中打開該類。
5五、Java 中的 TreeMap 是採用什麼樹實現的?
Java 中的 TreeMap 是使用紅黑樹實現的。
5六、Hashtable 與 HashMap 有什麼不一樣之處?
這兩個類有許多不一樣的地方,下面列出了一部分:
a) Hashtable 是 JDK 1 遺留下來的類,而 HashMap 是後來增長的。
b)Hashtable 是同步的,比較慢,但 HashMap 沒有同步策略,因此會更快。
c)Hashtable 不容許有個空的 key,可是 HashMap 容許出現一個 null key。
5七、Java 中的 HashSet,內部是如何工做的?
HashSet 的內部採用 HashMap 來實現。因爲 Map 須要 key 和 value,因此全部 key 的都有一個默認 value。相似於 HashMap,HashSet 不容許重複的key,只容許有一個 null key,意思就是 HashSet 中只容許存儲一個 null 對象。
5八、寫一段代碼在遍歷 ArrayList 時移除一個元素?
該問題的關鍵在於面試者使用的是 ArrayList 的 remove() 仍是 Iterator 的remove()方法。這有一段示例代碼,是使用正確的方式來實如今遍歷的過程當中移除元素,而不會出現 ConcurrentModificationException 異常的示例代碼。
5九、咱們能本身寫一個容器類,而後使用 for-each 循環碼?
能夠,你能夠寫一個本身的容器類。若是你想使用 Java 中加強的循環來遍歷,你只須要實現 Iterable 接口。若是你實現 Collection 接口,默認就具備該屬性。歡迎你們關注個人公種浩【程序員追風】,2019年多家公司java面試題整理了1000多道400多頁pdf文檔,文章都會在裏面更新,整理的資料也會放在裏面。
60、ArrayList 和 HashMap 的默認大小是多數?
在 Java 7 中,ArrayList 的默認大小是 10 個元素,HashMap 的默認大小是16 個元素(必須是 2 的冪)。這就是 Java 7 中 ArrayList 和 HashMap 類的代碼片斷:
// from ArrayList.java JDK 1.7private static final int DEFAULT_CAPACITY = 10;//from HashMap.java JDK 7static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;// aka 16
6一、有沒有可能兩個不相等的對象有有相同的 hashcode?
有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是爲何在hashmap 中會有衝突。相等 hashcode 值的規定只是說若是兩個對象相等,必須有相同的 hashcode 值,可是沒有關於不相等對象的任何規定。
6二、兩個相同的對象會有不一樣的的 hash code 嗎?
不能,根據 hash code 的規定,這是不可能的。
6三、咱們能夠在 hashcode() 中使用隨機數字嗎?
不行,由於對象的 hashcode 值必須是相同的。參見答案獲取更多關於 Java 中重寫 hashCode() 方法的知識。
6四、Java 中,Comparator 與 Comparable 有什麼不一樣?
Comparable 接口用於定義對象的天然順序,而 comparator 一般用於定義用戶定製的順序。Comparable 老是隻有一個,可是能夠有多個 comparator 來定義對象的順序。
6五、爲何在重寫 equals 方法的時候須要重寫 hashCode 方法?
由於有強制的規範指定須要同時重寫 hashcode 與 equal 是方法,許多容器類,如 HashMap、HashSet 都依賴於 hashcode 與 equals 的規定。
6六、在我 Java 程序中,我有三個 socket,我須要多少個線程來處理?
這個須要看你是並行處理仍是串行處理了。
6七、Java 中怎麼建立 ByteBuffer?
byte[] bytes = new byte[10];ByteBuffer buf = ByteBuffer.wrap(bytes);
6八、Java 中,怎麼讀寫 ByteBuffer ?
6九、Java 採用的是大端仍是小端?
70、ByteBuffer 中的字節序是什麼?
7一、Java 中,直接緩衝區與非直接緩衝器有什麼區別?
7二、Java 中的內存映射緩存區是什麼?
7三、socket 選項 TCP NO DELAY 是指什麼?
7四、TCP 協議與 UDP 協議有什麼區別?
7五、Java 中,ByteBuffer 與 StringBuffer 有什麼區別?
7六、Java 中,編寫多線程程序的時候你會遵循哪些最佳實踐?
a)給線程命名,這樣能夠幫助調試。
b)最小化同步的範圍,而不是將整個方法同步,只對關鍵部分作同步。
c)若是能夠,更偏向於使用 volatile 而不是 synchronized。
d)使用更高層次的併發工具,而不是使用 wait() 和 notify() 來實現線程間通訊,如 BlockingQueue,CountDownLatch 及 Semeaphore。
e)優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴展性。
7七、說出幾點 Java 中使用 Collections 的最佳實踐
a)使用正確的集合類,例如,若是不須要同步列表,使用 ArrayList 而不是Vector。
b)優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴展性。
c)使用接口表明和訪問集合,如使用 List 存儲 ArrayList,使用 Map 存儲HashMap 等等。
d)使用迭代器來循環集合。
e)使用集合的時候使用泛型。
7八、說出至少 5 點在 Java 中使用線程的最佳實踐。
這個問題與以前的問題相似,你可使用上面的答案。對線程來講,你應該:
a)對線程命名
b)將線程和任務分離,使用線程池執行器來執行 Runnable 或 Callable。
c)使用線程池
7九、說出 5 條 IO 的最佳實踐
IO 對 Java 應用的性能很是重要。理想狀況下,你不該該在你應用的關鍵路徑上避免 IO 操做。下面是一些你應該遵循的 Java IO 最佳實踐:
a)使用有緩衝區的 IO 類,而不要單獨讀取字節或字符。
b)使用 NIO 和 NIO2
c)在 finally 塊中關閉流,或者使用 try-with-resource 語句。
d)使用內存映射文件獲取更快的 IO。
80、列出 5 個應該遵循的 JDBC 最佳實踐
有不少的最佳實踐,你能夠根據你的喜愛來例舉。下面是一些更通用的原則:
a)使用批量的操做來插入和更新數據
b)使用 PreparedStatement 來避免 SQL 異常,並提升性能。
c)使用數據庫鏈接池
d)經過列名來獲取結果集,不要使用列的下標來獲取。
最後
歡迎你們一塊兒交流,喜歡文章記得點個贊喲,感謝支持!