一.介紹
這個面試題目非常多,牛客網鏈接
我擦 但是 VIvo好像不招Java研發崗的
二.題目
Java基礎
- Java異常瞭解嗎?說說平時遇到的異常?說出6種常見的java異常。寫程序遇到過哪些異常 運行時異常有哪些
- 運行時異常,比如空指針這種,也叫做非受檢異常
- 面向對象 面對對象的幾大特性 多態怎麼理解
- 這個就舉例子扯就行
- 對string類的理解。stringbuffer 和 stringbuilder
- StringBuffer線程安全,StingBuilder線程不安全
- 底層是char數組
- 反射機制介紹一下
- 指在程序的運行狀態中,可以構造任意一個類的對象,可以瞭解任意一個對象所屬的類,可以瞭解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法
- bio,nio,aio分別介紹一下,nio的實現方式
- 阻塞式IO,非阻塞式IO,異步非阻塞式IO
- NIO 基於 Channel(通道)和 Buffer(緩衝區)進行操作,數據總是從通道讀取到緩衝區中,或者從緩衝區寫入到通道中。Selector(選擇器)用於監聽多個通道的事件(比如:連接請求,數據到達等),因此使用單個線程就可以監聽多個客戶端通道
- 問了public等變量定義修飾詞的時間域
- 略
- 問了反射機制,還有問了動態代理的好處和壞處,好處答不上來
- 好處:動態代理可以通過用代理對象替換原本對象,對一些功能進行擴展,例如Spring的AOP面向切面編程,就是通過動態代理來實現一些類似於打日誌等功能
- 壞處:但是它只能基於接口進行代理,已經繼承proxy了,可能還有消耗內存?
- 接口和抽象類的區別。
- 接口能實現多繼承,抽象類不行
- 抽象類描述的是一種類,接口描述的是一個功能
- 有一個public static final的HashMap,裏邊對象的屬性能不能修改?
- 可以更改,只有初始化操作做不了
- 當final修飾變量時,對於基本類型和string,這個變量的值是不能改變的;當修飾其他類型的對象時,final使其引用恆定不變,但是對象自身卻可以自由修改變換。
- 爲什麼java 平臺無關性 機器碼和字節碼區別 JVM加載代碼的一個流程
- 流程:加載,準備,驗證,解析,初始化,使用,卸載
- 平臺無關性:通過JVM把class文件轉化爲機器能看懂的機器語言
- 機器碼是二進制的,字節碼是16進制class文件,java文件編譯產生的
- java數據類型以及自己的應用 自動拆箱和自動裝箱以及自己的應用即什麼時候用到的,列舉幾種情況
- byte,short,int,long,boolean,double,float,char
- 什麼是值傳遞和引用傳遞,區別及應用
- “在Java裏面參數傳遞都是按值傳遞”這句話的意思是:按值傳遞是傳遞的值的拷貝,按引用傳遞其實傳遞的是引用的地址值,所以統稱按值傳遞。
- 重載和重寫
重寫是子類對父類方法進行重寫,重載是指不同函數用同名方法,根據參數不同實現函數不同。 - static方法是否能重寫,接口和抽象類的區別
不可以 - 你覺得java是一種什麼樣的語言以及java特性
- 面向對象blablabla
- lamda表達式瞭解嗎?1.8新特性有什麼?(面試寶典對接口抽象這個問題是錯的,過時了)
- 瞭解
- 速度更快 – 紅黑樹
- 代碼更少 – Lambda
- 強大的Stream API – Stream
- 便於並行 – Parallel
- 最大化減少空指針異常 – Optional
- 內存泄露怎麼造成的,怎麼排查
內存泄漏就是創建的對象一直沒有回收,導致丟了一部分內存。內存泄漏排查 - 講講final修飾符。
- 修飾類,終態類,類不能被繼承。
- 修飾方法,方法不能被重寫。
- 修飾變量,變量只能被賦值一次,不能被重新賦值,其實就是一個常量。(在類加載階段可以把對象的值預先賦值)
- 一個對象佔多少內存。
- Object o=new Object(): 在java中空對象佔八個字節,對象的引用佔四個字節。所以上面那條語句所佔的空間是4byte+8byte=12byte
- java淺拷貝和深拷貝
- 二者對於基本類型變量沒區別
- 對於引用類型對象,淺拷貝直接把地址賦值給新對象,假如新對象變了,原來對象也跟着變
- 深拷貝每個對象都需要實現 Cloneable 並重寫 clone() 方法,開銷大,速度慢
- static能不能被重寫?
- 重寫方法的目的是爲了多態,或者說:重寫是實現多態的前提,即重寫是發生在繼承中且是針對非static方法的。
語法上子類允許出現和父類只有方法體不一樣其他都一模一樣的static方法,但是在父類引用指向子類對象時,通過父類引用調用的依然是父類的static方法,而不是子類的static方法。
即:語法上static支持重寫,但是運行效果上達不到多態目的
- 序列化,反序列化,什麼時候用? 如何對一個對象序列化
存儲爲二進制、xml、json等等,把bai對象轉換成這du種格式就叫序列化,而反序列化通常是從這種格式轉換回來。序列化可以用一些API
Java集合類
- Hashmap底層(數組+鏈表+紅黑樹)hashmap爲什麼線程不安全,如何保證線程安全,就扯到concurrenthashmap hashmap底層實現 多線程會出現什麼情況 擴容機制是什麼爲什麼會死鎖 如何解決碰撞 Jdk 1.8的優化。
- 爲什麼線程不安全:頭插法/數值覆蓋
- 解決碰撞:拉鍊法
- jdk1.8:引入紅黑樹優化過長鏈表導致的查詢效率低
- concurrenthashmap1.7和1.8的區別;concurrenthashmap說說,它是如何保證線程安全的?jdk1.7的hashentry和segment鎖。具體說說segment鎖?能講下ConcurrentHashMap的實現原理麼 JDK7或者8都行
常用集合類 實現類 - list和set區別(重複/不重複)
- set,list,map(線程安全的map,map怎麼實現之類的)
- 紅黑樹介紹一下,跟平衡二叉樹比較一下,紅黑樹有哪些應用場景
- 一致性哈希函數以及hashmap的put方法
Java併發
- java創建線程的方式,runnable和callable區別(參數不同)1. java線程的狀態有哪些;線程的幾種狀態
- wait和sleep的區別;wait和notify的使用場景;
- 介紹一下volatile以及原理;volatile介紹一下Volatile底層是如何實現的? 說了內存可見性和內存屏障,Volatile是絕對線2程安全的嗎?不是,沒有保證原子性。volatile關鍵字在線程通信的問題
- 介紹一下synchornized以及原理; lock和synchornized的區別;synchronized鎖的升級過程?Synchronized,底層是如何實現的?說了monitor對象頭,以及兩個monitorenter和monitorexit運用於代碼塊。
對象頭是存儲了哪些信息?說說synchronized的鎖優化過程?說了偏向,自旋,輕量和重量。 - 介紹一下AQS
- 說一下公平鎖和非公平鎖的原理;
- 公平鎖是每次都從隊列中取隊頭的線程獲得鎖
- 非公平鎖每次都會競爭(用CAS操作嘗試獲取鎖)
- cas操作是什麼,以及可能出現的問題;
- 關於CAS我的文章
- 問題就是ABA問題
- 說說你理解的悲觀鎖和樂觀鎖?樂觀鎖有哪些?樂觀鎖有什麼缺點?
- 悲觀鎖和樂觀鎖是兩種思想
- 樂觀鎖的實現有版本號機制,如果數據跟預期版本version一致就更新
- 缺點是隻適用於併發寫操作少的情況,如果操作多就會一直阻塞
- 阻塞隊列 線程間通信方式 創建線程方式 創建線程池方式 線程池常用參數
- cpu密集型多線程和io密集型多線程的比較。cpu密集型裏如何管理多線程? 用什麼樣的線程池和阻塞隊列?
- CPU密集型就需要線程數與CPU數一致
JVM
- JVM運行時內存區域劃分?哪些線程私有?運行時數據區,私有共享都是哪些?堆區內存如何分配?
- 堆區內存:年輕代80% ,老年代20%,大部分對象都是朝生夕死的
- 堆區,方法區,本地方法棧,虛擬機棧,程序計數器。堆和方法區是共有的,其餘是私有的
- 對象的生命週期?
-
-
創建階段(Created)
-
-
-
應用階段(In Use)
-
-
-
不可見階段(Invisible)
-
-
-
不可達階段(Unreachable)
-
-
-
收集階段(Collected)
-
-
-
終結階段(Finalized)
-
-
-
對象空間重分配階段(De-allocated)
-
- JVM垃圾回收器,cms和g1的特點,兩者的區別是什麼,比g1更加先進的垃圾回收器有了解麼,ZGC原理,能夠管理多大的內存,CMS能管理多大的內存,G1呢
- cms是最短停頓時間收集器,g1是整堆收集器
- CMS專注老年代
- G1:它將整個Java堆劃分爲多個大小相等的獨立區域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔離的了,它們都是一部分Region(不需要連續)的集合。
- 工作步驟不同
- 比G1更先進:這還真不知道
- JVM內存模型 類的生命週期 類加載過程 雙親委派機制瞭解嗎 進入老年代過程 什麼情況下直接進入老年代
- 類加載機制,過程,類加載機制?如何自定義實現類加載器?雙親委派模型、類加載器類別,雙親委派模型本質是解決了什麼問題?安全性,有哪幾種類加載器?類加載的流程。知道哪些類加載器。類加載器之間的關係?雙親委派模型。爲什麼使用雙親委派模型?
- 略
- 垃圾回收算法,常見的垃圾回收器及他們之間區別,垃圾回收發生在哪裏,怎麼判斷對象存活、GC Roots具體有哪些、講講對象分配與回收,什麼可以作爲垃圾回收的對象,垃圾回收算法和流程。
- 發生在堆區,通過GC-roots對象判斷,如果沒有引用就是要進行gc的對象
- 棧什麼情況下會溢出?
- 方法執行是創建的棧幀超過了棧的深度。那麼最有可能的就是方法遞歸調用產生這種結果。
- 注意棧是線程私有的
- 靜態變量存放在內存哪個區域?
- static修飾的成員(包括變量和方法)叫靜態成員,都存放在方法區中的靜態區,隨着類的加載而存在、類的回收而釋放,和對象存在與否沒有關係,並且要先於對象存在。
- 在主函數中調用靜態方法,靜態方法是在棧內存中進行加載的,靜態方法執行完之後就彈棧結束了。事實上,所有方法都是在棧內存中執行的。
計算機網絡
- 輸入一個url後的過程;瀏覽器從發送請求的全部過程
我的文章關於計網 - OSI七層和TCP四層協議,OSI七層模型/五層模型,每一層有哪些協議,3. http,tcp,ip位於哪一層
- http位於應用層
- tcp位於傳輸層
- ip位於網絡層
- TCP三次握手四次分手,tcp四次揮手爲什麼要四次,爲什麼TCP是安全的,TCP,UDP的區別
TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
- 一個手機應用程序裏面的進程和線程分別是怎麼進行的?
進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位
在開銷方面:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。
所處環境:在操作系統中能同時運行多個進程(程序);而在同一個進程(程序)中有多個線程同時執行(通過CPU調度,在每個時間片中只有一個線程執行)
Mysql
- 數據庫引擎事務隔離級別,串行化如何實現,數據庫的隔離級別?四個。你平常使用的是哪個隔離級別。數據庫隔離級別以及分別解決了什麼問題
- 讀未提交,讀已提交,可重複讀,可串行化
- mysql默認是可重複讀
- 髒讀,不可重複讀,幻讀
- MySQL的存儲引擎有哪些?它們之間的區別?你用的mysql存儲引擎?爲什麼選擇它?實現原理?
innodb和myisam,區別見:innodb和myisam區別 - 怎麼判斷一個SQL語句有沒有走索引?緊接着問explain知道哪些字段嗎
mysql存儲模型 區別 怎麼看用沒用索引 怎麼判斷sql語句好壞
- explain命令看結果
- 一個手機應用要更改數據庫,它的底層是怎麼實現的?
- MySQL InnoDB存儲引擎中的MVCC解決了什麼問題,能說下MVCC的實現原理麼
- 多版本併發控制
- 一種處理讀寫衝突的手段, 目的在於提高 數據庫 高併發場景下的吞吐性能 。
- 如此一來不同的事務在併發過程中, SELECT 操作可以不加鎖而是通過 MVCC 機制讀取指定的版本歷史記錄,並通過一些手段保證保證讀取的記錄值符合事務所處的隔離級別,從而解決併發場景下的讀寫衝突。
文章:MVCC