Java基礎------真實大廠面試題彙總

面試題1. 按值傳遞和按引用傳遞的區別?

  1. 如果傳遞的參數是八大基本類型的話,就是值傳遞。如果參數傳遞的是對象實例、數組或者是接口的話,就是按引用傳遞的
  2. 所以說,如果當你傳遞的是對象的話,也就是說如果是按引用傳遞的話,當你想要去更改該參數中對象的屬性的話,那麼就可以成功

看下面一個例子仔細思考一下吧

public class TestObjects {

    public static void main(String[] args){

        Foo f = new Foo("f");
        changeReference(f); // It won't change the reference!
        System.out.println("changeReference改變之後的對象---------->"+f.toString());
        modifyReference(f); // It will modify the object that the reference variable "f" refers to!
        System.out.println("modifyReference修改之後的對象----------->"+f.toString());
    }


    public static void changeReference(Foo a){
        System.out.println("這是changeReference方法"+a.toString());
        Foo b = new Foo("b");
        System.out.println("這是changeReference方法"+b.toString());
        //下面其實是把b的對象又給了a的引用
        a = b; //如果這裏要是值傳遞的話,在changeReference(f); 方法之後輸出打印的應該是name=b,但是打印出來的卻還是name=f
        System.out.println("這是changeReference方法"+a.toString());
    }

    public static void modifyReference(Foo c){
        System.out.println("這是modifyReference方法set之前"+c.toString());
        c.setAttribute("c");
        System.out.println("這是modifyReference方法set之後"+c.toString());
    }


}
E:\javaJDK\jdk1.8.0_181\bin\java.exe "-javaagent:E:\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=60482:E:\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath E:\javaJDK\jdk1.8.0_181\jre\lib\charsets.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\deploy.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\dnsns.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\jaccess.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\localedata.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\nashorn.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\sunec.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\ext\zipfs.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\javaws.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\jce.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\jfr.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\jfxswt.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\jsse.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\management-agent.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\plugin.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\resources.jar;E:\javaJDK\jdk1.8.0_181\jre\lib\rt.jar;D:\GitCode\design-patterns\target\classes;C:\Users\lenovo\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.0.5.RELEASE\spring-boot-starter-web-2.0.5.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\boot\spring-boot-starter\2.0.5.RELEASE\spring-boot-starter-2.0.5.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.0.5.RELEASE\spring-boot-starter-logging-2.0.5.RELEASE.jar;C:\Users\lenovo\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\lenovo\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\lenovo\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;C:\Users\lenovo\.m2\repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;C:\Users\lenovo\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\lenovo\.m2\repository\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;C:\Users\lenovo\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.0.5.RELEASE\spring-boot-starter-json-2.0.5.RELEASE.jar;C:\Users\lenovo\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;C:\Users\lenovo\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\lenovo\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;C:\Users\lenovo\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;C:\Users\lenovo\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;C:\Users\lenovo\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;C:\Users\lenovo\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.12.Final\hibernate-validator-6.0.12.Final.jar;C:\Users\lenovo\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\lenovo\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\lenovo\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-web\5.0.9.RELEASE\spring-web-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-beans\5.0.9.RELEASE\spring-beans-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-webmvc\5.0.9.RELEASE\spring-webmvc-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-aop\5.0.9.RELEASE\spring-aop-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-context\5.0.9.RELEASE\spring-context-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-expression\5.0.9.RELEASE\spring-expression-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\boot\spring-boot-devtools\2.0.5.RELEASE\spring-boot-devtools-2.0.5.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\boot\spring-boot\2.0.5.RELEASE\spring-boot-2.0.5.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.5.RELEASE\spring-boot-autoconfigure-2.0.5.RELEASE.jar;C:\Users\lenovo\.m2\repository\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar;C:\Users\lenovo\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\lenovo\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-core\5.0.9.RELEASE\spring-core-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\springframework\spring-jcl\5.0.9.RELEASE\spring-jcl-5.0.9.RELEASE.jar;C:\Users\lenovo\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.1.1\junit-jupiter-api-5.1.1.jar;C:\Users\lenovo\.m2\repository\org\apiguardian\apiguardian-api\1.0.0\apiguardian-api-1.0.0.jar;C:\Users\lenovo\.m2\repository\org\opentest4j\opentest4j\1.0.0\opentest4j-1.0.0.jar;C:\Users\lenovo\.m2\repository\org\junit\platform\junit-platform-commons\1.1.1\junit-platform-commons-1.1.1.jar com.CollectionTest.TestObjects
這是changeReference方法Foo{name='f'}
這是changeReference方法Foo{name='b'}
這是changeReference方法Foo{name='b'}
changeReference改變之後的對象---------->Foo{name='f'}
這是modifyReference方法set之前Foo{name='f'}
這是modifyReference方法set之後Foo{name='c'}
modifyReference修改之後的對象----------->Foo{name='c'}

