Java面試個人總結200多題(一)

聲明:
這是個人面試的總結,很多都是我自己百度的,答案只供大家參考。

一、Java 基礎
1.JDK 和 JRE 有什麼區別?
JDK 是java 開發工具包,jre是java運行環境,JDK 包含jre

2.== 和 equals 的區別是什麼?
==基本數據類型比較的是值。引用數據類型比較的是地址值是否相等。
equals比較的是對象是否相等

3.兩個對象的 hashCode()相同,則 equals()也一定爲 true,對嗎?
不一定。hashCode()相等即它的哈希值相等。哈希值相等它的鍵值不一定相等

4.final 在 java 中有什麼作用?
A。方法上,方法不能重寫
B。類上,類不能被繼承
C。變量,變量不能被修改

5.java 中的 Math.round(-1.5) 等於多少?
是-1. 如果Math.round(1.5)則是2

6.String 屬於基礎的數據類型嗎?
不屬於。
基本數據類型:
byte,char ,short,int,float,double,boolean,long

7.java 中操作字符串都有哪些類?它們之間有什麼區別?
String :字符串常量,不可變對象
StringBuffer:字符串變量,效率比StringBuild慢,線程安全的
StringBuild:字符串變量,效率高,線程不安全的

8.String str="i"與 String str=new String(“i”)一樣嗎?
不一樣,第一個分配到棧中,第二個分配到堆中

9.如何將字符串反轉?
reverse()

10.String 類的常用方法都有那些?
split()分割。
substring()截取
trim()去除字符串兩端空格
length()字符串長度
equals()
toUpperCase()轉換成大寫
toLowerCase()轉換成小寫
replace()字符串替換

11.抽象類必須要有抽象方法嗎?
不一定,但是有抽象方法的類一定是抽象類

12.普通類和抽象類有哪些區別?
A。普通類沒有抽象方法,可以直接實例
B。抽象類是子類繼承的模板,默認訪問級別爲public,不能直接實例,有抽象方法

13.抽象類能使用 final 修飾嗎?
不能,final修飾後不可以被繼承,抽象類是用來繼承的

14.接口和抽象類有什麼區別?
A。抽象類要被子類繼承,接口要被類實現
B。接口只能做方法聲明,抽象類中可以作方法聲明,也可以做方法實現
C。抽象類可以有具體的方法和屬性,接口只能有抽象方法和不可變常量。
D。接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
15.java 中 IO 流分爲幾種?
字符流:Reader , Writer
字節流: InputStream ,OutputStream
16.BIO、NIO、AIO 有什麼區別?
BIO:同步阻塞IO,屬於傳統IO,模型簡單使用方便,處理併發能力低
NIO:同步非阻塞,屬於BIO的升級,客戶端和服務器端通過通道通訊,實現多路複用
AIO:異步非阻塞,NIO的升級,實現了異步非阻塞IO,異步IO的操作基於事件和回調機制
17.Files的常用方法都有哪些?
Files.exists() 檢測文件路徑是否存在
Files.createFile()創建文件
Files.createDirectory()創建文件夾
Files.delete() 刪除文件或者目錄
Files.copy() 複製文件
Files.move() 移動文件
Files.size()查看文件個數
Files.read() 讀取文件
Files.write()寫入文件

二、容器
18.java 容器都有哪些?
數組,String,java.util下的集合容器

19.Collection 和 Collections 有什麼區別?
Collection是集合的父類。
Collections 是集合工具類,提供了一些方法操作集合,服務於Java的Collection框架。

java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是爲各種具體的集合提供了最大化的統一操作方式

20.List、Set、Map 之間的區別是什麼?
List:有序,可重複
Set:無序,不可重複
Map:無序,key/value方式存儲,key唯一,value可以重複

21.HashMap 和 Hashtable 有什麼區別?
HashMap:線程不安全,效率高,允許存放Null鍵值
HashTable:線程安全,效率低,不允許存放空鍵值

22.如何決定使用 HashMap 還是 TreeMap?
A。如果在Map中插入刪除和定位元素,選HashMap
B。如果想要對key進行有序的遍歷,使用TreeMap

23.說一下 HashMap 的實現原理?
hashMap是採用key/value進行存儲,通過hashCode和equals進行添加和檢索元素

