java面試題整理(1)

1.0 整理目的

我們整理面試題總的來目的有三點,
一、是我們看看自己有哪些不足,給自己找一個學習的方向,
二、是通過整理,瞭解一下自己的技術體系
三、對付面試

2.0 面試題

  1. springmvc和spring-boot區別

Spring MVC是基於 Servlet 的一個 MVC 框架 主要解決 WEB 開發的問題,因爲 Spring 的配置非常複雜,各種XML、 JavaConfig、hin處理起來比較繁瑣。於是爲了簡化開發者的使用,從而創造性地推出了Spring boot,約定優於配置,簡化了spring的配置流程。
說得更簡便一些:Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應用組件。大家覺得挺好用,於是按照這種模式搞了一個 MVC框架(一些用Spring 解耦的組件),用開發 web 應用( SpringMVC )。然後有發現每次開發都寫很多樣板代碼,爲了簡化工作流程,於是開發出了一些“懶人整合包”(starter),這套就是 Spring Boot。

  1. @Autowired的實現原理
  2. Bean的默認作用範圍是什麼?其他的作用範圍?

bean的默認範圍是單例 其他的範圍分別爲多例,session 全局session application

  1. 索引是什麼概念有什麼作用?MySQL裏主要有哪些索引結構?哈希索引和 B+樹索引比較?

索引是一種對數據庫的一行或多行進行排序的數據結構,科技加快對特定信息的訪問速度。mysql主要所有B樹索引與hash索引(用在特定的表中) 相對於Btree索引,hash索引的查找速度更快,但是不支持排序和範圍查找

  1. Java線程池的原理?線程池有哪些?線程池工廠有哪些線程池類型,及其線程池參數是什麼

java線程池的原理是 首先他有一個核心線程池所謂核心線程池就是不銷燬的線程池,也就是固定的線程池,當請求來的時候,如果核心線程池有空閒則用核心線程去處理,如果核心線程池沒有空閒並且核心線程的數量沒有達到最大,就創建一個新的核心線程,核心線程一旦創建就不會銷燬,其次他還有一個最大線程池的概念,作用是當核心線程池沒有空閒的時候,就新建一個線程去處理任務,處理完任務等待一定時間後沒有新的請求進來,那麼這個核心線程池之外的新建線程就會被銷燬。如果這個任務沒有處理完,那麼接下來的任務到了,就會繼續創建新的線程去處理,新建的線程的數量加上核心線程數加起來不能超過最大線程數。如果新建的線程數到達最大了但是 還有新的任務來了,任務就會進入任務等待隊列中去,根據不同的任務等待隊列,可以分爲不同類型的線程池,任務隊列也滿了 就會執行相應的處理策略,根據其原理可知 線程池參數分爲 核心線程池數量 最大線程池數量,超時時間 時間單位 任務隊列類型 對拒絕任務的處理策略
java線程工廠創建的線程池的類型分爲:
newSingleThreedExecutor()有多個構造函數
保證只有一個工作線程在處理任務 不會拒絕任務 任務隊列是無界阻塞隊列,最大線程等於核心線程等於1
newFixedThreedExecutor() 創建固定數量的線程池 和上個不同 他的核心線程數等於最大線程數 隊列爲無界阻塞隊列
newCacheThreedExecutor() 動態的創建線程,線程的生存和毀滅與線程池原理一致,最大的線程數是Integer的最大值,核心線程池大小爲0,隊列爲不存儲的阻塞隊列
newSheduleThreedExecutor() 定時執行的線程池

  1. hashmap原理,處理哈希衝突用的哪種方法?

hashMap 在jdk1.8之前所用的技術是數組加鏈表的方式進行的
例如:我們要存儲String a = “測試”; a的hash值 是10234;
hashmap的數組結構也叫table 初始值爲16 下標最大是15 對應二進制是01111
對hash進行二次哈希的值與01111進行與運算,結果就是這個值存儲在數組中的位置,假設是4,
而加入我們另一個hash值計算後的存儲位置也是4,那麼就會以鏈表的形式存儲起來,這就是數組加鏈表的結構
處理hash衝突一共有開放定址法和拉鍊法,hashmap 用的就是拉鍊法

  1. Java GC機制?GC Roots有哪些?

通過可達性分析算法找到的對象都是不會被回收的對象,其他的對象會被標記一次,可達性分析算法是根據GC Roots 找到引用鏈上的對象都是不可回收的,
GC roots有哪些呢? 靜態變量,常量,棧中的引用或者對象(就是說正在運行的方法中的引用的對象) 本地方法中中的引用或者對象

  1. Java怎麼進行垃圾回收的?什麼對象會進老年代?垃圾回收算法有哪些?爲什麼新生代使用複製算法?

