《Java必須知道的300個問題》學習筆記

1. Java基本數據類型長度(字節)

  • 1個:byte(-128~127)
  • 2個:char(02^16-1),short(-2^152^15-1)
  • 4個:int(-231~231-1),float(IEEE 754)
  • 8個:double(-263~263-1),double(IEEE 754)

2. goto在Java中作為保留字

3. 常量定義:final,無法修改,沒有子類,不能被重寫

4. float需要用f或F修飾,long用l或L

5. 3-2.6 == 0.4是false,浮點數計算不精確,可用BigDecimal

6. >>>:無符號右移。位運算在同等條件下,比四則運算符的乘法或者是除法快

7. &&是短路運算符,也是邏輯運算符

8. short s = 1; s = s + 1是錯的,Java默認使用的是int,需要強轉s = (short)(s + 1)

9. +=運算符在編譯的時候不會報錯,但可能產生溢出

10. 閏年:能被4整除但不能被100整除,或能被400整除

11. 跳出多重嵌套循環:break Lablel;Label應放在循環語句前,否則不起作用

12. Arrays類:

  • copyOfRang:復制數組
  • binarySearch:查找元素(二分法)

13. 排序算法:(待補充)

14. 存儲相同數據量,二維數組比一維大,因為需要指向第一維的指針

15. 類成員訪問權限

類所在說明 private 默認的 protected public
本類 可見 可見 可見 可見
相同包的其他類 不可見 可見 可見 可見
不同包的其他類 不可見 不可見 不可見 可見
相同包的子類 不可見 可見 可見 可見
不同包的子類 不可見 不可見 可見 可見

16. 抽象類和抽象方法:

  • 抽象類
    • 不能用new實例化
    • 只有它能包含抽象成員
    • 若派生,必須覆蓋繼承來的抽象成員
  • 抽象方法
    • 必須聲明在抽象類
    • 不能用static修飾
    • 方法只含分號
    • 派生需要實現

17. 靜態語句塊:通常用于必須的初始化操作

18. Java只有值傳遞,對象參數傳的是對象引用地址

19. 一般情況下,抽象類用于繼承,接口用于實現

20. super可調用被重寫的方法和成員

21. final、finally、finalize的比較

  • final:修飾符。修飾類不能被繼承。修飾變量賦值后不能被修改;修飾方法不能被重寫。
  • finally:異常處理
  • finalize:一個方法,可以被重寫,一般用于釋放資源

22. 淺克隆和深克隆

  • 淺克?。罕豢寺〉膶ο蟾鱾€屬性是基本類型,而不是引用類型。
    • 使用Object的clone()實現淺克隆,但必須實現Cloneable接口
  • 深克隆:存在引用類型
    • ①在淺克隆的基礎上,實現對引用類型初始化
    • ②采用序列化的方式,但是比①效率低

23. 內部類可被繼承,但必須硬性給予這個類一個帶參數的構造方法,參數應為外部類的引用,同時使用.super()方法

24. 創建Class對象:

  • ①Class類的forName()
  • ②通過類的class屬性
  • ③調用對象的getClass()方法

25. 使用反射創建對象

  • ①Class的newInstance(),是對象,且必須提供沒有入口參數的構造方法
  • ②使用Constructor:先獲得類的Class對象,再通過Class對象方法獲得Constructor類的實例,并通過Constructor類實例,調用newInstance(Object... obj)完成對象的創建

26. 通過反射調用方法:通過Class對象或者Method對象,調用Method類的invoke方法

27. 通過反射訪問字段:通過getFiled()或getDeclaredFiled()獲得指定字段,返回Field對象,用Field的getter()或setter()實現訪問(只可修改public修飾的字段)

28. 重寫equals()方法

  • 自反性:x.equals(x)始終返回true
  • 對稱性
  • 傳遞性
  • 一致性:始終返回true或false
  • x.equals(null)都應返回false

29. 自動裝包:基本類型自動轉換為包裝類,自動拆包與之相反

30. String str = ""String str = null區別:前者為其分配內存空間,長度為0,后者沒有

31. “==”余equals()的區別:前者比較兩個對象使用的內存地址和內容是否相同,后者只比較內容

32. 在Java中,如果將同一字符串常量賦值給多個字符串變量來創建字符串對象,則這些字符串對象具有相同的內存地址

33. 日期的格式化,時間變量的格式化:(待補充)