HashMap 基於 Hash 算法實現,通過 put(key,value) 存儲,get(key) 來獲取 value
當傳入 key 時,HashMap 會根據 key,調用 hash(Object key) 方法,計算出 hash 值,根據 hash 值將 value 保存在 Node 對象裏,Node 對象保存在數組裏

HashMap 基於 Hash 算法實現,通過 put(key,value) 存儲,get(key) 來獲取 value
當傳入 key 時,HashMap 會根據 key,調用 hash(Object key) 方法,計算出 hash 值,根據 hash 值將 value 保存在 Node 對象裏,Node 對象保存在數組裏
當計算出的 hash 值相同時,稱之爲 hash 衝突,HashMap 的做法是用鏈表和紅黑樹存儲相同 hash 值的 value
當 hash 衝突的個數:小於等於 8 使用鏈表;大於 8 時,使用紅黑樹解決鏈表查詢慢的問題

24.說一下 HashSet 的實現原理?
底層是通過HashMap 實現的

25.ArrayList 和 LinkedList 的區別是什麼?
ArrayList:底層是數組結構,查詢快,增刪慢,線程不安全,效率高
LinkedList:底層是鏈表結構,增刪快,查詢慢

26.如何實現數組和 List 之間的轉換?
List轉數組通過toArray();
數組轉List通過 asList();

27.ArrayList 和 Vector 的區別是什麼?
ArrayList: 線程不安全,效率高,擴容是1.5倍
Vector:線程安全,效率低,擴容是2倍

28.Array 和 ArrayList 有何區別?
Array:指定長度,大小不可以變,存基礎數據類型和對象
ArrayList:大小可以改變,只存對象,提供add()等方法操作

29.在 Queue 中 poll()和 remove()有什麼區別?
poll取元素失敗返回 null;
remove取元素失敗報錯;

30.哪些集合類是線程安全的?
vector,hashtable,stack,concurrent類下的所有集合

31.迭代器 Iterator 是什麼?
Iterator 是可以遍歷集合的對象,爲各種容器提供了公共的操作接口,隔離對容器的遍歷操作和底層實現,從而解耦

32.Iterator 怎麼使用?有什麼特點?
33.Iterator 和 ListIterator 有什麼區別?
34.怎麼確保一個集合不能被修改?
可以使用 Collections. unmodifiableCollection(Collection c) 方法來創建一個只讀集合,這樣改變集合的任何操作都會拋出 Java. lang. UnsupportedOperationException 異常。

解決Hash衝突的方法?
開放定址法,再哈希法,鏈地址法,建立公共溢出區

jdk1.7和1.8的hashMap 有什麼區別?

1.數組+鏈表改成了數組+鏈表或紅黑樹;
  2.表的插入方式從頭插法改成了尾插法,簡單說就是插入時,如果數組位置上已經有元素,1.7將新元素放到數組中,原始節點作爲新節點的後繼節點,1.8遍歷鏈表,將元素放置到鏈表的最後;
  3.在插入時,1.7先判斷是否需要擴容,再插入,1.8先進行插入,插入完成再判斷是否需要擴容
  4.擴容的時候1.7需要對原數組中的元素進行重新hash定位在新數組的位置,1.8採用更簡單的判斷邏輯,位置不變或索引+舊容量大小;

區別
JDK1.7:
底層數據結構是數組+鏈表;
在JDK1.7中HashMap是以Entry數組來存儲數據;
用key的hashcode取模來決定Key會被放在數組裏的位置;
如果hashcode相同,或者hashcode取模結果相同,那麼這些Key會被定義到Entry數組的同一個格子裏,這些Key會形成一個鏈表;
新增節點採用頭插法;
插入數據之前擴容。
JDK1.8:
底層數據結構是數組+鏈表+紅黑樹結構(當鏈表長度大於8,轉爲紅黑樹);
在JDK1.8中HashMap是以Node數組來存儲數據;
Node可能是鏈表結構,也可能是紅黑樹結構,如果同一個格子裏的Key不超過8個,會用鏈表結構儲存
如果超過了8個,將鏈表轉換爲紅黑樹;
如果插入的key和hashcode相同,會被定義到node數組的格子裏
即使hashcode相同,由於紅黑樹的特點查找某個特定元素,只需要O(log n)的開銷,也就是說get/put的操作時間複雜度最差就只有o(log n);
新增節點採用尾插法,這也是爲什麼1.8不容易出現環型鏈表的原因;
插入數據成功之後擴容。

