0085 java面試高頻問題彙總

Java基礎:

1.JDK 和 JRE 有什麼區別?

面向人羣不同:

JDK是面向開發人員的,包括java運行時環境(JRE)和一些基礎庫函數;JRE是面向java程序使用者的,即要運行java程序,就得用到JRE;

安裝不同:

如果安裝JDK,電腦有兩套JRE,一套位於 \jre ,另外一套位於 C:\Program Files\Java\j2re1.4.1_01 目錄下。

如果安裝JRE,會在 C:\Program Files\Java 目錄下安裝唯一的一套JRE。

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

對於基本類型和引用類型 == 的作用效果是不同的,如下所示:

基本類型:比較的是值是否相同;

引用類型:比較的是引用是否相同;

== 對於基本類型來說是值比較,對於引用類型來說是比較的是引用;而 equals 默認情況下是引用比較,只是很多類重寫了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

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

哈希值相等的兩個對象不一定相同,相同的對象哈希值一定相同。

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

修飾類,表示類不可被繼承;

修飾方法,表示方法不可被重寫;

修飾屬性,表示屬性不可修改,只能賦值一次。

5. Java 中的 Math. round(-1. 5) 等於多少?

round函數對正數是“四捨五入”,對負數是“五舍六入”。 Math. round(-1. 5)= -1

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

不屬於。String是一個對象。

java中基本類型只有8個:

字符類型:byte,char

基本整型:short,int,long

浮點型:float,double

布爾類型:boolean

void 有爭議。

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

三者本質都是char[]

String:不可變字符串,有final修飾返回值,可爲空值;

StringBuffer:可變字符串、效率低、線程安全

StringBuilder:可變字符序列、效率高、線程不安全;

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

不一樣;

①是放入常量池,只有唯一的i,再賦給其他對象,也都是公用一個i;②是在對象,放在堆內存

9. 如何將字符串反轉?

  1. 單個字符逆序拼接
  2. StringBuffer自帶的反轉方法
  3. 遞歸

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

indexOf() 返回指定字符得索引
charAt() 返回指定索引處的字符
repalce() 字符串替換
trim() 去除字符串兩端的空白
split() 分割字符串 返回分割後的字符串數組
getBytes() 返回字符串的byte類型數組
length() 返回字符串的長度
toLowerCase() 字符串轉小寫
toUpperCase() 字符串轉大寫
substring() 截取字符串
equals() 字符串比較

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

不一定。如抽象類:

abstract class Cat {
    public static void sayHello() {
        System.out.println("miao~");
    }
}

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

普通類可實例化對象,抽象類不行;普通類不能含有抽象的方法

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

不能,抽象類適用於被繼承的,final表示類不可被繼承。

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

1、接口中的方法都不能實現,抽象類中方法可實現部分方法;

2、接口可以多繼承,抽象類只能單繼承;

3、接口中的基本數據類型爲static,抽象類不是。

接口的功能是實現“協議”,“協議”要求屬性公共、靜態、最終常量,因此屬性要設置爲public static final;

抽象類是接口和普通類之間的過渡層,其目的是實現既滿足接口的抽象,又滿足具體的實現,因此可實現一些公共的方法。

版本2:

  • 實現:抽象類的子類使用 extends 來繼承;接口必須使用 implements 來實現接口。
  • 構造函數:抽象類可以有構造函數;接口不能有。
  • 實現數量:類可以實現很多個接口;但是隻能繼承一個抽象類。
  • 訪問修飾符:接口中的方法默認使用 public 修飾;抽象類中的方法可以是任意訪問修飾符。

15. Java 中 IO 流分爲幾種?

1、按照數據流向分爲:輸入流、輸出流

2、按照數據類型分爲:字節流、字符流

字節流和字符流的區別是:字節流按 8 位傳輸,字符流按 16 位傳輸。1字節=8bit,1字符=16bit。

3、按照流數據的包裝過程分爲:節點流(低級流)、處理流(高級流)

輸入流 輸出流
字符流 Reader Writer
字節流 InputStream OutputStream

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

IO的方式通常分爲:

1.同步阻塞的BIO(Blocking I/O): 數據的讀寫必須阻塞在一個線程內等待其完成,對於連接數小於單機1000的情況下,可使用;

2.同步非阻塞的NIO(New I/O):N可以是non-blocking,它支持面向緩衝的,基於通道的I/O操作方法,在java.nio包中提供了Selector、Channel、Buffer等抽象,主要爲了解決BIO的高併發問題。

BIO與NIO一個比較重要的不同,是我們使用BIO的時候往往會引入多線程,每個連接一個單獨的線程;而NIO則是使用單線程或者只使用少量的多線程,每個連接共用一個線程

3.異步非阻塞的AIO(Asynchronous I/O): 也叫NIO 2,其區別是當一個連接創建後,不需要對應一個線程,這個連接會被註冊到多路複用器上面,所以所有的連接只需要一個線程就可以搞定

適用場景分析

  • BIO方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。
  • NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。
  • AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,JDK7開始支持。
  1. Files的常用方法都有哪些?

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

答案,請移步:

動力節點:面試題|Java基礎17道常見面試題zhuanlan.zhihu.com圖標


Java容器

18. Java 容器都有哪些?