34. 正則表達式:(待補充)

35. 去掉字符串中的空格:

  • replaceAll方法
  • StringTokenizer類

36. 判斷數字:isDigit(char ch)

37. 各進制轉換:

  • parseInt(String s, int radix)
  • toBinaryString(int i)
  • toHexString(int i)
  • toOctalString(int i)

38. StringBuilder是非線程安全的,但效率比StringBuffer高

39. 替換字符串:

  • replace
  • replaceFirst
  • replaceAll

40. 漢字區位碼的轉換:

  • 國標碼 = 區位碼 + 2020H
  • 機內碼 = 國標碼 + 8080H
  • 機內碼 = 區位碼 + A0A0H

41. Arrays.asList方法,Collection定義的toArray方法,可以將數組轉為集合,或者將集合轉為數組

42. Iterator接口中的remove方法是迭代過程中刪除元素的安全方法

43. List接口中,定義的ListIterator和Iterator的區別

圖1 ListIterator和Iterator的區別

44. ArrayList和LinkedList的區別

|集合 | 底層| 查找|增刪|
| :-------------|:-------------| :-----|:-----|:-----|
| ArrayList| 數組元素 | 快 |慢,大量移動|
| LinkedList| 鏈表對象 | 慢,從頭遍歷 |快|

45. List<Integer> list = new ArrayList<>();刪除元素時,可list = new LinkedList()<>

46. Collection主要子接口繼承關系

圖2 Collection主要子接口繼承關系

47. List接口實現類繼承關系

圖3 List接口實現類繼承關系

48. Queue接口及其實現類繼承關系

圖4 Queue接口實現類繼承關系(注意,LinkedList底層也實現了List接口)

49. Set接口及其實現類繼承關系

圖5 Set接口實現類繼承關系

50. ArrayList與Vector的比較:Vector有些方法為同步,適合于需要線程安全的開發,但效率差

51. Deque:兩側進入,兩側離開的隊列

52. Set

  • HashSet實現元素快速保存
  • LinkedHashSet有列表和集合兩種功能,由于保存了順序,性能比HashSet差
  • TreeSet:支持排序
  • 以上三個Set都不支持線程同步

53. Map

  • HashMap:快速保存,查找數據
  • TreeMap:支持排序
  • LinkedHashMap:保存鍵值對添加順序

54. Map

  • keySet()獲得鍵
  • value()獲得值
  • entrySet()獲得鍵值對

55. 自定義TreeMap排序:修改compareTo()

new TreeMap<,>(new Comarator<>(){})

56. Math.random()返回0.0~1.0之間的偽隨機數,使用的是線性同余法

57. 線性同余法:

  • (1)將種子設為X0
  • (2)用一個算法X(n+1) = (a * X(n) + b) mod c 產生X(n+1)

58. 使用RoundingMode進行舍入,HALF_UP實現四舍五入

59. 數字格式化:DecimalFormat(待補充)

60. Throwable:

Throwable
->Error
->Exception

61. 異常

  • 檢查時異常:提供處理方式,如捕獲或者拋出
  • 運行時異常:程序員失誤引起,可避免

62. 錯誤:程序以外的因素引起

63. try-catch-finally,不管程序是否發生異常,都要執行的是finally

64. PrintWriter的printLn()可以寫入一行數據

65. 使用Scanner類可以讀取文本文件并解析數據

66. 從控制臺接收密碼,使用Console的readPassword()

67. Formatter對字符串進行格式化(待補充)

68. 使用ObjectInputStream、ObjectOutputStream保存對象,使用transient關鍵字,讓其屬性不被保存

69. 查看Windows硬盤空間:File類

70. 創建臨時文件:createTempFile

71. SequenceInputStream,方便管理日志文件

72. LineNumberReader可以設置行號

73. 獲得指定類型文件:FileFilter,FilenameFilter

74. StreamTokenizer可統計單詞和數字的個數

75. 讀取屬性文件值:Properties

76. NIO緩沖實現:

圖6-1 緩沖區示意圖
圖6-2 保存3個字節的緩沖區示意圖
圖6-3 調用flip方法的緩沖區示意圖

77. NIO中,增加了內存映射IO,可將文件映射到內存

78. 泛型類型參數的命名要求

  • E:元素,廣泛用于Java集合框架
  • K:鍵
  • N:數字
  • T:類型
  • V:值
  • S、U、V等:用于第二、三、四個類型變量