三、多線程
35.並行和併發有什麼區別?
並行是指兩個或多個事件,同一時刻發生。
併發是指兩個或多個事件,間隔發生;
並行是在多個實體上的多個事件,併發是在同一個實體上的多個事件;

1123.多線程的優缺點?
(1)多線程技術使程序的響應速度更快 ,因爲用戶界面可以在進行其它工作的同時一直處於活動狀態;
(2)佔用大量處理時間的任務使用多線程可以提高CPU利用率,即佔用大量處理時間的任務可以定期將處理器時間讓給其它任務;
(3)多線程可以分別設置優先級以優化性能。

多線程的主要缺點包括:
(1)等候使用共享資源時造成程序的運行速度變慢。這些共享資源主要是獨佔性的資源 ,如打印機等。
(2)對線程進行管理要求額外的 CPU開銷,線程的使用會給系統帶來上下文切換的額外負擔。
(3)線程的死鎖。即對共享資源加鎖實現同步的過程中可能會死鎖。
(4)對公有變量的同時讀或寫,可能對造成髒讀等;

36.線程和進程的區別?
線程:任務調度和執行的基本單位
進程:操作系統分配資源的最小單位
(1)調度:線程作爲調度和分配的基本單位,進程作爲擁有資源的基本單位

(2)併發性:不僅進程之間可以併發執行,同一個進程的多個線程之間也可併發執行

