常見Java面試題-基礎

Java 基礎

1.JDK 和 JRE 有什麼區別?

 JDK:它是Java開發運行環境,在程序員的電腦上當然要安裝JDK;
JRE:Java Runtime Environment它是Java運行環境,如果你不需要開發只需要運行Java程序,那麼你可以安裝JRE。

2.== 和 equals 的區別是什麼?

功能不同

"=="是判斷兩個變量或實例是不是指向同一個內存空間。

"equals"是判斷兩個變量或實例所指向的內存空間的值是不是相同。

定義不同

"equals"在JAVA中是一個方法。

"=="在JAVA中只是一個運算符合。

3.兩個對象的 hashCode()相同,則 equals()也一定爲 true,對嗎?

4.final 在 java 中有什麼作用?

凡是引用final關鍵字的地方皆不可修改!

(1)修飾類:表示該類不能被繼承;

(2)修飾方法:表示方法不能被重寫;

(3)修飾變量:表示變量只能一次賦值以後值不能被修改(常量)。

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

-1;round()方法四捨五入並向上取整

6.String 屬於基礎的數據類型嗎?

不屬於。
Java8種基礎的數據類型:byte、short、char、int、long、float、double、boolean。

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

String、StringBuffer、StringBuilder

String : final修飾,String類的方法都是返回new String。即對String對象的任何改變都不影響到原對象,對字符串的修改操作都會生成新的對象。
StringBuffer : 對字符串的操作的方法都加了synchronized,保證線程安全。
StringBuilder : 不保證線程安全,在方法體內需要進行字符串的修改操作,可以new StringBuilder對象,調用StringBuilder對象的append、replace、delete等方法修改字符串。

8.String str="i"與 String str=new String(“i”)一樣嗎?

不一樣的原因很簡單,因爲他們不是同一個對象。

String str="i";

這句話的意思是把“i”這個值在內存中的地址賦給str,如果再有String str3="i";那麼這句話的操作也是把“i”這個值在內存中的地址賦給str3,這兩個引用的是同一個地址值,他們兩個共享同一個內存。

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

則是將new String("i");的對象地址賦給str2,需要注意的是這句話是新創建了一個對象。如果再有String str4= new String("i");那麼相當於又創建了一個新的對象,然後將對象的地址值賦給str4,雖然str2的值和str4的值是相同的,但是他們依然不是同一個對象了。

需要注意的是:String str="i"; 因爲String 是final類型的,所以“i”應該是在常量池。

而new String("i");則是新建對象放到堆內存中。

9.如何將字符串反轉?

利用 StringBuffer 或 StringBuilder 的 reverse 成員方法:

利用 String 的 toCharArray 方法先將字符串轉化爲 char 類型數組,然後將各個字符進行重新拼接:

10.String 類的常用方法都有那些?

String 類的常用方法: 

  • equals:字符串是否相同
  • equalsIgnoreCase:忽略大小寫後字符串是否相同
  • compareTo:根據字符串中每個字符的Unicode編碼進行比較
  • compareToIgnoreCase:根據字符串中每個字符的Unicode編碼進行忽略大小寫比較
  • indexOf:目標字符或字符串在源字符串中位置下標
  • lastIndexOf:目標字符或字符串在源字符串中最後一次出現的位置下標
  • valueOf:其他類型轉字符串
  • charAt:獲取指定下標位置的字符
  • codePointAt:指定下標的字符的Unicode編碼
  • concat:追加字符串到當前字符串
  • isEmpty:字符串長度是否爲0
  • contains:是否包含目標字符串
  • startsWith:是否以目標字符串開頭
  • endsWith:是否以目標字符串結束
  • format:格式化字符串
  • getBytes:獲取字符串的字節數組
  • getChars:獲取字符串的指定長度字符數組
  • toCharArray:獲取字符串的字符數組
  • join:以某字符串,連接某字符串數組
  • length:字符串字符數
  • matches:字符串是否匹配正則表達式
  • replace:字符串替換
  • replaceAll:帶正則字符串替換
  • replaceFirst:替換第一個出現的目標字符串
  • split:以某正則表達式分割字符串
  • substring:截取字符串
  • toLowerCase:字符串轉小寫
  • toUpperCase:字符串轉大寫
  • trim:去字符串首尾空格

