現在新技術迭代非常快,我們一方面要學習掌握更多的新技術,同時我們需要不斷的鞏固已學的知識,一點點的知識積累終會變成質的飛躍。現在我就想來總結一下java一些常用的面試題。
原文:https://blog.csdn.net/sufu1065/article/details/88051083
參考文章
一.java基礎
1.JDK和JRE有什麼區別?
答: JDK : JDK是Java Development Kit的縮寫,JDK 是java的開發工具包,主要面向開發人員,JDK包含JRE,安裝JDK的同 時會安裝JRE。
JRE: JRE是Java Runtime Environment的縮寫,是java程序運行環境,主要面向java程序使用者,JRE是可以在其上運行、測試和傳輸應用程序的Java平臺。它包括Java虛擬機(jvm)、Java核心類庫和支持文件。它不包含開發工 具 (JDK)–編譯器、調試器和其它工具。
JVM: JVM是java的虛擬機,它是整個java實現跨平臺的最核心的部分,所有的java程序會首先被編譯爲.class的類文件,這種類文件可以在虛擬機上執行。
詳細解釋:https://blog.csdn.net/chen_006/article/details/88656268
2.== 和equals()有什麼區別?
答: == : 1.如果用來判斷基本數據類型(也稱原始數據類型)(byte,short,char,int,long,float,double,boolean)。他們之間的比較,應用雙等號(==),比較的是他們的值。
2.如果用來判斷引用數據類型,當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址(確切的說,是堆內存地址)。
equals() : 如果用來判斷引用類類型,默認情況下比較的是地址值,也可以用來字符串是否相等,我們可以根據情況自己重寫該方法。一般重寫都是自動生成,比較對象的成員變量值是否相同。
詳細解釋:https://www.cnblogs.com/qianguyihao/p/3929585.html
https://www.cnblogs.com/zhxhdean/archive/2011/03/26/1996468.html
3.兩個對象的 hashCode()相同,則 equals()也一定爲 true,對嗎?
答:不對,兩個對象的 hashCode()相同,equals()不一定 true。
詳細舉例解釋:https://blog.csdn.net/qq_35771266/article/details/91345052
4.final 在 Java 中有什麼作用?
答:final關鍵字的用法,可以修飾類,變量,方法,表示變量不可修改,類不可以繼承,方法不可覆蓋。
修飾類: 當一個類被final修飾的時候,表示該類爲最終類,不可被繼承,比如常用的String類就是最終類。
修飾方法:當一個方法被final修飾的時候,表示該方法爲最終方法,這個方法不可被子類重寫,但是可被子類繼承。
修飾變量: 如果該變量是基本數據類型,說明該變量爲一個常量,值不可修改。 如果變量爲引用數據類型,比如對象、數 組,則該對象、數組本身可以修改,但指向該對象或數組的地址的引用不能修改。
詳細解釋:https://www.cnblogs.com/chhyan-dream/p/10685878.html
https://www.cnblogs.com/tanshaoshenghao/p/10908771.html
5.Java 中的 Math.round(-1.5) 等於多少?
答: Math.round(-1.5)的返回值是-1。四捨五入的原理是在參數上加0.5然後做向下取整
6.String 屬於基礎的數據類型嗎?
答:不屬於。這裏只要考察Java的基本數據類型有哪些。
Java 8種基本數據類型都有: byte char int double short long boolean float
7..java 中操作字符串都有哪些類?它們之間有什麼區別?
答:Java操作字符串的類我知道的有三個,String StringBuffer StringBuilder。這三種都是通過char[]保存的字符串,
String :String修飾的是不可變的字符串,對String修飾的變量修改時相當於重新創建一個對象。
StringBuffer: 常用來操作一個可變的字符串,拼接字符串的方法是append(), StringBuffer中的方法大多是用synchronized 關鍵字修飾,因而是線程安全的,更加適用於多線程的情況下。
StringBuilder: 常用來操作一個可變的字符串,拼接字符串的方法是append(),StringBuffer中的方法沒有用synchronized修 飾,因爲是線程不安全的,效率更高,更加適用於單線程的情況下。
8.String str="i"與 String str=new String(“i”)一樣嗎?
答: 不一樣。
String str="i" :是指將i在內存的地址指向str這個變量,如果此時有一個變量str2 的值爲i 此時str 和str2共用的是一塊內 存。
String str=new String("i") : 則是將new String("i");的對象地址賦給str2,需要注意的是這句話是新創建了一個對象。如果此 時 String str4= new String("i");那麼相當於又創建了一個新的對象,然後將對象的地址值賦給str4,雖然str2的 值和str4的值是相同的,但是他們依然不是同一個對象了。
9.如何將字符串反轉?
答: 可以使用StringBuffer StringBuilder 的reverse方法,還可以自己實現。
詳細解釋: 舉個例子,https://blog.csdn.net/meism5/article/details/89329699
10.String 類的常用方法都有那些?
答: equals() spilt() indexOf () charAt() length() replace() trim() getBytes() toLowerCase() toUpperCase() substring()
- equals() 主要用來判斷倆個字符串是否相等
- spilt() 主要是對字符串進行切割,返回字符串數組
- indexOf 主要是用來返回指定字符串的索引
- charAt() 根據指定字符得索引
- length() 主要是返回字符串的長度
- replace() 主要是用來字符串的替換
- trim() 去除字符串倆端的空白
- getBytes() 返回字符串的byte類型數組
- toLowerCase() 字符串轉小寫
- toUpperCase 字符串轉大寫
- substring 切割字符串
11.抽象類必須要有抽象方法嗎?
答:不必須。
通常情況下我們使用abstract去修飾一個抽象類。
抽象類的總結:
-
1. 抽象類不能被實例化(初學者很容易犯的錯),如果被實例化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以創建對象。
-
2. 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
-
3. 抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。
-
4. 構造方法,類方法(用 static 修飾的方法)不能聲明爲抽象方法。
-
5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。
抽象類需要注意的點:
- 1.如果一個類包含抽象方法,那麼該類必須是抽象類。
- 2.任何子類必須重寫父類的抽象方法,或者聲明自身爲抽象類
- 3.抽象類中可以不定義抽象方法,抽象方法目的僅僅爲了不讓該類創建對象。
- 4.抽象關鍵字abstract與 final , private , static 這三個關鍵字不共存。
12.普通類和抽象類有哪些區別?
答:
- 抽象類不能被實例化
- 抽象類可以有抽象方法,抽象方法只需申明,無需實現
- 含有抽象方法的類必須申明爲抽象類
- 抽象的子類必須實現抽象類中所有抽象方法,否則這個子類也是抽象類
- 抽象方法不能被聲明爲靜態
- 抽象方法不能用private修飾
- 抽象方法不能用final修飾
13.抽象類能使用 final 修飾嗎?
答:不能。
抽象類可被繼承,而被final修飾的話,說明該類不可修改,不可繼承。 這裏的讀者還可自行去看一下final關鍵字的用法。
14.接口和抽象類有什麼區別?
抽象類和接口的區別:
接口:1.接口使用interface修飾 2.接口不能實例化 3.Java 支持單繼承,即只能繼承一個類,但是可以實現多個接口。
4.接口中方法是抽象方法,不能實現
抽象類:1. 抽象類使用abstract修飾 2.接口中包含抽象方法和非抽象方法 3.抽象類不可以實例化。 4. 有抽象方法的類 一 定是抽象類,抽象方法中沒有具體實現。 5.如果一個子類實現了父類(抽象類)的所有抽象方法,那麼該子類 可以不必是抽象類,否則就是抽象類。
15.java 中 IO 流分爲幾種?
答:根據流的流向分爲輸入流和輸出流。 根據操作單元可以劃分爲字節流和字符流。根據流的角色可以分爲節點流和處理流。
- InputStream/Reader: 所有的輸入流的基類,前者是字節輸入流,後者是字符輸入流。
- OutputStream/Writer: 所有輸出流的基類,前者是字節輸出流,後者是字符輸出流。
按照操作方式可以分爲:
詳細解釋:https://blog.csdn.net/weixin_43643277/article/details/96282707
16.BIO、NIO、AIO 有什麼區別?
答:IO的方式通常分爲幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。
BIO: 在jdk1.4出現之前,我們建立網絡連接一般使用BIO,需要先在服務端啓動一個ServerSocket,然後在客戶端啓動Socket 來對服務端進行通信。我們使用BIO的時候往往會引入多線程,每個連接一個單獨的線程。BIO是一個連接一個線程。
BIO適用於適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4以前 的唯一選擇,但程序直觀簡單易理解。
NIO: NIO本身是基於事件驅動思想來完成的,其主要想解決的是BIO的大併發問題。NIO則是使用單線程或者只使用少量 的多線程,每個連接共用一個線程。NIO是一個請求一個線程。
NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜, JDK1.4開始支持
AIO : 異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去 啓動線程進行處理,
AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較復 雜,JDK7開始支持。
詳細地址: https://blog.csdn.net/skiof007/article/details/52873421
17.Files的常用方法都有哪些?
- Files.exists() 檢測文件路徑是否存在
- Files.createFile()創建文件
- Files.createDirectory()創建文件夾
- Files.delete() 刪除文件或者目錄
- Files.copy() 複製文件
- Files.move() 移動文件
- Files.size()查看文件個數
- Files.read() 讀取文件
- Files.write()寫入文件
後面慢慢補充。。