Java面試過過過

  1. 面向對象的特徵

    • 抽象
    • 繼承
    • 多態
  2. 是否正確:

    float f=3.4;
    

    錯誤,3.4爲雙精度(double),將雙精度賦值給浮點型,屬於下轉型,會造成精度損失,需要強制轉化

  3. & 和&& 區別

    • &:按位與和邏輯與
    • &&:短路與運算

    在驗證用戶登錄時需判斷用戶名不是null而且不是空字符串時:username != null &&!username.equals(“”),兩者不能交換且只能使用&&不能使用&

  4. 解釋內存中的棧(stack)、堆(heap)和靜態存儲區的用法

    • 棧空間:一個基本數據類型的變量、一個對象的引用還有函數調用的線程保存
    • 堆空間:通過new關鍵字和構造器創造的對象
    • 靜態存儲區:程序中的字面量:直接書寫的100、“hello”

    String str = new String(“hello”);

    ​ str放在棧上;new出來的字符串對象放在堆上,而“hello“這個字面量放在靜態存儲區中

    ​ 但是是創建了兩個對象,一個是靜態存儲區的“xyz”,一個是用new創建在堆上的對象。

  5. 四捨五入的原理是在參數上+0.5然後向下取整。

  6. 移位是最有效的計算2次方的操作

  7. 數組只有length屬性,java有length()方法。

  8. 構造器不能被繼承,因此不能被重寫,但可以被重載。

  9. 不能繼承String類

  10. 當一個對象被當做參數傳遞到另一個方法後,此方法中改變了這個對象的屬性,並且返回了變化後的結果,請問是值傳遞還是引用傳遞

    • java中只有值傳遞,當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性可以在被調用的過程中改變,但對象的引用是永遠不會改變的。
  11. 下面程序的輸出

     public static void main(String[] args) {
            String a="helloworld";
            String b=new String("helloworld");
            String c="hello"+"world";
            System.out.println(a==b);
            System.out.println(a==c);
            System.out.println(a.equals(b));
            System.out.println(a.equals(c));
            System.out.println(a.intern()==b.intern());
        }
    

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-keDKoIno-1583376556401)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200304170505.png)]

    intern() 方法返回字符串對象的規範化表示形式。

    它遵循以下規則:對於任意兩個字符串 s 和 t,當且僅當 s.equals(t) 爲 true 時,s.intern() == t.intern() 才爲 true。

  12. JVM加載class文件的原理機制

    • JVM中類的裝載是由類加載器(ClassLoader)和它的子類來實現的,Java中的類加載器是一個重要的Java運行時系統組件,它負責在運行時查找和裝入類文件中的類

    ​ 當java程序需要使用某個類是,JVM會確保這個類已經被加載、連接(驗證、準備和解析)和初始化。

    ​ 類加載是值把類的.class文件中的數據讀入到內存中,通常會創建一個字節數組讀入.class文件,然後產生與所加載類對應的Class對象。然後進入連接階段,主要包括驗證、準備和解析。最後JVM對類進行初始化

    ​ 類的加載器:根加載器、擴展加載器、系統加載器和用戶自定義類加載器

  13. 靜態嵌套類(Static Nested Class)和內部類(Inner Class)的不同

    • 靜態嵌套類是被聲明爲靜態的內部類,它可以不依賴於外部類實例被實例化。
    • 內部類:需要在外部類實例化後才能實例化
  14. java中會存在內存泄漏嗎

    • 存在無用但可達的對象,這些對象不能被GC回收也會發生內存泄漏
      • Hibernate的Session(一級緩存)中的對象屬於持久態,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象
  15. 抽象的(abstract)方法是否可同時是靜態的(static),是否可同時是本地方法(native),是否可同時被synchronized修飾

    • 都不可以
      • 抽象方法需要子類重寫,而靜態方法是無法被重寫的。
      • 本地方法是由本地代碼實現的方法,而抽象方法時沒有實現的。
      • synchronized和方法的實現細節有關,抽象方法不設計實現細節。
  16. 靜態變量和實例變量的區別

    • 靜態變量是被static修飾的變量。也稱爲類變量,它屬於類,不屬於類的任何一個對象,一個類不管創建多少個對象,靜態變量在內存中有且只有一個拷貝;實例變量必須依附於某一實例,需要先創建對象然後通過對象才能訪問到它。靜態變量可以實現讓多個對象共享內存。
  17. 是否可以從一個靜態方法內部發出對非靜態方法的調用?

    • 不可以,靜態方法只能訪問靜態成員。因爲非靜態方法的調用要先創建對象,因此在調用講臺方法時可能對象並沒有被初始化
  18. 如何實現對象克隆

    • 實現Cloneable接口並重寫Object類中的clone()方法;
    • 實現Serializable接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆
    import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
    
    import java.io.ByteArrayInputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public abstract class test {
    
        private test(){
            throw new AssertionError();
        }
    
        public static <T> T clone(T obj)throws Exception{
            ByteOutputStream bout = new ByteOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bout);
            oos.writeObject(obj);
    
            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bin);
            return (T) ois.readObject();
        }
    
    }
    

    ​ 基於序列化和反序列化實現的克隆不僅僅是深度克隆,更中套的是通過泛型限定,可以檢查出要克隆的對象是否支持序列化。

    ​ 這項檢查是編譯器完成的,不是在運行時拋出異常

  19. Error和Exception有什麼區別

    • Error:表示系統級的錯誤和程序不必處理的異常,是恢復不是不可能但是很困難的情況下的一種嚴重問題:內存溢出不可能指望程序能處理這種情況
    • Exception:表示需要捕捉或者需要程序進行處理的異常,是一種設計或現實問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章