collection,List,Map,ArrayList,LinkedList,HashMap,Hashtable,WeakHashMap鍵和值都可以是null),TreeMap,Set,HashSet,TreeSort,Vector,Stack

19. Collection 和 Collections 有什麼區別?

collection是java的集合接口,爲各種具體的集合提供最大化的統一操作方式,List,Set,Queue接口都繼承Collection;

Collections是一個服務於collection的工具類,如集合的搜索、排序,線程安全等

20. List、Set、Map 之間的區別是什麼?

List、Set、Map 的區別主要體現在兩個方面:元素是否有序、是否允許元素重複

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dFbRnU9S-1587776921893)(C:\Users\gendl\Desktop\blog\集合類的區別.jpg)]

21. HashMap 和 Hashtable 有什麼區別?

HashMap Hashtable
鍵可爲null 鍵不可爲null
線程不安全 線程安全
性能更好 性能不及hashmap
擴容2倍,且2的冪次個 擴容2n+1
衝突:1.8:衝突位置元素小於8鏈表 衝突:都是鏈表的形式
>=8且數組大於64,紅黑樹,小於6鏈表 ;1.7: 都是鏈表
containsValue,ContainsKey contains等效containsKey,containsValue
繼承AbstractMap 繼承自Dictionary(已棄用)

hashmap的哈希值計算:

static final int hash(Object key) {     
  int h;      
  return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);   

 }

​ hashtable的哈希計算:

int index = (hash & 0x7FFFFFFF) % tab.length;

22.如何決定使用 HashMap 還是 TreeMap?

HashMap的key值實現hashcode(),是散列均勻分佈的,不支持排序,主要結構爲桶(數組),鏈表或紅黑樹;TreeMap的key是實現java.lang.Comparable,因此key是默認升序排列的,基於紅黑樹實現。

HashMap查詢速度快O(1),TreeMap增加元素和快速創建的時候效率更高。

23. 說一下 HashMap 的實現原理?

hashmap是一種元素爲鏈表或紅黑樹的數組,元素以Entry封裝鍵值對。數組的默認長度爲16,負載因子爲0.75,當數組使用率達到75%,對當前數組長度進行2倍擴容,且總長度爲2^n(爲了使得哈希值的均勻分佈);通過h = key.hashCode()) ^ (h >>> 16)計算元素的存儲位置,當發生哈希衝突時,首先判斷key值是否一樣,如果一樣,則覆蓋原有內容,若不一樣,通過“鏈式分離”解決,即新加入的元素加入到鏈表的頭部(next指針的final屬性決定的),生成一條鏈。取8的原因是:其一,當負載因子爲0.75時,每個位置衝突元素到達8個的概率爲千萬分之一;其二,紅黑樹的查找速度爲log(n),在元素大於8個時,查找速度更快。數組某位置衝突元素當>=8,鏈表轉換成紅黑樹;<6,紅黑樹轉鏈表,中間留有一個過渡狀態7,當爲7的時候,如果是從小於7增到7,則7爲鏈表;如果是從大於7減小到7,則7爲紅黑樹,其好處是:可以避免頻繁增加刪除造成頻繁鏈表與樹的轉換

24. 說一下 HashSet 的實現原理?

HashSet是實現set接口,但底層實際是一個HashMap,將HashSet的value作爲HashMap的key,而HashMap的value爲一個static final的空對象( private static final Object PRESENT = new Object();)。由於HashMap在添加元素時會對key是否重複進行檢查,因此HashSet通過判斷key是否存在,存在就不添加,不存在就添加。

24-1 哈希衝突的四種解決方法

1, 開放定址法:
所謂的開放定址法就是一旦發生了衝突,就去尋找下一個空的散列地址,只要散列表足夠大,空的散列地址總能找到,並將記錄存入
公式爲:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1)
※ 用開放定址法解決衝突的做法是:當衝突發生時,使用某種探測技術在散列表中形成一個探測序列。沿此序列逐個單元地查找,直到找到給定的關鍵字,或者
碰到一個開放的地址(即該地址單元爲空)爲止(若要插入,在探查到開放的地址,則可將待插入的新結點存人該地址單元)。查找時探測到開放的地址則表明表
中無待查的關鍵字,即查找失敗。
比如說,我們的關鍵字集合爲{12,67,56,16,25,37,22,29,15,47,48,34},表長爲12。 我們用
散列函數
f(key) = key mod l2
當計算前S個數{12,67,56,16,25}時,都是沒有衝突的散列地址,直接存入:

這裏寫圖片描述
計算key = 37時,發現f(37) = 1,此時就與25所在的位置衝突。
於是我們應用上面的公式f(37) = (f(37)+1) mod 12 = 2。於是將37存入下標爲2的位置:
這裏寫圖片描述

2, 再哈希法:
再哈希法又叫雙哈希法,有多個不同的Hash函數,當發生衝突時,使用第二個,第三個,….,等哈希函數
計算地址,直到無衝突。雖然不易發生聚集,但是增加了計算時間。

3, 鏈地址法:
鏈地址法的基本思想是:每個哈希表節點都有一個next指針,多個哈希表節點可以用next指針構成一個單向鏈表,被分配到同一個索引上的多個節點可以用這個單向 鏈表連接起來,如:
鍵值對k2, v2與鍵值對k1, v1通過計算後的索引值都爲2,這時及產生衝突,但是可以通道next指針將k2, k1所在的節點連接起來,這樣就解決了哈希的衝突問題

