2019年總結:Java中高階面試題228道系列(6)

程式設計師追風發表於2019-12-13

2019年Java面試題中高階系列228道

Java面試題(一)

第一篇更新1~20題的答案解析

juejin.im/post/5de8c6…

第二篇更新21~50題答案解析
juejin.im/post/5dea1d…

第三篇更新51~95題答案解析
juejin.im/post/5decd3…


Java面試題(二)

第四篇更新1~20題答案解析

第五篇更新21~50題答案解析

juejin.im/post/5def4d…


2019年總結:Java中高階面試題228道系列(6)

Java面試題(二)

51、ArrayList 與 LinkedList 的不區別?
52、用哪兩種方式來實現集合的排序?
53、Java 中怎麼列印陣列?
54、Java 中的 LinkedList 是單向連結串列還是雙向連結串列?
55、Java 中的 TreeMap 是採用什麼樹實現的?(答案)
56、Hashtable 與 HashMap 有什麼不同之處?
57、Java 中的 HashSet,內部是如何工作的?
58、寫一段程式碼在遍歷 ArrayList 時移除一個元素?
59、我們能自己寫一個容器類,然後使用 for-each 迴圈碼?
60、ArrayList 和 HashMap 的預設大小是多數?
61、有沒有可能兩個不相等的物件有有相同的 hashcode?
62、兩個相同的物件會有不同的的 hash code 嗎?
63、我們可以在 hashcode() 中使用隨機數字嗎?
64、Java 中,Comparator 與 Comparable 有什麼不同?
66、在我 Java 程式中,我有三個 socket,我需要多少個執行緒來處理?
67、Java 中怎麼建立 ByteBuffer?
68、Java 中,怎麼讀寫 ByteBuffer ?
69、Java 採用的是大端還是小端?
70、ByteBuffer 中的位元組序是什麼?
71、Java 中,直接緩衝區與非直接緩衝器有什麼區別?
72、Java 中的記憶體對映快取區是什麼?
73、socket 選項 TCP NO DELAY 是指什麼?
74、TCP 協議與 UDP 協議有什麼區別?
75、Java 中,ByteBuffer 與 StringBuffer 有什麼區別?(答案)
76、Java 中,編寫多執行緒程式的時候你會遵循哪些最佳實踐?
77、說出幾點 Java 中使用 Collections 的最佳實踐
78、說出至少 5 點在 Java 中使用執行緒的最佳實踐。
79、說出 5 條 IO 的最佳實踐(答案)
80、列出 5 個應該遵循的 JDBC 最佳實踐

本篇更新21-50題的答案

51、ArrayList 與 LinkedList 的不區別?

最明顯的區別是 ArrrayList 底層的資料結構是陣列,支援隨機訪問,而LinkedList 的底層資料結構書連結串列,不支援隨機訪問。使用下標訪問一個元素,ArrayList 的時間複雜度是 O(1),而 LinkedList 是 O(n)。

52、用哪兩種方式來實現集合的排序?

你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有順序的的集合,如 list,然後通過 Collections.sort() 來排序。

53、Java 中怎麼列印陣列?

你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法來列印陣列。由於陣列沒有實現 toString() 方法,所以如果將陣列傳遞給 System.out.println()方法,將無法列印出陣列的內容,但是 Arrays.toString() 可以列印每個元素。

54、Java 中的 LinkedList 是單向連結串列還是雙向連結串列?

是雙向連結串列,你可以檢查 JDK 的原始碼。在 Eclipse,你可以使用快捷鍵 Ctrl + T,直接在編輯器中開啟該類。

55、Java 中的 TreeMap 是採用什麼樹實現的?

Java 中的 TreeMap 是使用紅黑樹實現的。

56、Hashtable 與 HashMap 有什麼不同之處?

這兩個類有許多不同的地方,下面列出了一部分:
a) Hashtable 是 JDK 1 遺留下來的類,而 HashMap 是後來增加的。
b)Hashtable 是同步的,比較慢,但 HashMap 沒有同步策略,所以會更快。
c)Hashtable 不允許有個空的 key,但是 HashMap 允許出現一個 null key。

57、Java 中的 HashSet,內部是如何工作的?

HashSet 的內部採用 HashMap 來實現。由於 Map 需要 key 和 value,所以所有 key 的都有一個預設 value。類似於 HashMap,HashSet 不允許重複的key,只允許有一個 null key,意思就是 HashSet 中只允許儲存一個 null 物件。

58、寫一段程式碼在遍歷 ArrayList 時移除一個元素?

