JAVA面試知識點1
1.1、Java基礎
-
面向物件的特徵:繼承、封裝和多型
-
final, finally, finalize 的區別
-
1、final修飾符(關鍵字)。被final修飾的類,就意味著不能再派生出新的子類,不能作為父類而被子類繼承。因此一個類不能既被abstract宣告,又被final宣告。將變數或方法宣告為final,可以保證他們在使用的過程中不被修改。被宣告為final的變數必須在宣告時給出變數的初始值,而在以後的引用中只能讀取。被final宣告的方法也同樣只能使用,不能過載。
-
2、finally是在異常處理時提供finally塊來執行任何清除操作。不管有沒有異常被丟擲、捕獲,finally塊都會被執行。try塊中的內容是在無異常時執行到結束。catch塊中的內容,是在try塊內容發生catch所宣告的異常時,跳轉到catch塊中執行。finally塊則是無論異常是否發生,都會執行finally塊的內容,所以在程式碼邏輯中有需要無論發生什麼都必須執行的程式碼,就可以放在finally塊中。
-
3、finalize是方法名。java技術允許使用finalize()方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者被執行其他清理工作。finalize()方法是在垃圾收集器刪除物件之前對這個物件呼叫的。
-
Exception、Error、執行時異常與一般異常有何異同
-
1、Error:表示由JVM所偵測到的無法預期的錯誤,由於這是屬於JVM層次的嚴重錯誤,導致JVM無法繼續執行,因此,這是不可捕捉到的,無法採取任何恢復的操作,頂多只能顯示錯誤資訊。
-
2、Java提供了兩類主要的異常:runtime exception和checked exception。checked異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對於這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。這類異常一般是外部錯誤,例如試圖從檔案尾後讀取資料等,這並不是程式本身的錯誤,而是在應用環境中出現的外部錯誤.
-
請寫出5種常見到的runtime exception
-
常見的RuntimeException(執行時異常):
IndexOutOfBoundsException(下標越界異常)
NullPointerException(空指標異常)
NumberFormatException (String轉換為指定的數字型別異常)
ArithmeticException -(算術運算異常 如除數為0)
ArrayStoreException - (向陣列中存放與宣告型別不相容物件異常)
SecurityException -(安全異常)
IOException(其他異常)
FileNotFoundException(檔案未找到異常。)
IOException(操作輸入流和輸出流時可能出現的異常。)
EOFException (檔案已結束異常) -
int 和 Integer 有什麼區別,Integer的值快取範圍
-
Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。integer快取範圍為-128-127。
-
Integer i4 = 127;//編譯時被翻譯成:Integer i4 = Integer.valueOf(127);
-
Integer i5 = 127;
-
System.out.println(i4 == i5);//true
-
Integer i6 = 128;
-
Integer i7 = 128;
-
System.out.println(i6 == i7);//false
-
-
包裝類,裝箱和拆箱
-
我們都知道,Java中有一個系統型別由兩部分組成,包含基本型別(primitive),例如int、float、double等,和引用型別(reference type),如String和List。而基本資料型別是不具備物件特徵的,每個基本型別都有一個對應的引用型別,稱作是裝箱基本型別(boxed primitive)或包裝類。而基本類與包裝類的關係如下表:
包裝類主要提供了兩大類方法:
1. 將本型別和其他基本型別進行轉換的方法
2. 將字串和本型別及包裝類互相轉換的方法以Integer為例(其他包裝類類似)說明這兩種轉換:
而自從JDK1.5以後Java中引入了自動拆箱和裝箱的機制,包裝類和基本型別之間的轉換就更加輕鬆便利了。
裝箱:把基本型別轉換成包裝類,使其具有物件的性質,又可分為手動裝箱和自動裝箱
拆箱:和裝箱相反,把包裝類物件轉換成基本型別的值,又可分為手動拆箱和自動拆箱
實際上基本型別和裝箱基本型別之間還有很大的區別的,這些區別容易導致一些麻煩
-
String、StringBuilder、StringBuffer
-
過載和重寫的區別
-
override(重寫)
1、方法名、引數、返回值相同。
2、子類方法不能縮小父類方法的訪問許可權。
3、子類方法不能丟擲比父類方法更多的異常(但子類方法可以不丟擲異常)。
4、存在於父類和子類之間。
5、方法被定義為final不能被重寫。
overload(過載)
1、引數型別、個數、順序至少有一個不相同。
2、不能過載只有返回值不同的方法名。
3、存在於父類和子類、同類中。
-
抽象類和介面有什麼區別
-
抽象類是用來捕捉子類的通用特性的 。它不能被例項化,只能被用作子類的超類。抽象類是被用來建立繼承層級裡子類的模板
-
介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情
1 介面和抽象類都不能被例項化,它們都位於繼承樹的頂端,用於被其他類實現和繼承。
2 介面和抽象類都可以包含抽象方法,實現介面或繼承抽象類的普通子類都必須實現這些抽象方法。
3接口裡只能包含抽象方法,靜態方法和預設方法,不能為普通方法提供方法實現,抽象類則完全可以包含普通方法。
4 接口裡只能定義靜態常量,不能定義普通成員變數,抽象類裡則既可以定義普通成員變數,也可以定義靜態常量。
5 介面不能包含構造器,抽象類可以包含構造器,抽象類裡的構造器並不是用於建立物件,而是讓其子類呼叫這些構造器來完成屬於抽象類的初始化操作。
6 接口裡不能包含初始化塊,但抽象類裡完全可以包含初始化塊。
7一個類最多隻能有一個直接父類,包括抽象類,但一個類可以直接實現多個介面,通過實現多個介面可以彌補Java單繼承不足。
-
說說反射的用途及實現
-
Java反射機制主要提供了以下功能:在執行時構造一個類的物件;判斷一個類所具有的成員變數和方法;呼叫一個物件的方法;生成動態代理。反射最大的應用就是框架
- 確定一個物件的類
- 取出類的modifiers,資料成員,方法,構造器,和超類.
- 找出某個接口裡定義的常量和方法說明.
- 建立一個類例項,這個例項在執行時刻才有名字(執行時間才生成的物件).
- 取得和設定物件資料成員的值,如果資料成員名是執行時刻確定的也能做到.
- 在執行時刻呼叫動態物件的方法.
- 建立陣列,陣列大小和型別在執行時刻才確定,也能更改陣列成員的值.
-
說說自定義註解的場景及實現
- 類屬性自動賦值。
- 驗證物件屬性完整性。
- 代替配置檔案功能,像spring基於註解的配置。
- 可以生成文件,像java程式碼註釋中的@see,@param等
-
Session與Cookie區別
-
安全,位置,效率,機制
-
列出自己常用的JDK包
-
java.lang/io/util/math/text/sql/nio/awt
-
MVC設計思想
-
mvc(model view controller)
mvc是一種軟體架構的思想,將一個軟體按照模型、檢視、控制器進行劃分。其中,模型用來封裝業務邏輯,檢視用來實現表示邏輯,控制器用來協調模型與檢視(檢視要通過控制器來呼叫模型,模型返回的處理結果也要先交給控制器,由控制器來選擇合適的檢視來顯示 處理結果)。
1)模型: 業務邏輯包含了業務資料的加工與處理以及相應的基礎服務(為了保證業務邏輯能夠正常進行的事務、安全、許可權、日誌等等的功能模組)
2)檢視:展現模型處理的結果;另外,還要提供相應的操作介面,方便使用者使用。3)控制器:檢視發請求給控制器,由控制器來選擇相應的模型來處理;模型返回的結果給控制器,由控制器選擇合適的檢視
-
equals與==的區別
-
“==”比較的是值【變數(棧)記憶體中存放的物件的(堆)記憶體地址】
equal用於比較兩個物件的值是否相同【不是比地址】
【特別注意】Object類中的equals方法和“==”是一樣的,沒有區別,而String類,Integer類等等一些類,是重寫了equals方法,才使得equals和“==不同”,所以,當自己建立類時,自動繼承了Object的equals方法,要想實現不同的等於比較,必須重寫equals方法。
"=="比"equal"執行速度快,因為"=="只是比較引用. -
hashCode和equals方法的區別與聯絡
-
什麼是Java序列化和反序列化,如何實現Java序列化?或者請解釋Serializable 介面的作用
-
Object類中常見的方法,為什麼wait notify會放在Object裡邊?
1、toString(),equals(),hashCode()
2、因為synchronized中的這把鎖可以是任意物件,所以任意物件都可以呼叫wait()和notify();所以wait和notify屬於Object。
1.2、Java常見集合
1.3、程序和執行緒
-
執行緒和程序的概念、並行和併發的概念
-
程序就是一段程式的執行過程,執行緒:通常一個程序會包含多個執行緒,作為獨立執行和獨立排程的基本單位。
-
並行:在多核cpu中,可以讓兩個以上的程序同時執行在不同的物理核心上,這種執行的方式就是並行。
-
併發:在單核cpu中,多個程序,一般通過時間片輪巡為主,通過不斷切換需要執行的程序讓其執行的方式叫做併發。
-
建立執行緒的方式及實現
-
繼承Thread類,呼叫start()方法,啟動一個執行緒。實現runnable介面,呼叫start()方法,啟動一個執行緒。
-
程序間通訊的方式
-
說說 CountDownLatch、CyclicBarrier 原理和區別
-
減數技術(只有一個構造方法用於指明計數數量,然後就是await用於執行緒等待,countDown用於將計數器減1.)和迴圈柵欄比較(很好理解,大家約定好一起到XX地址匯合,所有人都到了以後再一起去吃飯。) : 參考:https://blog.csdn.net/tianyaleixiaowu/article/details/75234600
-
說說 Semaphore 原理
-
訊號量:Semaphore是計數訊號量,經常用於限制獲取某種資源的執行緒數量
-
說說 Exchanger 原理
-
Exchanger(交換者)是一個用於執行緒間協作的工具類。Exchanger用於進行執行緒間的資料交換。它提供一個同步點,在這個同步點兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchange方法交換資料, 如果第一個執行緒先執行exchange方法,它會一直等待第二個執行緒也執行exchange,當兩個執行緒都到達同步點時,這兩個執行緒就可以交換資料,將本執行緒生產出來的資料傳遞給對方。因此使用Exchanger的重點是成對的執行緒使用exchange()方法,當有一對執行緒達到了同步點,就會進行交換資料。因此該工具類的執行緒物件是成對的。
-
ThreadLocal 原理分析,ThreadLocal為什麼會出現OOM,出現的深層次原理
-
講講執行緒池的實現原理
-
執行緒池,就是幫我們重複管理執行緒,避免建立大量的執行緒增加開銷。
-
執行緒池的幾種實現方式
-
執行緒的生命週期,狀態是如何轉移的
-
當執行緒被建立並啟動以後,它既不是一啟動就進入了執行狀態,也不是一直處於執行狀態。線上程的生命週期中,它要經過新建(New)、就緒(Runnable)、執行(Running)、阻塞(Blocked)和死亡(Dead)5種狀態。尤其是當執行緒啟動以後,它不可能一直"霸佔"著CPU獨自執行,所以CPU需要在多條執行緒之間切換,於是執行緒狀態也會多次在執行、阻塞之間切換
1. 新建狀態,當程式使用new關鍵字建立了一個執行緒之後,該執行緒就處於新建狀態,此時僅由JVM為其分配記憶體,並初始化其成員變數的值
2. 就緒狀態,當執行緒物件呼叫了start()方法之後,該執行緒處於就緒狀態。Java虛擬機器會為其建立方法呼叫棧和程式計數器,等待排程執行
3. 執行狀態,如果處於就緒狀態的執行緒獲得了CPU,開始執行run()方法的執行緒執行體,則該執行緒處於執行狀態
4. 阻塞狀態,當處於執行狀態的執行緒失去所佔用資源之後,便進入阻塞狀態
5. 線上程的生命週期當中,執行緒的各種狀態的轉換過程
1.4、鎖機制
-
說說執行緒安全問題,什麼是執行緒安全,如何保證執行緒安全
-
執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。 執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料
-
通過使用執行緒安全的類,或者使用synchronized同步程式碼塊
-
重入鎖的概念,重入鎖為什麼可以防止死鎖
-
重入鎖就是以執行緒為單位。當一個執行緒獲取物件鎖之後,這個執行緒以再次獲取本物件上的鎖。而其他執行緒是不可以獲取的。
-
為什麼可以防止死鎖:通過為每個鎖關聯一個請求計數和一個佔有它的執行緒。
-
產生死鎖的四個條件(互斥、請求與保持、不剝奪、迴圈等待)
-
1、互斥:某種資源一次只允許一個程序訪問,即該資源一旦分配給某個程序,其他程序就不能再訪問,直到該程序訪問結束。
2、佔有且等待:一個程序本身佔有資源(一種或多種),同時還有資源未得到滿足,正在等待其他程序釋放該資源。
3、不可搶佔:別人已經佔有了某項資源,你不能因為自己也需要該資源,就去把別人的資源搶過來。
4、迴圈等待:存在一個程序鏈,使得每個程序都佔有下一個程序所需的至少一種資源。
當以上四個條件均滿足,必然會造成死鎖,發生死鎖的程序無法進行下去,它們所持有的資源也無法釋放。這樣會導致CPU的吞吐量下降。所以死鎖情況是會浪費系統資源和影響計算機的使用效能的。那麼,解決死鎖問題就是相當有必要的了。
參考:https://blog.csdn.net/guaiguaihenguai/article/details/80303835 -
如何檢查死鎖(通過jConsole檢查死鎖)
-
Jconsole,Jstack
-
volatile 實現原理(禁止指令重排、重新整理記憶體)
-
synchronized 實現原理(物件監視器)
-
synchronized 與 lock 的區別
-
AQS同步佇列
-
CAS無鎖的概念、樂觀鎖和悲觀鎖
-
常見的原子操作類
-
什麼是ABA問題,出現ABA問題JDK是如何解決的
-
樂觀鎖的業務場景及實現方式
-
Java 8並法包下常見的併發類
-
偏向鎖、輕量級鎖、重量級鎖、自旋鎖的概念
1.5、JVM
-
JVM執行時記憶體區域劃分
-
記憶體溢位OOM和堆疊溢位SOE的示例及原因、如何排查與解決
-
如何判斷物件是否可以回收或存活
-
常見的GC回收演算法及其含義
-
常見的JVM效能監控和故障處理工具類:jps、jstat、jmap、jinfo、jconsole等
-
JVM如何設定引數
-
JVM效能調優
-
類載入器、雙親委派模型、一個類的生命週期、類是如何載入到JVM中的
-
類載入的過程:載入、驗證、準備、解析、初始化
-
強引用、軟引用、弱引用、虛引用
-
Java記憶體模型JMM
1.6、設計模式
-
常見的設計模式
-
單例模式,代理模式,工廠模式,裝飾者模式,簡單工廠模式。
-
設計模式的的六大原則及其含義
-
單一職責原則,開閉原則,裡式代換原則,依賴倒轉原則,合成/聚合複用原則,迪米特原則
-
常見的單例模式以及各種實現方式的優缺點,哪一種最好,手寫常見的單利模式
-
飽漢式,餓漢式,雙重鎖式。根據不同的業務要求選取最合適的方式。
-
設計模式在實際場景中的應用
-
單例模式,可以用來設計線上人數等方案
-
Spring中用到了哪些設計模式
-
用到了單例模式,代理模式,工廠模式等等
-
MyBatis中用到了哪些設計模式
-
裝飾者模式,責任鏈模式,介面卡模式,動態代理模式,
-
你專案中有使用哪些設計模式
-
代理,責任鏈,單例
-
說說常用開源框架中設計模式使用分析
-
動態代理很重要!!!
1.7、資料結構
-
樹(二叉查詢樹、平衡二叉樹、紅黑樹、B樹、B+樹)
-
深度有限演算法、廣度優先演算法
-
克魯斯卡爾演算法、普林母演算法、迪克拉斯演算法
-
什麼是一致性Hash及其原理、Hash環問題
-
常見的排序演算法和查詢演算法:快排、折半查詢、堆排序等
1.8、網路/IO基礎
-
BIO、NIO、AIO的概念
-
什麼是長連線和短連線
-
Http1.0和2.0相比有什麼區別,可參考《Http 2.0》
-
Https的基本概念
-
三次握手和四次揮手、為什麼揮手需要四次
-
從遊覽器中輸入URL到頁面載入的發生了什麼?可參考《從輸入URL到頁面載入發生了什麼》
二、資料儲存和訊息佇列
2.1、資料庫
-
MySQL 索引使用的注意事項
-
DDL、DML、DCL分別指什麼
-
explain命令
-
left join,right join,inner join
-
資料庫事物ACID(原子性、一致性、隔離性、永續性)
-
事物的隔離級別(讀未提交、讀以提交、可重複讀、可序列化讀)
-
髒讀、幻讀、不可重複讀
-
資料庫的幾大正規化
-
資料庫常見的命令
-
說說分庫與分表設計
-
分庫與分錶帶來的分散式困境與應對之策(如何解決分散式下的分庫分表,全域性表?)
-
說說 SQL 優化之道
-
MySQL遇到的死鎖問題、如何排查與解決
-
儲存引擎的 InnoDB與MyISAM區別,優缺點,使用場景
-
索引類別(B+樹索引、全文索引、雜湊索引)、索引的原理
-
什麼是自適應雜湊索引(AHI)
-
為什麼要用 B+tree作為MySQL索引的資料結構
-
聚集索引與非聚集索引的區別
-
遇到過索引失效的情況沒,什麼時候可能會出現,如何解決
-
limit 20000 載入很慢怎麼解決
-
如何選擇合適的分散式主鍵方案
-
選擇合適的資料儲存方案
-
常見的幾種分散式ID的設計方案
-
常見的資料庫優化方案,在你的專案中資料庫如何進行優化的
2.2、Redis
-
Redis 內部結構
-
Redis 使用場景
-
Redis 叢集方案與實現
-
Redis 為什麼是單執行緒的?
-
快取雪崩、快取穿透、快取預熱、快取更新、快取降級
-
使用快取的合理性問題
-
Redis常見的回收策略
2.3、訊息佇列
-
訊息佇列的使用場景
-
訊息的重發補償解決思路
-
訊息的冪等性解決思路
-
訊息的堆積解決思路
-
自己如何實現訊息佇列
-
如何保證訊息的有序性
三、開源框架和容器
3.1、SSM/Servlet
-
Servlet的生命週期
-
轉發與重定向的區別
-
BeanFactory 和 ApplicationContext 有什麼區別
-
Spring Bean 的生命週期
-
Spring IOC 如何實現
-
Spring中Bean的作用域,預設的是哪一個
-
說說 Spring AOP、Spring AOP 實現原理
-
動態代理(CGLib 與 JDK)、優缺點、效能對比、如何選擇
-
Spring 事務實現方式、事務的傳播機制、預設的事務類別
-
Spring 事務底層原理
-
Spring事務失效(事務巢狀),JDK動態代理給Spring事務埋下的坑,可參考《JDK動態代理給Spring事務埋下的坑!》
-
如何自定義註解實現功能
-
Spring MVC 執行流程
-
Spring MVC 啟動流程
-
Spring 的單例實現原理
-
Spring 框架中用到了哪些設計模式
-
Spring 其他產品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)
-
有沒有用到Spring Boot,Spring Boot的認識、原理
-
MyBatis的原理
3.2、Netty
-
為什麼選擇 Netty
-
說說業務中,Netty 的使用場景
-
原生的 NIO 在 JDK 1.7 版本存在 epoll bug
-
什麼是TCP 粘包/拆包
-
TCP粘包/拆包的解決辦法
-
Netty 執行緒模型
-
說說 Netty 的零拷貝
-
Netty 內部執行流程
-
Netty 重連實現
-
Kafka零拷貝Zero Copy技術
3.3、Tomcat
-
Tomcat的基礎架構(Server、Service、Connector、Container)
-
Tomcat如何載入Servlet的
-
Pipeline-Valve機制
四、分散式
4.1、Nginx
-
請解釋什麼是C10K問題或者知道什麼是C10K問題嗎?
-
Nginx簡介,可參考《Nginx簡介》
-
正向代理和反向代理.
-
Nginx幾種常見的負載均衡策略
-
Nginx伺服器上的Master和Worker程序分別是什麼
-
使用“反向代理伺服器”的優點是什麼?
4.2、分散式其他
-
談談業務中使用分散式的場景
-
Session 分散式方案
-
Session 分散式處理
-
分散式鎖的應用場景、分散式鎖的產生原因、基本概念
-
分佈是鎖的常見解決方案
-
分散式事務的常見解決方案
-
叢集與負載均衡的演算法與實現
-
分庫與分錶帶來的分散式困境與應對之策
4.3、Dubbo
-
什麼是Dubbo,可參考《Dubbo入門》
-
什麼是RPC、如何實現RPC、RPC 的實現原理,可參考《基於HTTP的RPC實現》
-
Dubbo中的SPI是什麼概念
-
Dubbo的基本原理、執行流程
五、微服務
5.1、微服務
-
前後端分離是如何做的?
-
微服務哪些框架
-
Spring Could的常見元件有哪些?可參考《Spring Cloud概述》
-
領域驅動有了解嗎?什麼是領域驅動模型?充血模型、貧血模型
-
JWT有了解嗎,什麼是JWT,可參考《前後端分離利器之JWT》
-
你怎麼理解 RESTful
-
說說如何設計一個良好的 API
-
如何理解 RESTful API 的冪等性
-
如何保證介面的冪等性
-
說說 CAP 定理、BASE 理論
-
怎麼考慮資料一致性問題
-
說說最終一致性的實現方案
-
微服務的優缺點,可參考《微服務批判》
-
微服務與 SOA 的區別
-
如何拆分服務、水平分割、垂直分割
-
如何應對微服務的鏈式呼叫異常
-
如何快速追蹤與定位問題
-
如何保證微服務的安全、認證
5.2、安全問題
-
如何防範常見的Web攻擊、如何方式SQL注入
-
服務端通訊安全攻防
-
HTTPS原理剖析、降級攻擊、HTTP與HTTPS的對比
5.3、效能優化
-
效能指標有哪些
-
如何發現效能瓶頸
-
效能調優的常見手段
-
說說你在專案中如何進行效能調優
六、其他
6.1、設計能力
-
說說你在專案中使用過的UML圖
-
你如何考慮元件化、服務化、系統拆分
-
秒殺場景如何設計
6.2、業務工程
-
說說你的開發流程、如何進行自動化部署的
-
你和團隊是如何溝通的
-
你如何進行程式碼評審
-
說說你對技術與業務的理解
-
說說你在專案中遇到感覺最難Bug,是如何解決的
-
介紹一下工作中的一個你認為最有價值的專案,以及在這個過程中的角色、解決的問題、你覺得你們專案還有哪些不足的地方
6.3、軟實力
-
說說你的優缺點、亮點
-
說說你最近在看什麼書、什麼部落格、在研究什麼新技術、再看那些開源專案的原始碼
-
說說你覺得最有意義的技術書籍
-
工作之餘做什麼事情、平時是如何學習的,怎樣提升自己的能力
-
說說個人發展方向方面的思考
-
說說你認為的服務端開發工程師應該具備哪些能力
-
說說你認為的架構師是什麼樣的,架構師主要做什麼
-
如何看待加班的問題