Java面試題解析(一)

本文是面試題目系列的第一篇,題目主要來自 GitChat 上一個課程,在此特別記錄自身想的答案和在網上查詢的結果,分享出來,你們共同窗習。若是有不對的地方,歡迎你們指出。html

Java基礎


JDK 和 JRE有什麼區別

JDK:Java Development Kit,java開發包,其包括JRE和一些Java工具,如javac,javap等java

開發環境(編譯,調試,分析工具)和運行環境面試

JRE:Java Runtime environment,Java運行時環境,其包括JVM和Java運行過程當中所須要的一些核心類庫.如lang,util等經常使用的...算法

--數組

== 和equals的區別是什麼

對於基本類型來講,== 是用來比較二者的字面值是否相同的,基本類型沒有equals方法安全

對於引用來講,== 是用來比較二者的引用是否相同,equals是用來比較引用指向的對象是否相同的異步

自定義對象若是須要比較二者是否相同,須要開發者本身手動重寫equals()方法,通常重寫這個方法也會帶着重寫hashcode()方法函數


兩個對象的 hashCode() 相同,則 equals() 也必定爲 true,對嗎

不對,hashcode()只是將對象按照必定的Hash算法生成對應的16進制字符串,由於有長度的限制,所以一定會出現重複的狀況,但他們的equals()此時並不必定相同.工具


final 在 java 中有什麼做用

final是Java中的一個關鍵字.性能

  • 定義基本變量:變量是常量,在第一次聲明值後就沒法修改.
  • 定義對象:對象的引用沒法修改,即沒法指向其餘的對象,但對象內部的值能夠修改
  • 定義方法:方法沒法被重寫,通常用來表示方法已經完善了,不但願別人重寫該方法
  • 定義類:類沒法被繼承,Java中的String等類就沒法被繼承.

java 中的 Math.round(-1.5) 等於多少

public void testMath(){
        log.info("-1.8:,{}",Math.round(-1.8));
        log.info("-1.5:,{}",Math.round(-1.5));
        log.info("-1.2:,{}",Math.round(-1.2));
        log.info("1.2:,{}",Math.round(1.2));
        log.info("1.5:,{}",Math.round(1.5));
        log.info("1.8:,{}",Math.round(1.8));
    }
// 運行結果
2019-04-04 10:59:32.599  INFO 8076 --- [           main] com.jrookie.service.DemoServiceTest      : -1.8:,-2
2019-04-04 10:59:32.600  INFO 8076 --- [           main] com.jrookie.service.DemoServiceTest      : -1.5:,-1
2019-04-04 10:59:32.600  INFO 8076 --- [           main] com.jrookie.service.DemoServiceTest      : -1.2:,-1
2019-04-04 10:59:32.600  INFO 8076 --- [           main] com.jrookie.service.DemoServiceTest      : 1.2:,1
2019-04-04 10:59:32.600  INFO 8076 --- [           main] com.jrookie.service.DemoServiceTest      : 1.5:,2
2019-04-04 10:59:32.601  INFO 8076 --- [           main] com.jrookie.service.DemoServiceTest      : 1.8:,2

經過結果能夠看出除了-1.5都像是四捨五入的結果,但經過分析源碼能夠得出
其結果是數據+0.5再向下取整便可


String 屬於基礎的數據類型嗎

String屬於Java核心類庫的對象

/**
* 內部由不可變的char數組來實現,這也解釋了爲何String是不可變的類型
*/
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
 private final char value[];

java 中操做字符串都有哪些類?它們之間有什麼區別

  • String:最基本的字符串類型,建立後不可變
  • StringBuilder:其內部的char[]數組都是可變,所以是可變類型
  • StringBuffer:也是可變類型,但其內部大量使用了synchronized關鍵字,代表內部的方法都是線程安全的.

所以在性能比較上:String > StringBuilder > StringBuffer
但若是想要用可變類型,能夠直接使用StringBuffer,這個是線程安全的,且性能和StringBuilder相比,並無差不少.


String str="i"與 String str=new String(「i」)同樣嗎

不同,String str="i",是聲明一個引用直接指向字符串常量池,而String str=new String(「i」),會生成一個堆對象,引用指向該對象,該對象再指向字符串常量池.


如何將字符串反轉

多種解法及其編碼實現

  • 數組的方式引入第三方數據,做爲存儲
  • 直接在原數據上進行操做.能夠考慮使用異或的方式來交換數據,效率更高

StringBuilder 和 StringBuffer 中封裝好了對應的反轉操做,能夠直接使用


String 類的經常使用方法都有那些


抽象類必需要有抽象方法嗎

根據下面的代碼實例,代表應該是能夠的

public abstract class AbstractDemoClass {
    public void test(){
        System.out.println("hello,world");
    }
}

普通類和抽象類有哪些區別

  • 抽象類不能夠被實例化

    普通類不能包含抽象方法


抽象類能使用 final 修飾嗎

不能夠,抽象類必需要有子類來繼承它,實現其中的抽象方法,才能夠實例化,若是用final來修飾的話,該類就沒法被繼承,那麼這個抽象類就沒有用處了.


接口和抽象類有什麼區別

  • 抽象類做爲類只能夠單繼承,但接口能夠實現多個
  • 抽象類能夠有方法的實現,Java在8以前不能有方法的實現(Java8以後提供了一個默認方法實現的功能)
  • 接口中的方法所有默認爲pubic的,抽象類中能夠自定義

    抽象類能夠有構造函數,接口不能有構造函數


java 中 IO 流分爲幾種

分爲字節流和字符流,其中每一個又細分爲輸入和輸出,所以一共有四種流,分爲爲InputStream,OutputStream,Reader,Writer.

在處理字節流和字符流之間的轉換問題時,注意編碼的問題.


BIO、NIO、AIO 有什麼區別

BIO

同步阻塞模型,A調用B,A須要收到B的返回結果才能夠繼續執行,B去當即執行

NIO

非阻塞IO,A調用B,A不用收到結果就能夠繼續執行

AIO

異步非阻塞IO,A調用B,B返回給A保證會執行,而後A繼續幹其餘事,當B幹完了後通知A,再讓A來處理數據

操做基於事件和回調機制


Files的經常使用方法都有哪些

對應collection的Collections類,是對File的操做類,封裝了一些經常使用方法:

  • Files. exists():檢測文件路徑是否存在。
  • Files. createFile():建立文件。 [ createFile():建立文件。]
  • Files. createDirectory():建立文件夾。
  • Files. delete():刪除一個文件或目錄。
  • Files. copy():複製文件。
  • Files. move():移動文件。
  • Files. size():查看文件個數。
  • Files. read():讀取文件。
  • Files. write():寫入文件。
相關文章
相關標籤/搜索