4, 建立公共溢出區:
這種方法的基本思想是:將哈希表分爲基本表和溢出表兩部分,凡是和基本表發生衝突的元素,一律填入溢出表

25. ArrayList 和 LinkedList 的區別是什麼?

1、ArrayList是動態數組(長度可變)、LinkedList是雙向鏈表

2、ArrayList內存中爲連續的地址,且當元素達到閾值(數組長度)需要擴容——1.5倍方式;LinkedList的元素分散在內存中,不需要擴容;

3、ArrayList的讀取效率更高;LinkedList的插入和刪除效率更高;

26. 如何實現數組和 List 之間的轉換?

1、數組=>List:Arrays.asList()

2、List=> 數組:List自帶的**toArray()**方法,返回是Object[],需進行轉換

27. ArrayList 和 Vector 的區別是什麼?

1、ArrayList線程不安全,Vector線程安全;

2、ArrayList的性能更好;

3、擴容:ArrayList以1.5倍方式,Vector以2倍的方式。

28. Array 和 ArrayList 有何區別?

1、Array是固定大小的數組,ArrayList是可擴展的數組;

2、Array可以存儲基本類型和對象,ArrayList只能存儲對象;

29. 在 Queue 中 poll()和 remove()有什麼區別?

poll()先獲得元素,然後再刪除;remove()是直接刪除元素;

Queue接口的實現類常用的爲LinkedList類。

30. 哪些集合類是線程安全的?

Hashtable、vector、stack是線程安全的;JDK1.5之後,引入java.util.concurrent併發包,集合具有自己的線程安全類。

31. 迭代器 Iterator 是什麼?

Iterator是對 Collection 進行迭代的類。迭代器允許調用者在迭代過程中移除元素。

32. Iterator 怎麼使用?有什麼特點?

Iterator 的特點是更加安全,因爲它可以確保,在當前遍歷的集合元素被更改的時候,就會拋出 ConcurrentModificationException 異常。

使用方法:

List<String> list = new ArrayList<>();
Iterator<String> it = list. iterator();
while(it. hasNext()){
  String obj = it. next();
  System. out. println(obj);
}

33. Iterator 和 ListIterator 有什麼區別?

1、ListIterator 繼承自Iterator,添加了更多的方法;

2、Iterator 只能單向遍歷,ListIterator 可以雙向遍歷;

3、ListIterator 只能遍歷List,Iterator 可以遍歷Set、List。

34. 怎麼確保一個集合不能被修改?

可以用Collections的方法使得集合爲只能可讀,修改會報錯。具體實現方式:

List<String> list = new ArrayList<>();
list. add("x");
Collection<String> clist = Collections. unmodifiableCollection(list);
clist. add("y"); // 運行時此行報錯
System. out. println(list. size());

答案,請移步:

動力節點:面試題|不得不看的17道Java容器面試題zhuanlan.zhihu.com圖標


Java多線程

35. 並行和併發有什麼區別?

並行:並行是在不同實體上的多個事件;

併發:併發是在同一實體上的多個事件。

併發 = 兩個隊列和一臺咖啡機。

並行 = 兩個隊列和兩臺咖啡機。

36. 線程和進程的區別?

1、性質不同:線程是CPU進行資源分配和調度的基本單位,包含於進程,是進程的實際運作單位;進程是程序在某個數據集上的一次運行活動;一個進程崩潰後,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。

2、地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間;

3、資源擁有:同一進程內的線程共享本進程的資源如內存、I/O、cpu等,但是進程之間的資源是獨立的

4、進程切換時,消耗的資源大

5、每個獨立的進程程有一個程序運行的入口、順序執行序列和程序入口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

37. 守護線程是什麼?

守護線程是運行在後臺的一種特殊進程。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。在 Java 中垃圾回收線程就是特殊的守護線程。

38. 創建線程有哪幾種方式?

三種

1、繼承Thread類,重寫run()方法;

2、實現runnable接口,實現run()方法; 常推薦的方式

3、實現callable接口,實現call()方法。利用到future類,future類用來包裝一個未知是否完成的進程的返回結果,若完成則用get方法獲取,未完成則會等待其完成。

4、使用線程池例如用Executor框架

39. 說一下 runnable 和 callable 有什麼區別?

runnable 沒有返回值,callable 可以拿到有返回值,callable 可以看作是 runnable 的補充。

40. 線程有哪些狀態?

  • NEW 尚未啓動
  • RUNNABLE 正在執行中
  • BLOCKED 阻塞的(被同步鎖或者IO鎖阻塞)
  • WAITING 永久等待狀態
  • TIMED_WAITING 等待指定的時間重新被喚醒的狀態
  • TERMINATED 執行完成

42. sleep() 和 wait() 有什麼區別?

  • 類的不同:sleep() 來自 Thread,wait() 來自 Object。
  • 釋放鎖:sleep() 不釋放鎖;wait() 釋放鎖。
  • 用法不同:sleep() 時間到會自動恢復;wait() 可以使用 notify()/notifyAll()直接喚醒。