8.1 java的垃圾回收採用分代回收算法,
年輕帶採用的是複製算法,年輕代分爲三個區域
eden from to 對象剛開始進入eden區和一個from區 from和to的大小是一樣的
第一次清理後存活的對象進入to 區 然後在來的進圖eden區和to區
在清理後存活的進入from區
當eden區滿的時候 會進行一次minor GC 也就事年輕代GC
8.2 老年代採用的是標記清理或者標記整理的算法
8.3 什麼樣的對象會進入到老年代呢?
1. 大對象直接進入老年代 什麼樣的對象是大對象呢?典型的是很長的字符串和數組
2. 一直存活的對象進入老年代 每經歷一次垃圾回收,對象的分代年齡都會加1
待等到分代年齡大於等於默認的或者說我們設置的值,就會進入老年代
3. 動態年齡判定 當eden區的對象年齡相同的對象的數目大於倖存去一半的時候,大於
等於這個年齡的對象就會進入老年代
4. 空間分配擔保的時候需要用到老年代
就是說我們在進行年輕代GC的時候,假如一個都沒有回收 那麼老年代能不能裝下?
能裝下就回收,裝不下呢?就看看虛擬機允不允許進行擔保失敗,允許的話,
就看進入老年代的歷史對象大小的平均值和老年代目前可用大小進行比較,
現在的內存大,就冒險進行一次內存回收,否則就會進行fullGC
8.4 垃圾回收算法有 標記清除 標記整理 複製算法
8.5 新生代存活的對象很少 採用複製算法效率最高

  1. HashMap的時間複雜度?HashMap中Hash衝突是怎麼解決的?鏈表的上一級結構是什麼?Java8中的HashMap有什麼變化?紅黑樹需要比較大小才能進行插入,是依據什麼進行比較的?其他Hash衝突解決方式?

時間複雜度是O(1),拉鍊法 解決哈希衝突採用的是拉鍊法.鏈表的上一級是數組,Java8中 如果鏈表的長度大於8就會轉換爲紅黑樹進行存儲,是根據插入節點的hash值比較的,其他的解決衝突的方式是開放定址法.

  1. hash和B+樹的區別?分別應用於什麼場景?哪個比較好?

hash的效率比較高時間複雜度是O(1),B+樹可以進行範圍查詢,hash樹不可以.分情況如果是範圍查詢肯定是B+樹好多了,hash索引在遇見大量hash值相等的情況下,效率不一定會比B數效率高,擴容的時候效率也不行呀

  1. 項目裏有個數據安全的,aes和md5的區別?詳細點

aes是對稱加密,MD5是單向加密 一般是驗證完整性的不用於加密

三 數據庫面試題

  1. 爲什麼MyISAM查詢性能好?

好是相對與innodb來說的,innodb支持行級鎖事務,併發行好,既然他支持這個,所以維護的東西 就多,索引效率自然比不上myisam 因爲Myisam不支持行級鎖,所以他查詢的時候直接就是表加偏移量,那麼innodb呢?他是表到行,定位肯定不如偏移量快,另外他還要維護併發性相對來說myisam快一點

  1. 事務特性(acid)

a 原子性 一系列操作要麼全成功 要麼全失敗 例如:起牀洗臉刷牙 要麼全部搞定上班去了 要麼洗臉這出問題了,時光倒流到你連牀還沒起的時候;
c 一致性 就是說假如事務是同時發生的,那麼無論怎麼變化 系統總量是不變的,可以理解爲物質守恆定律,就是五個賬戶每個賬戶有100塊錢,無論你怎麼轉帳,總錢數還是500
i 隔離性 就是事務串行化,同一時間只有一個事務請求同一數據
d 持久性 事務一旦完成,就不會在變了就存在數據庫裏了不會回滾了

  1. 隔離級別

讀未提交 級別最低 髒讀 幻讀 不可重複讀都會產生
不可重複讀 就髒讀不會發生
重複讀 就幻讀會發生
串行化 都不會發生
擴展;
髒讀: (都是針對事務) 你發微信消息給我,我看到了 然後你撤回了 就是說實際上你沒發 這就是髒讀(撤回對應事務的回滾);
不可重複讀:字面意思就是說重複度會出問題所以出現了不可以重複讀的問題,例如:你發博客說你真美,我看見了.然後我在一次刷新讀的時候,你修改了博客說你真醜 兩次讀的情況不一致,這就是不可重複讀
幻讀:就是說你在修改數據庫表的時候,假設把字段id所有的值都修改爲1,這時候我又插入了一條數據id爲123.你修改後刷新一看,我擦 我這個值咋沒改呢?這就是幻讀 好像是幻覺一樣 解決方法方法是加表鎖
幻讀的問題是增加或者刪除,不可重複讀的場景一般是修改

  1. SQL慢查詢的常見優化步驟?