(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源.

(4)系統開銷:在創建或撤消進程時,由於系統都要爲之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷

37.守護線程是什麼?
是個服務線程

38.創建線程有哪幾種方式?
A。繼承Thread
B.實現runnable接口
C。實現callable

39.說一下 runnable 和 callable 有什麼區別?
1、callable的核心是call方法,允許返回值,runnable的核心是run方法,沒有返回值
2、call方法可以拋出異常,但是run方法不行
3、因爲runnable是java1.1就有了,所以他不存在返回值,後期在java1.5進行了優化,就出現了callable,就有了返回值和拋異常
4、callable和runnable都可以應用於executors。而thread類只支持runnable

40.線程有哪些狀態?
創建,準備就緒,運行,阻塞,死亡

41.sleep() 和 wait() 有什麼區別?
sleep()不會釋放鎖,wait()會釋放鎖

42.notify()和 notifyAll()有什麼區別?
notify()隨機喚醒一個線程,將一個線程放入鎖池。
notifyAll()喚醒所有線程,將所有線程放入鎖池

43.線程的 run()和 start()有什麼區別?
run()方法不會創建一個新線程,若直接調用,相當一個普通方法。
start()方法會創建一個新的線程,然後調用run方法

44.創建線程池有哪幾種方式?
A。newFixedThreadPool
B.newSingleThreadPool
B.newCacheThreadPoll
newScheduledThreadPool

45.線程池都有哪些狀態?
1.Running: 接受新task, 處理等待的task;
2.ShutDown: 不接受新task,但處理等待的task;
3.Stop: 不接受新task, 不處理等待的task, 嘗試打斷正在執行的task;
4.Tidying:但所有task都被終止, worCount == 0的時候(workCount是指有效的線程數);
5.Terminated: 執行完terminated()方法;

46.線程池中 submit()和 execute()方法有什麼區別?
execute() 參數 Runnable ;submit() 參數 (Runnable) 或 (Runnable 和 結果 T) 或 (Callable)
execute() 沒有返回值;而 submit() 有返回值
submit() 的返回值 Future 調用get方法時,可以捕獲處理異常

47.在 java 程序中怎麼保證多線程的運行安全?
JDK Atomic開頭的原子類、synchronized、LOCK,可以解決原子性問題
synchronized、volatile、LOCK,可以解決可見性問題
Happens-Before 規則可以解決有序性問題

48.多線程鎖的升級原理是什麼?
JVM優化synchronized的運行機制,當JVM檢測到不同的競爭狀態時,就會根據需要自動切換到合適的鎖,這種切換就是鎖的升級。升級是不可逆的,也就是說只能從低到高,也就是偏向–>輕量級–>重量級,不能夠降級

49.什麼是死鎖?
死鎖是指兩個或兩個以上的線程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去

50.怎麼防止死鎖?
A.死鎖檢測
B.加鎖順序
C。設置優先級
D。儘量降低鎖的使用粒度,儘量不要幾個功能用同一把鎖。

51.ThreadLocal 是什麼?有哪些使用場景?
52.說一下 synchronized 底層實現原理?
同步代碼塊是通過 monitorenter 和 monitorexit 指令獲取線程的執行權
同步方法通過加 ACC_SYNCHRONIZED 標識實現線程的執行權的控制

53.synchronized 和 volatile 的區別是什麼?
synchronized 可以作用於變量、方法、對象;volatile 只能作用於變量。
synchronized 可以保證線程間的有序性(猜測是無法保證線程內的有序性,即線程內的代碼可能被 CPU 指令重排序)、原子性和可見性;volatile 只保證了可見性和有序性,無法保證原子性。
synchronized 線程阻塞,volatile 線程不阻塞。

54.synchronized 和 Lock 有什麼區別?
A.性能不一樣:資源競爭激勵的情況下,lock性能會比synchronize好,競爭不激勵的情況下,synchronize比lock性能好,synchronize會根據鎖的競爭情況,從偏向鎖–>輕量級鎖–>重量級鎖升級,而且編程更簡單。
B.鎖機制不一樣:synchronize是在JVM層面實現的,系統會監控鎖的釋放與否。lock是JDK代碼實現的,需要手動釋放,在finally塊中釋放。可以採用非阻塞的方式獲取鎖。
C.Synchronized的編程更簡潔,lock的功能更多更靈活,缺點是一定要在finally裏面 unlock()資源纔行。
D.用法不一樣:synchronize可以用在代碼塊上,方法上。lock只能寫在代碼裏,不能直接修改方法。

55.synchronized 和 ReentrantLock 區別是什麼?
A。synchronized 競爭鎖時會一直等待;ReentrantLock 可以嘗試獲取鎖,並得到獲取結果
B。synchronized 獲取鎖無法設置超時;ReentrantLock 可以設置獲取鎖的超時時間
C。synchronized 無法實現公平鎖;ReentrantLock 可以滿足公平鎖,即先等待先獲取到鎖
D。synchronized 控制等待和喚醒需要結合加鎖對象的 wait() 和 notify()、notifyAll();ReentrantLock 控制等待和喚醒需要結合 Condition 的 await() 和 signal()、signalAll() 方法
E。synchronized 是 JVM 層面實現的;ReentrantLock 是 JDK 代碼層面實現
F。synchronized 在加鎖代碼塊執行完或者出現異常,自動釋放鎖;ReentrantLock 不會自動釋放鎖,需要在 finally{} 代碼塊顯示釋放

56.說一下 atomic 的原理?
57.什麼是悲觀鎖和樂觀鎖?
悲觀鎖:
總是假設最壞的情況,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完後再把資源轉讓給其它線程)。
樂觀鎖:
總是假設最好的情況,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。

四、反射
57.什麼是反射?
程序在運行狀態中對任意一個類,都可以知道這個類的屬性和方法。對任意一個對象,都能調用它的方法和屬性。

58.什麼是 java 序列化?什麼情況下需要序列化?
序列化:將 Java 對象轉換成字節流的過程。
反序列化:將字節流轉換成 Java 對象的過程。
當 Java 對象需要在網絡上傳輸 或者 持久化存儲到文件中時,就需要對 Java 對象進行序列化處理。
序列化的實現:類實現 Serializable 接口,這個接口沒有需要實現的方法。實現 Serializable 接口是爲了告訴 jvm 這個類的對象可以被序列化。

59.動態代理是什麼?有哪些應用?
動態代理:在運行時,創建目標類,可以調用和擴展目標類的方法。
應用場景如:
統計每個 api 的請求耗時
統一的日誌輸出
校驗被調用的 api 是否已經登錄和權限鑑定
Spring的 AOP 功能模塊就是採用動態代理的機制來實現切面編程

60.怎麼實現動態代理?
Java 中實現動態的方式:JDK 中的動態代理 和 Java類庫 CGLib

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