基礎語法面試題

1,關於JDK,JRE,JVM

【爲何安裝包要分JDK和JRE?】

先來講說什麼是JDK,JRE。java

JDK:Java Development Kit Java開發工具包【開發Java程序用】linux

JRE:Java Runtiome Environment Java運行環境【運行Java程序用】數組

【注:下載的JDK包是包含了JDK和JRE的,JDK和JRE是邏輯上的區分,二者在JDK下載的包中都有】安全


JDK與JRE的關係:以Java代碼運行爲例,編寫好Java代碼以後,經過javac將java源文件編譯成class字節碼文件,而後經過java命令,運行字節碼文件。那麼運行字節碼的環境就是JRE。(JRE的核心就是JVM)服務器


瞭解完JDK和JRE是什麼以後,再聊聊爲何開發者當時要把一個安裝包分紅兩部分呢?多線程

日常使用的軟件都是一鍵安裝的,但JDK須要安裝兩次。JDK的發明者不會這麼無聊,故意給開發者增長麻煩。jvm

【我想】:這應該跟生產環境的部署問題有關,關於生產環境部署JDK仍是JRE一直飽受爭議,具體狀況根據項目而定。工具

出於對性能的考慮,儘量的使服務器輕,能少裝一個軟件就少裝一個,這樣生產環境部署JRE就OK了。【又省了資源】性能

除了這個方面以外,還有一種可能。JDK的開發也有多是分團隊的,JDK和JRE多是交由不一樣團隊開發,JDK和JRE的耦合也可能所以而減少,從而加快JDK的迭代版本。(畢竟如今JDK一年更新兩次)開發工具


【爲何Java語言是跨平臺的?】

跨平臺和Java 虛擬機有關。

JVM有兩個主要的功能:

  • 適配不一樣的操做系統的指令集(兼容不一樣的操做系統)
  • 翻譯字節碼文件爲機器碼執行

(Oracle官網上下載JDK,不一樣操做系統的JDK是不同的,對應不一樣的虛擬機)

這個就跟JVM有關了,先來了解一下什麼是JVM:

JVM:Java Virtual Machine Java虛擬機

JVM的主要做用就是將class字節碼文件翻譯成機器碼(01)供給計算機執行。


跨平臺——Java程序能夠在多種平臺上運行。


平臺指的是操做系統,目前主流的操做系統:Windows,Mac,Linux。

以平常軟件爲例,同一個軟件的win版和mac版是分開的。可是功能倒是基本相同的。

JVM一樣如此,也有win版,mac版以及linux版。安裝在不一樣的平臺上的JVM雖然有所差別,但都能完成一樣一件使命——將class文件翻譯成機器碼。


歸納來講,JVM有兩個功能:其一是,其二是翻譯class字節碼文件。


【爲何要設置環境變量?】

在解決這個問題以前,先解決環境變量是幹嗎的:

運行一個程序(命令),系統從當前目錄尋找,或者從環境變量中尋找。

換句話說,若是在java,javac的目錄下執行這個兩個命令,是沒有問題的。可是若是更換了目錄,系統在當前目錄找不到,就會去環境變量中尋找。因此設置環境變量的根本目的是在電腦的任何一個文件夾下均可以編譯運行Java程序。

2,關於包裝類和基本數據類型

包裝類型和基本數據類型的區別

  • 聲明方式:包裝類型須要new聲明
  • 存儲方式:基本數據類型存放在棧中,包裝類型存在堆中
  • 初始值不一樣:基本類型的初始值如int爲0,boolean爲false,而包裝類型的初始值爲null;

Integer int 的區別

Integer 是引用類型,默認值是null。而int是是值類型默認值是0

3,關於String類

1,String,StringBuilder,StringBuffer的區別

  • 可變性

    String是不可變的,StringBuffer和StringBuilder是可變的

  • 安全性

    StringBuffer和String是線程安全的,,StringBuilder是線程不安全的

【解釋】

聚焦:可變性,安全性

  • String 底層使用final修飾的數組實現

    1569732464337

  • 線程安全問題

    String 中的對象是不可變的,也就能夠理解爲常量,線程安全。

    StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖,因此是線程安全的。

    1569732828044

StringBuilder 並無對方法進行加同步鎖,因此是非線程安全的。 


對於三者使用的總結:

  1. 操做少許的數據: 適用String
  2. 單線程操做字符串緩衝區下操做大量數據: 適用StringBuilder
  3. 多線程操做字符串緩衝區下操做大量數據: 適用StringBuffer

2,String s = "Hello";s = s + "world!";這兩行代碼執行後,原始的String對象中的內容到底變了沒有?

​ 沒有。

由於String被設計成不可變(immutable)類(final修飾),因此它的全部對象都是不可變對象。

在這段代碼中,s原先指向一個String對象,內容是 "Hello",而後對s進行了+操做

這時,s不指向原來那個對象了,而指向了另外一個 String對象,內容爲"Hello world!"

原來那個對象還存在於內存之中,只是s這個引用變量再也不指向它了。

3,String str =「i」;和String str = new String("i");有區別嗎?

前者會被JVM分配到常量池中,常量池中沒有重複的元素。

String str1 =「i」;
String str2 =「i」;

str2不會從新建立一個常量,而是指向str1。

String str1 = new String("i");
String str2 = new String("i");

str1會在堆內存中建立對象

str2仍是會再次建立一個新的對象

4,如何將字符串反轉?

使用StringBuilder或者StringBuffer的reverse()方法。

StringBuffer str1 = new StringBuffer("12345");
        StringBuffer str2 = str1.reverse();
        System.out.println(str2);

5,關於運算符

==和equals的區別

==:

  • 基本數據類型:比較值是否相等
  • 引用類型:比較內存地址是否相同

equals:

一般會被重寫,比較引用類型的內容是否相同

int x = 7;
       int y = 7;

        //比較基本數據類型的值
        System.out.println(x==y);

        String str1 = new String("123");
        String str2 = new String("123");

        //比較引用類型的內存地址
        System.out.println(str1==str2);

        //比較引用類型的內容是否相同
        System.out.println(str1.equals(str2));

&和&&的區別(|和||同理)

&和&&表示邏輯與,兩邊同時爲true時才爲true。

&&具備短路功能,&&左邊爲false時,右邊表達式不會執行。

6,關於Math類

Math.round(11.5)等於多少?Math.round(-11.5)等於多少?

​ Math類中提供了三個與取整有關的方法:

ceil(向上取整)、floor(向下取整)、round(+0.5後四捨五入)

​ Math.ceil(11.3)的結果爲12

​ Math.ceil(-11.3)的結果是-11

​ Math.floor(11.6)的結果爲11

​ Math.ceil(-11.6)的結果是-12

​ Math.round(11.5)的結果爲12

​ Math.round(-11.5)的結果爲-11。

相關文章
相關標籤/搜索