43. notify()和 notifyAll()有什麼區別?

notifyAll()會喚醒所有的線程,notify()之後喚醒一個線程。notifyAll() 調用後,會將全部線程由等待池移到鎖池,然後參與鎖的競爭,競爭成功則繼續執行,如果不成功則留在鎖池等待鎖被釋放後再次參與競爭。而 notify()只會喚醒一個線程,具體喚醒哪一個線程由虛擬機控制

44. 線程的 run() 和 start() 有什麼區別?

start() 方法用於啓動線程,run() 方法用於執行線程的運行時代碼。run() 可以重複調用,而 start() 只能調用一次。

45. 創建線程池有哪幾種方式?

七種

1、newFixedThreadPool:創建固定長度的線程池;

2、newSingleThreadExcutor: 創建單線程線程池資源;

3、newCachedThreadPool: 創建可緩存的線程池;

4、newSchelduledPool:創建定時的工作調度線程池;

5、ThreadPoolExecutor:是最原始的線程池創建

6、newWorkStealingPool(int parallelism):這是一個經常被人忽略的線程池,Java 8 才加入這個創建方法,其內部會構建ForkJoinPool,利用Work-Stealing算法,並行地處理任務,不保證處理順序;

7、newSingleThreadScheduledExecutor():創建單線程池,返回 ScheduledExecutorService,可以進行定時或週期性的工作調度;

46. 線程池都有哪些狀態?

  • RUNNING:這是最正常的狀態,接受新的任務,處理等待隊列中的任務。
  • SHUTDOWN:不接受新的任務提交,但是會繼續處理等待隊列中的任務。
  • STOP:不接受新的任務提交,不再處理等待隊列中的任務,中斷正在執行任務的線程。
  • TIDYING:所有的任務都銷燬了,workCount 爲 0,線程池的狀態在轉換爲 TIDYING 狀態時,會執行鉤子方法 terminated()。
  • TERMINATED:terminated()方法結束後,線程池的狀態就會變成這個。

47. 線程池中 submit() 和 execute() 方法有什麼區別?

1、submit()可執行Runnable和Callable類型的任務;execute()只能執行Runnable類型任務;

2、submit()可以獲取返回值(Future),可處理Exception;execute()則不行。

3、接受的參數不一樣;

48. 在 Java 程序中怎麼保證多線程的運行安全?

方法1:使用安全類,如java.util.concurrent下的類;

方法2:使用自動鎖sychronized;

方法3:使用手動鎖Lock。

49. 多線程中 synchronized 鎖升級的原理是什麼?

鎖的升級的目的:鎖升級是爲了減低了鎖帶來的性能消耗。在 Java 6 之後優化 synchronized 的實現方式,使用了偏向鎖升級爲輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。

synchronized 鎖升級原理:在鎖對象的對象頭裏面有一個 threadid 字段,在第一次訪問的時候 threadid 爲空,jvm 讓其持有偏向鎖,並將 threadid 設置爲其線程 id,再次進入的時候會先判斷 threadid 是否與其線程 id 一致,如果一致則可以直接使用此對象,如果不一致,則升級偏向鎖爲輕量級鎖,通過自旋循環一定次數來獲取鎖,執行一定次數之後,如果還沒有正常獲取到要使用的對象,此時就會把鎖從輕量級升級爲重量級鎖,此過程就構成了 synchronized 鎖的升級。

50. 什麼是死鎖?

線程A持有獨佔鎖a,並嘗試去獲得獨佔鎖b,同時線程B持有獨佔鎖b,嘗試去獲得獨佔鎖a,這樣AB線程由於互相持有對方需要的鎖,就發生了阻塞現象,稱之爲死鎖。

51. 怎麼防止死鎖?

1、儘量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設置超時時間,超時可以退出防止死鎖。

2、儘量使用 Java. util. concurrent 併發類代替自己手寫鎖。

3、儘量降低鎖的使用粒度,儘量不要幾個功能用同一把鎖

4、儘量減少同步的代碼塊

52. ThreadLocal 是什麼?有哪些使用場景?

ThreadLocal 爲每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本而不會影響其它線程所對應的副本

ThreadLocal 的經典使用場景是數據庫連接session 管理等

53. 說一下 synchronized 底層實現原理?

Synchronized是通過對象內部的一個叫做監視器鎖(monitor)的monitorenter/monitorexit 指令來實現的,監視器鎖本質又是依賴於底層的操作系統的Mutex Lock(互斥鎖)來實現的。

synchronized 爲啥效率低?因爲操作系統底層線程切換成本高(用戶態-》核心態)高,因此爲“重量鎖”。

synchronized作用

原子性:synchronized保證語句塊內操作是原子的
可見性:synchronized保證可見性(通過“在執行unlock之前,必須先把此變量同步回主內存”實現)
有序性:synchronized保證有序性(通過“一個變量在同一時刻只允許一條線程對其進行lock操作”)

54. synchronized 和 volatile 的區別是什麼?

  • volatile 是變量修飾符;synchronized 是修飾類、方法、代碼段。
  • volatile 僅能實現變量的修改可見性,不能保證原子性;而 synchronized 則可以保證變量的修改可見性和原子性。
  • volatile 不會造成線程的阻塞;synchronized 可能會造成線程的阻塞。