常見的慢查詢原因有:1.語句問題 沒有命中索引 2.mysql的bug 3.硬件問題 4.鎖的問題 5. IO/cpu的爭用
解決方法: 使sql命中索引,例如不要使用 select *;不要在數據庫中做計算,模糊查詢的時候%asd 這樣索引不起作用, 注意屬性隱式轉換的問題
規避大事務,limit的使用問題,不要再order by下用排序 如果排序用升序.注意符合索引的問題

  1. 說下樂觀鎖,悲觀鎖,並寫出sql實現

樂觀鎖,假設不會發生數據衝突,只有在更新的時候才加鎖(由應用實現)
悲觀鎖,假設數據肯定會發生衝突,所以讀的時候就開始加鎖(有數據庫實現)
悲觀鎖的實現select …for update 例如select id from user where id = 2 for update;
樂觀鎖由應用實現,一般是在數據庫表結構中添加version字段 每次更新都加1 然後每次與version 對比,一樣就更新 同時加1

  1. TCP協議的三次握手和四次揮手過程?

tcp連接的三握手核心是接收方和發送方各收到一次反饋
tcp斷開連接的核心是在確定各收到一次反饋的同時確保不能及時斷開的連接能夠及時斷開(具體過程百度吧)

  1. 用到過哪些rpc框架

京東的jsf 阿里的doubbo

  1. 數據庫的jdbc連接過程
  1. 反射加載
  2. 獲取連接
  3. 寫sql
  4. 執行
  5. commit
  6. 獲取結果
  7. 關閉連接
  1. Java web過濾器的生命週期
  1. 首先是servle容器的加載和實例化 就是spring中@Countroller實例化
  2. 調用init方法進行初始化
  3. 服務處理 service() 方法 處理請求 業務邏輯 返回響應 這是一個多線程的方法
  4. 請求終止 destroy() 銷燬servlet實例, init和destroy整個生命週期只執行一次

四 其他

  1. ConcurrentHashMap 在Java7和Java8中的區別?爲什麼Java8併發效率更好?什麼情況下用HashMap,什麼情況用ConcurrentHashMap?

Java8相比Java7取消了segment結構.每個數組節點就是一個桶,可以接鏈表也可以接紅黑樹,鏈表長度超過8就會轉換爲紅黑樹
單線程的情況下可以用紅黑樹,多線程需要用concurrentHashMap 鎖分段技術

  1. 加鎖有什麼機制?

樂觀鎖 悲觀鎖 行鎖(排他鎖) 表鎖(5種)

  1. ThreadLocal?應用場景?

每一個ThreadLocal能夠放一個線程級別的變量,可是它本身能夠被多個線程共享使用,並且又能夠達到線程安全的目的,且絕對線程安全。
作用域是他的坑 因爲是線程變量 所以生命週期同線程 對於線程池來說,線程不消失.所以容易使開發者不知道他的作用範圍
ThreadLocal儘量使用在一個全局的設計上

  1. 數據庫水平切分,垂直切分的設計思路和切分順序
  2. Redis如何解決key衝突

鏈地址法 同hashmap

  1. soa和微服務的區別?

SOA 面向服務的架構
微服務架構與SOA相比缺少了ESB(企業服務總線) 微服務是去中心化的
微服務的粒度比SOA更細
SOA中的單個服務可以拆分成多個微服務
微服務中每個服務都有自己的領域模型,SOA中只有一個domain
服務互聯編寫的技術不同
微服務每個服務有自己的數據庫一般爲NOSQL SOA一般用同一個數據庫,爲MYSQL或者Oracle

  1. 單機系統演變爲分佈式系統,會涉及到哪些技術的調整?請從前面負載到後端詳細描述。

數據庫: 訪問量變大 逐句庫變主從.數據庫的數據一致性需要得到保證
數據庫要從一個數據庫,分離爲多數據庫
服務器:由一個到多個,注意負載均衡, session 系統間的通信(http?rpc?)
避免分佈式事務
服務治理?監控?運維?管理中心

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