JDK相關基礎面試題


1. JDK基礎知識結構

JDK1.8中一級java包有14個,我們需要掌握的有

java.util   包含集合框架、集合類、日期和時間設施、以及其他程序類。
java.io	    通過數據流、序列化和文件系統提供系統輸入輸出
java.nio	定義緩沖區,它們是數據容器,並提供NIO包的概述
java.lang	編程基礎類

2. 經典面試題

  • 2.1. 你常用的JDK類有哪些?請說出5個。

      String、StringBuffer、Integer、ArrayList、HashMap、Date、Object(選擇熟悉的5個)
    
  • 2.2 "String、StringBuilder、StringBuffer的區別是什么?"

      1、可變性:
      String不可變,StringBuilder與StringBuffer是可變的。
      String類中使用只讀字符數組保存字符串,private final char value[],
      所以是不可變的(Java 9 中底層把 char 數組換成了 byte 數組,占用更少的空間)。
      StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,
      char[]value,這兩種對象都是可變的。
    
      2、線程安全性:
      String和StrinbBuffer是線程安全的,StringBuilder是非線程安全的。
      String線程安全是因為其對象是不可變的,StringBuffer線程安全是因為對方法加了同步鎖或者對調用的方法加了同步鎖。
      StringBuilder並沒有對方法進行加同步鎖,所以是非線程安全的。
    
      3、性能:
      String的性能較差,因為每次對String 類型進行改變的時候,都會生成一個新的String對象,然后將指針指向新的String 對象。
      而StringBuffer/StringBuilder性能更高,是因為每次都是對對象本身進行操作,
      而不是生成新的對象並改變對象引用。一般情況下StringBuilder 相比StringBuffer 可獲得10%~15% 左右的性能提升。
    

總結:

如果要操作少量的數據用 String;

單線程操作字符串緩沖區下操作大量數據 StringBuilder;

多線程操作字符串緩沖區下操作大量數據 StringBuffer;

  • 2.3 int和Integer的區別?

      int是java內置的8種基本數據類型之一,而Integer是Java為int引入的對應的包裝類型(wrapper class)。
      從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。
    
    
      public static void main(String[] args) {
      Integer a = new Integer(3);
      Integer d = new Integer(3);   // 通過new來創建的兩個Integer對象
      Integer b = 3;                  // 將3自動裝箱成Integer類型int c = 3;
      int     c = 3;                  // 基本數據類型3
      System.out.println(a == b);     // false 兩個引用沒有引用同一對象
      System.out.println(a == d);     // false 兩個通過new創建的Integer對象也不是同一個引用
      System.out.println(c == b);     // true b自動拆箱成int類型再和c比較
    

​ 當兩邊都是Integer對象時,是引用比較;當其中一個是int基本數據類型時,另一個Integer對象也會自動拆箱變成int類型再進行值比較。

	public static void main(String[] args) {
	Integer f1 = 100;
	Integer f2 = 100;
	Integer f3 = 150;
	Integer f4 = 150;
	System.out.println(f1 == f2);   // true,當int在[-128,127]內時,結果會緩存起來
	System.out.println(f3 == f4);   // false,屬於兩個對象
	}

簡單的說,如果整型字面量的值在-128到127之間,那么不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中f1f2的結果是true,而f3f4的結果是false。

  • 2.4 兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這樣說對不對?

      不對。如果兩個對象x和y滿足x.equals(y) == true,它們的hash code應當相同。
    
      Java對於eqauls方法和hashCode方法是這樣規定的:(1)如果兩個對象相同(equals方法返回true),
      那么它們的hashCode值一定要相同;(2)如果兩個對象的hashCode相同,它們並不一定相同。
    
  • 2.5 如果你的Serializable類中包含一個不可序列化的成員,會發生什么?如何解決呢?

      任何序列化該類的嘗試都會因NotSerializableException而失敗,
      但這可以通過在 Java中給屬性設置瞬態(transient)變量來輕松解決。
    
  • 2.6 String類型為什么設計成final且不可變的?

      1.不可變性支持線程安全。
    
      String類被final修飾,是不可繼承和修改的。
      當一個String變量被第二次賦值時,
      不是在原有內存地址上修改數據,而是在內存中重新開辟一塊內存地址,並指向新地址。
    
      2.不可變性支持字符串常量池,提升性能。
      3.String字符串作為最常用數據類型之一,不可變防止了隨意修改,保證了數據的安全性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM