面試問的問題

正在找JAVA工作的人。。。(1-3年)

本文目錄

1、JAVA基礎
2、HashMap
3、JVM
4、HTTP協議
5、設計模式
6、SpringBoot
7、MySQL
8、Docker
 
 

面試內容

1、簡單自我介紹
答:我叫xxx,來自xxx,工作xxx年,先後在xxx公司工作,做了哪些項目。
 
2、簡述項目內容,並簡單說一下自己承擔的角色。
答:爲了解決xxx問題而開發了一套xxx系統。簡述系統整體架構,說一下自己在項目中開發的模塊(業務及設計)
 
3、JAVA基礎
 
4、多輪面試下來,自我介紹和項目經驗不關心了,接下來問你最擅長什麼,簡單說一下。
答:我對xxx方面有些瞭解,然後開始和面試官嘴炮詳細。
 
5、反問面試官(薪資待遇、工作內容,使用技術 ,項目負責,也可以說暫時沒有)
 
6、面試結束,回去等消息,hr跟你談薪資福利

JAVA基礎

1、JAVA跨平臺開發原理
答:JAVA爲多版本系統提供了統一接口(每個版本系統各有一個jdk,jvm),JAVA開發者只需要遵守JAVA開發規範,調用統一接口即可。
 
2、JAVA開發環境搭建
JDK,JAVA_HOME環境變量,IDE設置工作目錄和默認編碼,,Web服務器(Tomcat),Git/SVN版本管理,Maven/gradle構建工具。
 
3、JAVA有幾種基本數據類型?
byte int long short float double char boolean
 
4、int佔多少字節?4個32位
 
5、JAVA三大特徵:封裝、繼承、多態 (、抽象)舉例說明
 
6、有了基本數據類型,爲什麼還要封裝類型?
因爲基本數據類型不具備面向對象的特性。
 
7.==和equals的區別
==比較基本數據類型時,直接比較值,比較引用類型,比較的是地址。
equals調用的是對象的equals方法
 
8、String和StringBuilder的區別?StringBuilder和StringBuffer的區別?
String是內容不可變的字符串,StringBuilder和StringBuffer是內容可變的字符串,使用append方法,其中StringBuilder是線程不安全效率高,StringBuffer線程安全而效率低(append方法加鎖了)
 
9、集合List、set、map
List(ArrayList 數組型查找快,刪除和增加慢,LinkedList 查找慢,刪除和增加快)
 
10、HashMap和HashTable的區別?還有ConcurrentHashMap的效果?
HashMap線程不安全效率高(key和value可以爲null),HashTable線程安全,效率低(key和value不能爲null)。ConcurrentHashMap線程安全效率又高。
 
11、拷貝文件用字節流還是字符流?垃圾問題
 
12、線程有幾種啓動方式。
方式一:繼承Thread類(不推薦,JAVA只能單繼承,繼承了Thread類就不能再繼承,擴展性不強)調用start方法啓動。new Thread(繼承了Thread類的類或實現了Runnable接口的類).start()啓動之後執行的是run方法。
方式二:類實現runnable接口。
如何區分線程?thread.setName()

13、有沒有使用過線程併發庫?
簡單瞭解過,JAVA通過Executors提供了四個靜態方法創建線程池(最主要的newFixedThreadPool可以控制線程池的大小,超過的線程會在隊列中等待)
使用線程池的優勢:1、防止線程過多使系統運行緩慢或崩潰。2、線程池不需要每次創建或銷燬,節約資源,響應時間快。

14、所有的類都從Object類繼承了哪些方法?
繼承了clone,equals,toString,hashcode,getClass,notify,wait
 
 

HashMap