該問題的關鍵在於面試者使用的是 ArrayList 的 remove() 還是 Iterator 的remove()方法。這有一段示例程式碼,是使用正確的方式來實現在遍歷的過程中移除元素,而不會出現 ConcurrentModificationException 異常的示例程式碼。

59、我們能自己寫一個容器類,然後使用 for-each 迴圈碼?

可以,你可以寫一個自己的容器類。如果你想使用 Java 中增強的迴圈來遍歷,你只需要實現 Iterable 介面。如果你實現 Collection 介面,預設就具有該屬性。

60、ArrayList 和 HashMap 的預設大小是多數?

在 Java 7 中,ArrayList 的預設大小是 10 個元素,HashMap 的預設大小是16 個元素(必須是 2 的冪)。這就是 Java 7 中 ArrayList 和 HashMap 類的程式碼片段:
// from ArrayList.java JDK 1.7
private static final int DEFAULT_CAPACITY = 10;
//from HashMap.java JDK 7
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
// aka 16複製程式碼

61、有沒有可能兩個不相等的物件有有相同的 hashcode?

有可能,兩個不相等的物件可能會有相同的 hashcode 值,這就是為什麼在hashmap 中會有衝突。相等 hashcode 值的規定只是說如果兩個物件相等,必須有相同的 hashcode 值,但是沒有關於不相等物件的任何規定。

62、兩個相同的物件會有不同的的 hash code 嗎?

不能,根據 hash code 的規定,這是不可能的。

63、我們可以在 hashcode() 中使用隨機數字嗎?

不行,因為物件的 hashcode 值必須是相同的。參見答案獲取更多關於 Java 中重寫 hashCode() 方法的知識。

64、Java 中,Comparator 與 Comparable 有什麼不同?

Comparable 介面用於定義物件的自然順序,而 comparator 通常用於定義使用者定製的順序。Comparable 總是隻有一個,但是可以有多個 comparator 來定義物件的順序。

65、為什麼在重寫 equals 方法的時候需要重寫 hashCode 方法?

因為有強制的規範指定需要同時重寫 hashcode 與 equal 是方法,許多容器類,如 HashMap、HashSet 都依賴於 hashcode 與 equals 的規定。

66、在我 Java 程式中,我有三個 socket,我需要多少個執行緒來處理?

這個需要看你是並行處理還是序列處理了。

67、Java 中怎麼建立 ByteBuffer?

byte[] bytes = new byte[10];
ByteBuffer buf = ByteBuffer.wrap(bytes);複製程式碼

68、Java 中,怎麼讀寫 ByteBuffer ?

69、Java 採用的是大端還是小端?

70、ByteBuffer 中的位元組序是什麼?

71、Java 中,直接緩衝區與非直接緩衝器有什麼區別?

72、Java 中的記憶體對映快取區是什麼?

73、socket 選項 TCP NO DELAY 是指什麼?

74、TCP 協議與 UDP 協議有什麼區別?

75、Java 中,ByteBuffer 與 StringBuffer 有什麼區別?

76、Java 中,編寫多執行緒程式的時候你會遵循哪些最佳實踐?

a)給執行緒命名,這樣可以幫助除錯。
b)最小化同步的範圍,而不是將整個方法同步,只對關鍵部分做同步。
c)如果可以,更偏向於使用 volatile 而不是 synchronized。
d)使用更高層次的併發工具,而不是使用 wait() 和 notify() 來實現執行緒間通訊,如 BlockingQueue,CountDownLatch 及 Semeaphore。
e)優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴充套件性。

77、說出幾點 Java 中使用 Collections 的最佳實踐

a)使用正確的集合類,例如,如果不需要同步列表,使用 ArrayList 而不是Vector。
b)優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴充套件性。
c)使用介面代表和訪問集合,如使用 List 儲存 ArrayList,使用 Map 儲存HashMap 等等。
d)使用迭代器來迴圈集合。
e)使用集合的時候使用泛型。

78、說出至少 5 點在 Java 中使用執行緒的最佳實踐。

這個問題與之前的問題類似,你可以使用上面的答案。對執行緒來說,你應該:
a)對執行緒命名
b)將執行緒和任務分離,使用執行緒池執行器來執行 Runnable 或 Callable。
c)使用執行緒池

79、說出 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)通過列名來獲取結果集,不要使用列的下標來獲取。

最後

歡迎大家關注我的公眾號【程式設計師追風】,整理了1000道2019年多家公司java面試題400多頁pdf文件,文章都會在裡面更新,整理的資料也會放在裡面。

喜歡文章記得點個贊喲,感謝支援!


2019年總結:Java中高階面試題228道系列(6)

相關文章