面試題2. Java的Object類中有哪些方法,各自的用途?

  1. clone()方法是用來進行拷貝一個對象的,他使用的是一種淺拷貝的方式。
  2. finalize() 方法是

面試題3. 深拷貝和淺拷貝的區別,怎麼實現深拷貝?

他們的區別就是:

  1. 當如果要拷貝一個A對象,而A對象中又有一個B對象,那麼如果對A拷貝的時候,重新拷貝出來一個A1對象並且重新分配內存地址,但是對於A中的B對象,僅僅只是把A1中拷貝出來的B1對象的引用指向原來的B對象而已,並沒有把拷貝的B1對象也重新進行分配一個新的內存地址。這就是淺拷貝。
  2. 而深拷貝就是在第1的基礎上,不僅重新給A1對象分配了新的內存地址,而且還給A1中的B1也重新進行分配了新的內存地址,而不只是僅僅把原本的B的引用給B1。這就是深拷貝

這裏借用一張書中的圖片:
在這裏插入圖片描述

那麼如果實現深拷貝呢?

  1. 如果想要深拷貝一個對象,這個對象必須要實現 Cloneable 接口,實現 重寫clone()方法,並且在 clone 方法內部,把該對象引用的其他對象也要 clone 一份,這就要求這個被引用的對象必須也要實現
    Cloneable 接口並且實現 clone 方法

面試題4. Final, finally, finalize的區別?

  1. final:他是用來進行修飾方法、類、以及屬性變量的,如果修飾的是方法的話,表示方法不能夠被覆蓋,如果修飾的是類的話,就表示該類不能夠被繼承,如果修飾的是屬性變量的話,就表示該屬性變量不能夠被修改。
  2. finally:他一般用來進行try 。。catch語句之後,主要是爲了進行釋放一些連接資源,無論怎麼finally中的代碼都會被執行。
  3. finalize:

面試題5. 講一講泛型,有沒有在jdk源碼層面研究過泛型

面試題6. .說一說java的異常體系, java是如何處理異常的?

在這裏插入圖片描述

用上面一張圖進行描述一下Java的異常體系的兩大類:

  1. 第一種是我們開發人員會經常遇到的Throwable的子類Exception中的異常。並且這種異常一般是運行時異常和IO異常,表示程序還能夠克服和恢復的問題,運行時異常就是我們開發中實際會經常遇到的一些,比如java.lang.NullPointerException、java.lang.ClassNotFoundException、java.lang.IndexOutOfBoundsException,這種異常可以使用try catch進行捕獲異常就可以了,當然我們還可以提前用throws把有可能發生的異常給聲明出來,或者在進行局部可能會出現的異常進行throw出去(這個只能單獨拋出一種異常的實例)
  2. 第二種是由於虛擬機自身的一些錯誤導致的error異常,也是Throwable中子類的異常。這種異常表示應用程序本身無法克服和恢復的一種嚴重問題。,這種異常我們開發人員一般很難遇到。

面試題7. Public、private、protected

  1. public的訪問權限:當前類,子類,當前類所在的包下,以及其他包下都可以進行訪問。
  2. protected的訪問權限:除了當前類所在的包下、以及子類都可以訪問,其他的包下都不能進行訪問。(可以用肥水不流外人田記憶,哈哈)
  3. 默認的話:只能當前類和當前類所在的包下可以訪問,當前類的子類和其他包下都不能進行訪問。
  4. private的訪問權限:只有當前類可以訪問(你可以理解成,加了private的話,這個人的錢就只能他自己知道他有多少錢,別人都不知道)
    訪問的權限依次是遞減的。

面試題8. 成員變量局部變量是否可以不初始化?

面試題9. String,StringBuffer和StringBuilder的區別?

面試題10. 接口和抽象類區別?,接口除了抽象方法還有什麼方法?

不同之處:

抽象類:

  1. 抽象類中可以定義構造器
  2. 可以有抽象方法和具體方法
  3. 接口中的成員全都是 public 的
  4. 抽象類中可以定義成員變量
  5. 有抽象方法的類必須被聲明爲抽象類,而抽象類未必要有抽象方法
  6. 抽象類中可以包含靜態方法
  7. 一個類只能繼承一個抽象類

接口:

  1. 接口中不能定義構造器
  2. 方法全部都是抽象方法
  3. 抽象類中的成員可以是 private、默認、protected、public
  4. 接口中定義的成員變量實際上都是常量
  5. 接口中不能有靜態方法
  6. 一個類可以實現多個接口

相同之處:

  1. 不能夠實例化
  2. 可以將抽象類和接口類型作爲引用類型
  3. 一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要
    被聲明爲抽象類

面試題11. 什麼 是內存泄漏和內存溢出,有什麼解決辦法?

面試題12. java中final 和static的區別?

面試題13. jdk動態代理,靜態代理講講?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章