78. 泛型限制類型參數范圍

  • <T extends Comparable>表示T的范圍限制在Comparable接口的實現類
  • <T extends Number>表示T的范圍限制在Number類的子類
  • <T extends Number & Comparable>對類型參數進行多個限制

79. Java的泛型支持協變,但是泛型不支持

  • Number[] numbers = new Integer[5];// 正確 Object[] objects = new List<?>[3];// 正確 Object[] objects = new List<Integer>[3];// 錯誤

80. ?表示類型通配符,具有任意性

81. 泛型擦除:Java虛擬機在編譯的時候,會將類型信息給消去,這個過程稱為類型擦除

比如:boolean result = (new ArrayList<Number>().getClass() = new ArrayList(Integer)().getClass());結果為true,因為在編譯的時候,程序變為輸出new ArrayList().getClass = new ArrayList().getClass的結果
由于擦除機制,導致許多常用功能無法實現,比如創建泛型化數組T[] array = new T[10],但可以使用Java的反射機制來實現
` public static <T> T[] createGenericArray(Class<T> type, int size) {
    return (T[]) Array.newInstance(type, size);

82. Java Swing開發注意事項

  • Swing中的控件必須放置在頂層容器類中才能顯示
  • 每個控件只能在容器中添加一次,如果想將容器中的空間增加到另一個容器中,則將移除第一個容器中的控件
  • 每個頂層容器都有一個內容窗格,用來保存添加的控件
  • 可以在頂層容器中增加菜單欄。菜單欄通常位于頂層容器中,但是不在內容窗格中(菜單欄僅用于JFrame和JApplet)

83. Swing頂層容器類的繼承關系

圖7 Swing頂層容器類的繼承關系

84. Swing文本控件的繼承關系

圖8 Swing文本控件的繼承關系
  • JTextField:用于顯示單行無格式的文本
  • JFormattedTextField:用于獲得指定格式的文本
  • JPasswordField:用于顯示單行密碼
  • JTextArea:用于顯示多行無格式的文本
  • JEditorPane和JTextPane:均用于顯示多行有格式的文本

85. 使用鍵盤來操作文本控件:在javax.swing.JComponent類中定義了getInputMap()方法,可以用來獲得InputMap對象,通過該對象可以將特定的按鍵與操作綁定

86. 限制文本域中輸入字符的長度:DocumentFilter類提供了對文檔增加、替換和刪除操作的過濾功能。由于刪除操作并不能讓字符串長度增加,因此只要限制增加和替換操作即可。

87. 提示文本框中還有多少字符可用:實現DocumentListener接口,但不要在DocumentListener中修改文檔的內容。對于JTextField控件,可以使用繼承的getDocument()方法或者Document對象,然后將其強轉成AbstractDocument,再調用addDocumentListener()方法為其執行DocumentListener

88. 設置按鈕上文本和圖標的位置:

  • setHorizontalTextPosition():用于設置文本相對于圖標的水平位置
  • setVerticalTextPosition():垂直位置

89. 單選按鈕需要放在ButtonGroup類中才能實現單選

90. 獲得當前系統支持的全部字體名稱的數組:String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();GraphicsEnvironment類表示由當前系統上虛擬機可以獲得的GraphicsDevice類和Font類對象組成的集合。GraphicsEnvironment類對象的資源可以是本地系統, 也可以是遠程系統。該類是一個抽象類,可以使用其getLocalGraphicsEnvironment()方法獲得其對象。getAvailableFontFamilyNames()方法可以返回由當前GraphicsEnvironment類對象包含的字體名稱字符串組成的數組。

91. DefaultListCellRenderer類是默認的列表單元格渲染器,它實現了ListCellRenderer接口。在ListCellRenderer接口中定義了唯一的方法getListCellRendererComponent(),用于控制如何繪制單元格

92. 使用JOptionPane類實現對話框功能

93. JTestPane改變樣式的步驟:

  • (1)將文檔根據樣式的不同進行分割,得到一個字符串數組
  • (2)分別為不同的字符串樣式命名并保存到一個字符串數組中
  • (3)根據步驟(2)確定的名稱來定義樣式
  • (4)將文檔與樣式進行關聯

94. 選擇圖片時的預覽功能:JFileChooser類提供了一個setAccessory()方法,它可以為文件選擇器設置輔助設施,可以在輔助設施中提供圖片預覽功能??梢允褂肐mage類來實現圖片的縮放。

95. 實現自動排序的列表:在實現列表模型時,使用TreeSet保存列表元素

96. 得到顯示器大小:Toolkit類的getScreenSize()

97. 線程的生命周期

圖9 線程的生命周期

98. Java線程的屬性及其作用

  • ID屬性:用于標識線程,可以使用Thread類中的getId()方法得到該屬性值。但是該屬性不能修改。
  • Name屬性:用于標識線程,主要是為了方便程序員區分線程??梢允褂肨hread類中的getName()方法獲得該屬性值。也可以使用setName()方法修改該屬性值。
  • Priority屬性:用于表示線程的優先級,高優先級的線程可能有較高的幾率獲得自由。該屬性與底層操作系統密切相關。Java中的線程優先級范圍是1~10??梢允褂肨hread類中的getPriority()方法和setPriority()方法獲得和設置該屬性值。
  • Daemon屬性:用于表示線程是否是守護線程。守護線程的作用是為其他線程提供服務。如果系統中僅剩下守護線程,則虛擬機會退出??梢允褂肨hread類中的setDaemon()方法設置線程是否是守護線程,方法的參數是一個布爾值

99. 線程的停止

  • 線程執行時,程序中某段代碼拋出InterruptedException異常
  • 當前線程執行了sleep()方法
  • 另一個高優先級的線程處于可運行狀態,當前線程可能轉為等待狀態,與操作系統有聯系
  • 當前線程執行了InputStream類的read()方法

100. 線程中,start和run的區別:一個線程start(),并不表明線程馬上執行,它需要等待CPU進程調度機制。run()表示線程的運行,是線程對象的一個方法。

101. Object類提供的線程相關方法

  • notify():喚醒在此對象監視器上等待的單個線程
  • notifyAll():所有線程
  • wait():線程處于等待狀態,直到其他線程調用此對象的notify()或者notifyAll()
  • wait(long timeout):與上者相同,區別是超過指定的時間量會喚醒。時間精度是毫秒級
  • wait(long timeout, in nanos):納秒級。

101. 線程同步是一種控制多個線程依次使用共享資源的能力,從而避免了錯誤的發生

102. 線程死鎖:兩個以上的線程互相都要求對方已經占有的資源而導致無法繼續運行的現象

103. 使用Executors創建線程池,因為創建一個新的線程有一定的代價。使用完畢后,使用ExecutorService接口中定義的shutdown()關閉線程池

104. Swing不是線程安全的

105. 線程池存在死鎖、并發問題、資源不足等風險

106. 守護線程:又稱后臺線程,為其他線程服務

107. 終止線程運行:Interrupted(),(stop()和suspend()不推薦,因為不安全)

108. 線程的掛起:讓線程暫時讓出CPU的使用權限,暫時停止執行。

109. 使用同步鎖解決資源沖突問題lock()和unlock()

110. ISO/OSI參考模型:共有七層

  • 物理層:用于在物理介質上傳輸可靠的原始比特流,是數據鏈路層在兩個主機之間交換數據的有效途徑
  • 數據鏈路層:以幀為單位在兩個相鄰節點間的線路上無差錯地傳輸數據,并且接收方在接收到一幀數據時,會對所接收的數據進行檢測,如果數據存在差錯,就通知發送方重新發送這一幀數據
  • 網絡層:用于選擇合適的網間路由和交換節點,以確保數據能夠在經過很多數據鏈路或經過很多通信子網的計算機之間及時地傳送
  • 傳輸層:主要是根據通信子網的特性對網絡資源進行最佳的利用,該層通過可靠和不可靠兩種方式以報文為單位在源主機與目標主機的會話層建立、維護和取消傳輸連接
  • 會話層:用于建立、管理和終止進程間的會話,該層通過在數據中插入校驗點,從而可以保證數據的同步傳輸
  • 表示層:用于對上層的數據進行轉換,如對數據的加密、解密、壓縮和格式等進行轉換,以確保數據能夠在兩個主機的應用層進行正確傳輸
  • 應用層:用于規定應用進程在通信時所應遵循的協議,如收發郵件、瀏覽網頁、上傳和下載文件等,從而可以滿足用戶的實際需要

111. TCP/IP對OSI參考模型進行了改進

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容