55. synchronized 和 Lock 有什麼區別?

  • synchronized 可以給類、方法、代碼塊加鎖;而 lock 只能給代碼塊加鎖
  • synchronized 不需要手動獲取鎖和釋放鎖,使用簡單,發生異常會自動釋放鎖,不會造成死鎖;而 lock 需要自己加鎖和釋放鎖,如果使用不當沒有 unLock()去釋放鎖就會造成死鎖。
  • 通過 Lock 可以知道有沒有成功獲取鎖,而 synchronized 卻無法辦到。

56. synchronized 和 ReentrantLock 區別是什麼?

  • ReentrantLock 使用起來比較靈活,但是必須有釋放鎖的配合動作;
  • ReentrantLock 必須手動獲取與釋放鎖,而 synchronized 不需要手動釋放和開啓鎖;
  • ReentrantLock 只適用於代碼塊鎖,而 synchronized 可用於修飾方法、代碼塊等。

57. 說一下 atomic 的原理?

atomic 主要利用 CAS (Compare And Swap) 和 volatile 和 native 方法來保證原子操作,從而避免 synchronized 的高開銷,執行效率大爲提升。

答案,請移步:

動力節點:Java面試題|多線程22道必看面試題zhuanlan.zhihu.com圖標


Java反射

58. 什麼是反射?

反射是指程序可以訪問、檢測和修改它本身狀態的或行爲的一種能力。

在java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法;對於任意一個對象,能否調用它的任一方法。

java反射機制主要提供以下功能:

1、在運行時判斷一個對象所屬的類‘

2、在運行時構造任意一個類的對象;

3、在運行時判斷一個類所具有的的成員變量和方法

4、在運行時調用任意一個對象的方法

59. 什麼是 Java 序列化?什麼情況下需要序列化?

Java序列化是指將對象轉化爲字節碼,可用於存儲和傳輸;

序列化的場景:類對象需要保存;類對象需要網絡傳輸;遠程方法調用(RMI)傳輸對象的時候;

注意事項:

1、父類可以被序列化,子類就可以被序列化

2、聲明爲 static和 transient的成員變量不能被序列化,因爲只有堆內存會被序列化,所以靜態變量會天生不會被序列化。

3、反序列化讀取序列化的順序要一致

60. 動態代理是什麼?應用場景?

動態代理:在運行時,可以創建目標類、可以調用和擴展目標類的方法;

java中實現動態代理的方法:JDK中動態代理 、 java類庫CGLib

應用場景

1、統計每個API的請求耗時;

2、統一的日誌輸出

3、校驗被調用的API是否已登錄和權限鑑定

4、Spring AOP模塊就是採用動態代理實現切面編程

61. 怎麼實現動態代理?

動態代理的兩種方式:①利用JDK中的反射機制生成代理(需提供接口)②利用CGLIB代理(直接代理類)

答案,請移步:

動力節點:Java面試題|反射必看的4道面試題zhuanlan.zhihu.com圖標


對象拷貝

62. 爲什麼要使用克隆?

因爲克隆的對象可能已經包含修改過的屬性,而new的對象屬性還是初始時候的值;當需要保存當前對象的“狀態”時,就需要克隆。

63. 如何實現對象克隆?

1、實現Cloneable接口,且重寫Object的clone()方法;

2、實現Serializable接口,通過對象的序列化反序列化,實現真正的深度克隆;

64. 深拷貝和淺拷貝區別是什麼?

淺克隆:當對象被複制時只複製它本身和其中包含的值類型的成員變量,而引用類型的成員對象並沒有複製

深克隆:除了對象本身被複制外,對象所包含的所有成員變量也將複製。

答案,請移步:

動力節點:Java面試題|關於對象拷貝的三道面試題zhuanlan.zhihu.com圖標


javaweb

​ 65. JSP 和 servlet 有什麼區別?各自特點是什麼?

​ 66. JSP 有哪些內置對象?作用分別是什麼?

​ 67. 說一下 JSP 的 4 種作用域?

​ 68. session 和 cookie 有什麼區別?

​ 69. 說一下 session 的工作原理?

​ 70. 假定載客戶端禁止 cookie下session如何使用?session與cookie的區別是什麼?

​ 71. spring mvc 和 struts 的區別是什麼?

​ 72. 如何避免 SQL 注入?

​ 73. 什麼是 XSS 攻擊,如何避免?

​ 74. 什麼是 CSRF 攻擊,如何避免?

答案,請移步:

動力節點:Java面試題|Javaweb不得不看的10道面試題zhuanlan.zhihu.com圖標


Java異常

​ 75. throw 和 throws 的區別?

​ 76. final、finally、finalize 有什麼區別?

​ 77. try-catch-finally 中哪個部分可以省

​ 78. try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?

​ 79. 常見的異常類有哪些?

答案,請移步:

動力節點:Java面試題|Java異常不得不看的5道面試題zhuanlan.zhihu.com圖標


Java網絡編程

​ 80. http 響應碼 301 和 302 代表的是什麼?有什麼區別?

​ 81. forward 和 redirect 的區別?

​ 82. 簡述 tcp 和 udp的區別?

​ 83. tcp 爲什麼要三次握手,兩次不行嗎?爲什麼?