定義HashMap時,會初始化一個初始容量(也可以自定義,默認是16)
JAVA7 (數組、鏈表)
JAVA8(數組、鏈表、紅黑樹)
第一次put會初始化數組。
初始容量爲什麼必須是2的指數冪?加載因子爲什麼是0.75?
如果不是,會就近轉換爲2的指數冪。
HashMap中數組初始化後,通過key的hashcode做一個hash映射(採用位運算),有衝突時採用拉鍊法(頭插)解決hash衝突。(hashcode & (length -1) 位運算 == hashcode % 16,前提條件是length必須是2的指數冪,否則可能導致數組越界)
多次調用put,可能觸發多次擴容(每次擴容需要rehash,此時位運算的優勢就體現出來了)
爲什麼HashMap線程不安全?
JAVA7:
1、數據丟失(擴容的時候)
2、死鎖(使用鏈表的時候,多線程擴容導致鏈表成環出不來)
JAVA8:
避免了死鎖。(遷移鏈的時候,搞四組指針均勻遷移到新擴容數組)
爲什麼加載因子是0.75?
加載因子0.5就浪費空間,1就導致鏈表過長查詢效率低,數學原理:牛頓二項式 ln 2約等於0.693
擴容。
鏈表轉紅黑樹過程?
先判斷數組長度 <64,即便鏈表長度達到8,則優先選擇擴容。
如果數組長度超過64,纔將長度超過8(閾值)的鏈表(實際的鏈表長度是9)
紅黑樹的5個性質:
1、每個節點只有紅色和黑色
 
 

JVM

JVM的內存模型是怎樣的?
在這裏插入圖片描述
引用詳細地址,說的特別好
答:
分爲線程共享區線程隔離區(獨佔區)
其中線程共享區有兩塊,一塊叫做方法區,是堆的一個邏輯部分,也叫持久代或永久代,用於存儲類的信息(類名、方法、字段),常量池,靜態變量,編譯後的代碼等,另一塊叫做JAVA堆,用於存儲對象實例和數組,垃圾回收的主要區域
堆裏面分爲新生代和老年代,新生代裏面分爲Eden、survivor、tenured gen。
線程隔離區有三塊,包括
虛擬機棧
本地方法棧,以及程序計數器
虛擬機棧存儲的單元叫棧幀,一個棧幀主要劃分爲局部變量表,操作數棧,指向當前方法所屬的類的運行時常量池的引用,動態鏈接,方法的返回地址,運行的是JAVA的方法。
在這裏插入圖片描述
本地方法棧除了調用的是本地方法之外,和虛擬機棧幾乎一樣。
程序計數器可以認爲是當前線程運行的行號指示器。由於程序計數器中存儲的數據所佔空間的大小不會隨程序的執行而發生改變,因此,此內存區域是唯一一個在JVM規範中沒有規定任何OutOfMemoryError情況的區域。

垃圾回收機制?

如何判定對象爲垃圾對象?
方法一、引用計數法,每被引用一次,就+1,引用無效一次就-1,爲0就回收(現JVM已棄用?因爲對象之間互相有引用時,這種檢測方法就失效了)
方法二、可達性分析,以虛擬機棧中的局部變量表中的所有引用作爲GC Root,深度遍歷堆中的所有實例(即找到引用鏈,不在引用鏈中的實例需要被回收)
如何回收?
回收策略:
1、標記-清除算法。用於老年代,兩個問題:清除之後內存不連續,可能引起第二次垃圾回收產生了效率問題和空間問題。
2、複製算法。主要用於新生代,將堆中的內存劃分爲一大塊Eden區域(80%)和兩小塊Survivor區域a和b(各10%),每次分配新實例對象時,都丟到Eden區域,每次垃圾回收時,將Eden區域還存活的對象實例按內存區域順序丟到其中一塊survivor區域a,另一塊survivor區域b也丟進來a,下一次垃圾回收時除了Eden丟到b,a也丟到b(互相複製互相丟並清空自己),如果一塊survivor區域滿了,就選擇性的將一些存活對象實例丟到tenured gen區域。優勢:浪費內存小
3、標記整理(清除)算法。主要用於老年代,相比較標記清除算法,僅在清除對象實例之前,劃分一塊小空間,將小空間不需要回收的對象實例移動到大空間去,將需要清除的對象實例放進小空間一起清除,提升了效率。
4、分代收集算法,結合複製算法和標記整理算法,分新生代和老年代使用不同的策略。
垃圾回收器:
1、Serial.最古老最悠久的垃圾收集器,對於新生代(複製算法),單線程,效率高,適用於桌面應用
2、parnew。多線程收集(新生代收集器,複製算法),客戶端環境下效率不如serial
3、parellel scavengen(多線程,新生代收集器,複製算法)達到可控制的吞吐量
(吞吐量=CPU用於運行用戶代碼的時間與CPU消耗總時間的比值)
(吞吐量=執行用戶代碼的時間/(執行用戶代碼時間+垃圾回收佔用時間))
使用兩個參數來控制
-XX:MaxGCPauseMillis 垃圾收集器停頓時間ms爲單位
-XX:GCTimeRatio 吞吐量大小(0,100)

4、cms。併發收集器(邊扔邊打掃,老年代收集器),用於回收老年代內存,同時只能使用serial或parnew收集新生代,把並行線程和垃圾回收線程同時標記,同時清理,優點:併發清理,低停頓。缺點:CPU佔用高,無法處理浮動垃圾(打掃完之後不管了要等下一次),空間碎片
5、G1收集器。JDK9默認指定收集器。優勢:並行併發,分代收集,空間整合(類似標記整理算法),低停頓(可預測的停頓),利用多核CPU。篩選回收用了一張remeber set表記錄哪些實例不會被回收。

何時回收?
 
 

HTTP協議

Get和POST請求有什麼區別?
答:

  1. Get是不安全的,因爲在傳輸過程,數據被放在請求的URL中;Post的所有操作對用戶來說都是不可見的。
  2. Get傳送的數據量較小,這主要是因爲受URL長度限制;Post傳送的數據量較大,一般被默認爲不受限制。
  3. Get限制Form表單的數據集的值必須爲ASCII字符;而Post支持整個ISO10646字符集。
  4. Get執行效率卻比Post方法好。Get是form提交的默認方法。
     
     

設計模式(單點登錄:一處登錄多處保持登錄狀態)

設計模式是什麼?常見的設計模式有哪些?
設計模式是經過多次實踐總結出來的可以反覆使用的設計方法,代表了最佳的實踐,可以套用的一種模板。使用設計模式是爲了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
有23種設計模式,這些模式可以分爲三大類:創建型模式(Creational Patterns)、結構型模式(Structural Patterns)、行爲型模式(Behavioral Patterns)。當然,我們還會討論另一類設計模式:J2EE 設計模式。
設計模式詳解
策略模式實現的一種辦法
原型設計模式:Spring 配置bean時,scope 爲Prototype 時,掃到該beans.xml文件,在創建bean時,getBeans方法中有個doGetBean方法中,會判斷該bean是否Prototype ,是就創建原型對象,不是就正常創建。
單例模式(飽漢模式,飢漢模式)
三部曲:
一、構造方法私有化,只有自己的類中能創建實例。
二、在自己的類中創建一個單實例。(飽漢:需要時才創建。飢漢:一出來就創建)
三、提供一個方法獲取該實例對象。(創建時需要進行方法同步)
工廠模式:Spring IOC容器就實現了該模式,我們只需要加好配置和註解,不關心對象如何被創建,由SpringIOC容器來管理這些對象的生命週期。
代理模式:SpringAOP就是實現了代理模式。
 
 

SpringBoot

SpringBoot的優勢?
答:配置很少,可以獨立運行,內置tomcat,不需要打war包部署到容器
SpringBoot的核心註解?
SpringBoot如何做到bean管理?
SpringBoot這些註解之間有何區別?
 
 

MySQL

MySQL如何優化?
mysql詳細優化
答:建立索引,儘量減少JAVA訪問數據庫的次數
 
 

MyBatis

 
 

Docker

鏡像和容器是什麼關係?

Session和Cookie的區別

都是會話跟蹤技術。
session的實現依賴於cookie,sessionId(session的唯一標識)需要存放在客戶端
session存在服務器,cookie存在客戶端。
session安全,cookie不安全(本地可以進行cookie欺騙)
session存太多,爲了減輕服務器性能,重要的放在session,其他的放在cookie
單個cookie保存不能超過4k,而許多瀏覽器限制單個網站不超過20個cookie

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