11.抽象類必須要有抽象方法嗎?

不必須。

如果一個類使用了abstract關鍵字修飾,那麼這個類就是一個抽象類。

抽象類可以沒有抽象方法

一個類如果包含抽象方法,那麼這個類必須是抽象類,否則編譯就會報錯。

最關鍵的一點就是如果一個類是抽象類,那麼這個類是不能被實例化的。

12.普通類和抽象類有哪些區別?

抽象類聲明時要使用abstract關鍵字來定義,而普通類可以是public , private 等;
抽象類裏的方法不能有方法的主體, 只能是方法的聲明,例如 abstract void AMetho,而普通類的方法可以有主體。
抽象類被繼承時、子類必須實現它的所有方法,而普通類不需要;
抽象類的方法在擴展性和延伸性方面要比普通類的好;
抽象類可以應用多態,但是普通類不可以。

13.抽象類能使用 final 修飾嗎?

不能,抽象類需要被繼承

14.接口和抽象類有什麼區別?

抽象類要被子類繼承,接口要被類實現。

接口只能做方法聲明,抽象類中可以作方法聲明,也可以做方法實現。

接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。

接口是設計的結果,抽象類是重構的結果。

抽象類和接口都是用來抽象具體對象的,但是接口的抽象級別最高。

抽象類可以有具體的方法和屬性,接口只能有抽象方法和不可變常量。

抽象類主要用來抽象類別,接口主要用來抽象功能。

15.java 中 IO 流分爲幾種?

•按照流的流向分,可以分爲輸入流和輸出流;

•按照操作單元劃分,可以劃分爲字節流和字符流;

•按照流的角色劃分爲節點流和處理流。

Java Io流共涉及40多個類,這些類看上去很雜亂,但實際上很有規則,而且彼此之間存在非常緊密的聯繫, Java I0流的40多個類都是從如下4個抽象類基類中派生出來的。

•InputStream/Reader: 所有的輸入流的基類,前者是字節輸入流,後者是字符輸入流。

•OutputStream/Writer: 所有輸出流的基類,前者是字節輸出流,後者是字符輸出流。
字符流和字節流的區別
字符流的由來: 因爲數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼錶。 字節流和字符流的區別:
讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。
處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。
字節流:一次讀入或讀出是8位二進制。通過字節的形式一個字節一個字節或者字節數組來操作文件中內容,可以操作一切文件。

16.BIO、NIO、AIO 有什麼區別?

同步阻塞I/O(BIO)

同步阻塞I/O,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,可以通過線程池機制來改善。BIO方式適用於連接數目比較小且固定的架構,這種方式對服務端資源要求比較高,併發侷限於應用中,在jdk1.4以前是唯一的io現在,但程序直觀簡單易理解

同步非阻塞I/O(NIO)

同步非阻塞I/O,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有IO請求時才啓動一個線程進行處理。NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,jdk1,4開始支持

異步非阻塞I/O(AIO)

異步非阻塞I/O,服務器實現模式爲一個有效請求一個線程,客戶端的IO請求都是由操作系統先完成了再通知服務器用其啓動線程進行處理。AIO方式適用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,jdk1.7開始支持。

IO與NIO區別

IO面向流,NIO面向緩衝區

IO的各種流是阻塞的,NIO是非阻塞模式

Java NIO的選擇允許一個單獨的線程來監視多個輸入通道,可以註冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道:這些通道里已經有可以處理的輸入或選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道

同步與異步的區別

同步:發送一個請求,等待返回,再發送下一個請求,同步可以避免出現死鎖,髒讀的發生

異步:發送一個請求,不等待返回,隨時可以再發送下一個請求,可以提高效率,保證併發

17.Files的常用方法都有哪些?

Files.exists() 檢測文件路徑是否存在
Files.createFile()創建文件
Files.createDirectory()創建文件夾
Files.delete() 刪除文件或者目錄
Files.copy() 複製文件
Files.move() 移動文件
Files.size()查看文件個數
Files.read() 讀取文件
Files.write()寫入文件

 

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