​ 84. 說一下 tcp 粘包是怎麼產生的?

​ 85. OSI 的七層模型都有哪些?

​ 86. get 和 post 請求有哪些區別?

​ 87. 如何實現跨域請求?

​ 88. 說一下 JSONP 實現原理?

答案,請移步:

動力節點:Java面試題|Java網絡編程9道必看面試題zhuanlan.zhihu.com圖標

Java設計模式

89. 請列舉出在JDK中幾個常用的設計模式?

  • 單例模式:保證被創建一次,節省系統開銷。
  • 工廠模式(簡單工廠、抽象工廠):解耦代碼。
  • 觀察者模式:定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,它的所有的依賴者都會收到通知並自動更新。
  • 外觀模式:提供一個統一的接口,用來訪問子系統中的一羣接口,外觀定義了一個高層的接口,讓子系統更容易使用。
  • 模版方法模式:定義了一個算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變算法結構的情況下,重新定義算法的步驟。
  • 狀態模式:允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它的類。
  • 裝飾器設計模式:(Decorator design pattern)被用於多個 Java IO 類中。

90. 什麼是設計模式?你是否在你的代碼裏面使用過任何設計模式?

設計模式是解決特定設計問題的嘗試和測試的方法。設計模式是代碼可用性的延伸

91. Java 中什麼叫單例設計模式?請用Java 寫出線程安全的單例模式

單例模式重點在於在整個系統上共享一些創建時較耗資源的對象。整個應用中只維護一個特定類實例,它被所有組件共同使用。Java.lang.Runtime是單例模式的經典例子。從 Java 5 開始你可以使用枚舉(enum)來實現線程安全的單例。

92. 在 Java 中,什麼叫觀察者設計模式(observer design pattern)?

觀察者模式是基於對象的狀態變化和觀察者的通訊,以便他們作出相應的操作。簡單的例子就是一個天氣系統,當天氣變化時必須在展示給公衆的視圖中進行反映。這個視圖對象是一個主體,而不同的視圖是觀察者。

93. 使用工廠模式最主要的好處是什麼?在哪裏使用?

​ 94. 舉一個用 Java 實現的裝飾模式(decorator design pattern)?它是作用於對象層次還是類層次?

​ 95. ava 編程爲什麼不允許從靜態方法中訪問非靜態變量?

​ 96. 如果需要設計一個 ATM 機,你的設計思路是什麼?

​ 97. 在 Java語言 中,什麼時候用重載,什麼時候用重寫?

​ 98. 請舉例說明什麼情況下會更傾向於使用抽象類而不是接口?

​ 99. 簡單工廠和抽象工廠有什麼區別?

答案,請點擊鏈接:

動力節點:Java面試題|Java設計模式11道常見面試題zhuanlan.zhihu.com圖標


更新:

Spring

100.爲什麼要使用 spring?

1、方便解耦,便於開發;

2、支持AOP編程

3、支持聲明式事務

4、方便集成優秀的框架;方便測試(支持junit4)

5、降低javaEE API使用難度

101.解釋一下什麼是 Aop?

​ 102.解釋一下什麼是 ioc?

​ 103. spring 有哪些主要模塊?

​ 104. spring 常用的注入方式有哪些?

​ 105. spring 中的 bean 是線程安全的嗎?

​ 106. spring 支持幾種 bean 的作用域?

​ 107. spring 自動裝配 bean 有哪些方式?

​ 108. spring 事務實現方式有哪些?

​ 109. 說一下 spring 的事務隔離?

答案,請點擊鏈接:

動力節點:框架系列|Spring10道常見面試題!zhuanlan.zhihu.com圖標

Spring MVC

​ 110. 說一下 spring mvc 運行流程?

​ 111. spring mvc 有哪些組件?

​ 112. @RequestMapping 的作用是什麼?

​ 113. @Autowired 的作用是什麼?

答案,請點擊鏈接:

動力節點:框架系列|SpringMVC 4道必看面試題!zhuanlan.zhihu.com圖標

SpringBoot

​ 114. 什麼是 SpringBoot?

​ 115. 爲什麼要用SpringBoot?

​ 116. SpringBoot核心配置文件是什麼?

​ 117. SpringBoot配置文件有哪幾種類型?它們有什麼區別?

​ 118. spring boot 有哪些方式可以實現熱部署?

​ 119. jpa 和 hibernate 有什麼區別?

答案,請點擊鏈接:

動力節點:框架系列|SpringBoot 6道必看面試題!zhuanlan.zhihu.com圖標

Spring Cloud

​ 120. 什麼是 spring cloud?

​ 121. spring cloud 斷路器的作用是什麼?

​ 122. spring cloud 的核心組件有哪些?

答案,請點擊鏈接:

動力節點:框架系列|Spring Cloud 3道必看面試題!zhuanlan.zhihu.com圖標

Hibernate

​ 123. 爲什麼要使用 hibernate?

​ 124. 什麼是 ORM 框架?

​ 125. hibernate 中如何在控制檯查看打印的 SQL 語句?

​ 126. hibernate 有幾種查詢方式?

​ 127. hibernate 實體類可以被定義爲 final 嗎?

​ 128. hibernate裏實體類用int和Integer區別

​ 129. hibernate 是如何工作的?

​ 130. get()和 load()的區別?

​ 131. 說一下 hibernate 的緩存機制?

​ 132. hibernate 對象有哪些狀態?

​ 133. 在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?

​ 134. hibernate 實體類必須要有無參構造函數嗎?爲什麼?

答案,請點擊鏈接:

動力節點:框架系列|Hibernate12道必看面試題zhuanlan.zhihu.com圖標

MyBatis

​ 135. MyBatis 中 #{}和 ${}的區別是什麼?

​ 136. MyBatis 有幾種分頁方式?

​ 137. RowBounds 是一次性查詢全部結果嗎?爲什麼?

​ 138. MyBatis 邏輯分頁和物理分頁的區別是什麼?

​ 139. MyBatis 是否支持延遲加載?延遲加載的原理是什麼?

​ 140. 說一下 MyBatis 的一級緩存和二級緩存?

​ 141. MyBatis 和 hibernate 的區別有哪些?

​ 142. MyBatis 有哪些執行器(Executor)?

​ 143. MyBatis 分頁插件的實現原理是什麼?

​ 144. MyBatis 如何編寫一個自定義插件?

答案,請點擊鏈接:

動力節點:框架系列|MyBatis 10道必看面試題zhuanlan.zhihu.com圖標

RabbitMQ

​ 145. RabbitMQ 的使用場景有哪些?

​ 146. RabbitMQ 有哪些重要的角色?

​ 147. RabbitMQ 有哪些重要的組件?

​ 148. RabbitMQ 中 vhost 的作用是什麼?

​ 149. RabbitMQ 的消息是怎麼發送的?

​ 150. RabbitMQ 怎麼保證消息的穩定性?

​ 151. RabbitMQ 怎麼避免消息丟失?

​ 152. 要保證消息持久化成功的條件有哪些?

​ 153. RabbitMQ 持久化有什麼缺點?

​ 154. RabbitMQ 有幾種廣播類型?

​ 155. RabbitMQ 怎麼實現延遲消息隊列?

​ 156. RabbitMQ 集羣有什麼用?

​ 157. RabbitMQ 節點的類型有哪些?

​ 158. RabbitMQ 集羣搭建需要注意哪些問題?

​ 159. RabbitMQ 每個節點是其他節點的完整拷貝嗎?爲什麼?

​ 160. RabbitMQ 集羣中唯一一個磁盤節點崩潰了會發生什麼情況?

​ 161. RabbitMQ 對集羣節點停止順序有要求嗎?

答案,請點擊鏈接:

動力節點:框架系列|中間件RabbitMQ必看17道面試題zhuanlan.zhihu.com圖標

Kafka

162. kafka 可以脫離 zookeeper 單獨使用嗎?爲什麼?

kafka不能脫離zookeeper單獨使用,因爲需要zookeeper來協調和管理kafka的節點服務器

163. kafka 有幾種數據保留的策略?

四種:

1、指定分區號,將數據放到指定分區上;

2、沒有分區號,給定數據的key值,通過key的hashCode確定分區;

3、沒有分區號,沒有key,按照輪詢的方式進行分區;

4、自定義分區

方式分別如下:

producer.send(new ProducerRecord<String, String>("test", Integer.toString(i), Integer.toString(i)));
//kafka的第一種分區方式,如果給定了分區號,那麼就直接將數據發送到指定的分區號裏面去
producer.send(new ProducerRecord<String, String>("test",2,"helloworld",i+""));
//kafka的第二種分區策略,沒有給定分區號,給定了數據的key,那麼就通過key取hashcode,將數據均勻的發送到三臺機器裏面去
//注意如果實際工作當中,要通過key取上hashcode來進行分區,那麼就一定要 保證key的變化,否則,數據就會全部去往一個分區裏面
producer.send(new ProducerRecord<String, String>("test",i+"",i+""));
//kafka的第三種分區策略,既沒有給定分區號,也沒有給定數據的key值,那麼就會按照輪循的方式進行數的發送
producer.send(new ProducerRecord<String, String>("test",i+""));
//kafka的第四種分區策略,自定義分區類,實現我們數據的分區

164. kafka 同時設置了 7天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?

清空數據。不管是時間還是空間達到了上限都將清空數據

165. 怎麼設置kafka topic數據存儲時間

創建topic “test”:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic test 

​ 設定存儲時間:

./kafka-configs.sh --zookeeper localhost:2181 --alter --entity-name test --entity-type topics --add-config retention.ms=86400000

retention.ms=86400000 爲一天,單位是毫秒。

166.什麼情況會導致 kafka 運行變慢?

  • cpu 性能瓶頸
  • 磁盤讀寫瓶頸
  • 網絡瓶頸

167. 使用 kafka 集羣需要注意什麼?

  • 集羣的數量不是越多越好,最好不要超過 7 個,因爲節點越多,消息複製需要的時間就越長,整個羣組的吞吐量就越低。
  • 集羣數量最好是單數,因爲超過一半故障集羣就不能用了,設置爲單數容錯率更高。

答案,請點擊鏈接:

動力節點:框架系列|中間件·Kafka必看6道面試題zhuanlan.zhihu.com圖標

Zookeeper

168. zookeeper 是什麼?

zk是分佈式的應用協助服務,是集羣管理者,監視者各個節點的狀態,根據節點的提交請求做下一步處理。

其特徵有:更新全局有序,對應着一個時間戳zxid

169. zookeeper 都有哪些功能?

1、監控節點存活狀態(心跳包檢測),運行請求等

2、主節點選舉:選舉主節點,由zk協助

3、對分佈式鎖進行控制:包括獨佔鎖、共享鎖

4、統一命名服務:客戶端根據指定名字獲取資源的地址等

5、配置管理:將配置存儲到zk的某個目錄,當有修改時,zk會通知節點

170. zookeeper 有幾種部署模式?

單機、集羣、僞集羣(一個服務器多個zk服務應用)

171. zookeeper 怎麼保證主從節點的狀態同步?

原子廣播機制保證的,實現該機制的協議叫zab協議。

zab協議有:恢復模式(選主)、廣播模式(同步)

172. 集羣中爲什麼要有主節點?

主節點操作的結果共享到從節點,可以減少重複計算。

173. 集羣中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還可以使用嗎?

可以

宕機節點數 超過一半,就不可使用,包括kafka集羣也是。

174. 說一下 zookeeper 的通知機制?

client端會對某個znode建立一個*watcher事件*,當該znode發生變化時,這些client會收到zk的通知,然後client可以根據znode變化來做出業務上的改變等。

175. ZAB和Paxos算法的聯繫與區別?

  • 相同點:

    • 兩者都存在一個類似於Leader進程的角色,由其負責協調多個Follower進程的運行
    • Leader進程都會等待超過半數的Follower做出正確的反饋後,纔會將一個提案進行提交
    • ZAB協議中,每個Proposal中都包含一個 epoch 值來代表當前的Leader週期,Paxos中名字爲Ballot
  • 不同點:
    ZAB用來構建高可用的分佈式數據主備系統(Zookeeper),Paxos是用來構建分佈式一致性狀態機系統

答案,請點擊鏈接:

動力節點:框架系列|中間件·Zookeeper必看7道面試題zhuanlan.zhihu.com圖標

MySQL

​ 176. 數據庫的三範式是什麼?

​ 177. 一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 MySQL 數據庫,又插入了一條數據,此時 id 是幾?

​ 178. 如何獲取當前數據庫版本?

​ 179. 說一下 ACID 是什麼?

​ 180. char 和 varchar 的區別是什麼?

​ 181. float 和 double 的區別是什麼?

​ 182. MySQL 的內連接、左連接、右連接有什麼區別?

​ 183. MySQL 索引是怎麼實現的?

​ 184. 怎麼驗證 MySQL 的索引是否滿足需求?

​ 185. 說一下數據庫的事務隔離?

​ 186. 說一下 MySQL 常用的引擎?

​ 187. 說一下 MySQL 的行鎖和表鎖?

​ 188. 說一下樂觀鎖和悲觀鎖?

​ 189. MySQL 問題排查都有哪些手段?

​ 190. 如何做 MySQL 的性能優化?

答案,請點擊鏈接:

動力節點:框架系列|MySQL必看15道面試題zhuanlan.zhihu.com圖標

Redis

​ 191. Redis 是什麼?都有哪些使用場景?

​ 192. Redis 有哪些功能?

​ 193. Redis 和 memcache 有什麼區別?

194. Redis 爲什麼是單線程的?

​ 195. 什麼是緩存穿透?怎麼解決?

​ 196. Redis 支持的數據類型有哪些?

​ 197. Redis 支持的 Java 客戶端都有哪些?

​ 198. jedis 和 Redisson 有哪些區別?

​ 199. 怎麼保證緩存和數據庫數據的一致性?

​ 200. Redis 持久化有幾種方式?

​ 201. Redis 怎麼實現分佈式鎖?

​ 202. Redis 分佈式鎖有什麼缺陷?

​ 203. Redis 如何做內存優化?

​ 204. Redis 淘汰策略有哪些?

​ 205.單線程的Redis爲什麼這麼快

緩存與數據庫一致性:

更新的時候,先刪除緩存,然後再更新數據庫。
讀的時候,先讀緩存;如果沒有的話,就讀數據庫,同時將數據放入緩存,並返回響應。

答案,請點擊鏈接:

動力節點:框架系列|Redis 15道必看面試題zhuanlan.zhihu.com圖標

JVM

\206. 說一下 JVM 的主要組成部分?及其作用?

\207. 說一下 JVM 運行時數據區?

\208. 說一下堆棧的區別?

\209. 隊列和棧是什麼?有什麼區別?

\210. 什麼是雙親委派模型?

\211. 說一下類裝載的執行過程?

\212. 怎麼判斷對象是否可以被回收?

\213. Java 中都有哪些引用類型?

\214. 說一下 JVM 有哪些垃圾回收算法?

\215. 說一下 JVM 有哪些垃圾回收器?

\216. 詳細介紹一下 CMS 垃圾回收器?

\217. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什麼區別?

\218. 簡述分代垃圾回收器是怎麼工作的?

\219. 說一下 JVM 調優的工具?

\220. 常用的 JVM 調優的參數都有哪些?

答案,請點擊鏈接:

動力節點:Java面試題|JVM必看15道面試題zhuanlan.zhihu.com圖標

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