2019年Java常見面試問題

一.JAVA

Java中8大基本類型佔用的字節數?

  • 1字節: byte , boolean
  • 2字節: short , char
  • 4字節: int , float
  • 8字節: long , double
    注:1字節(byte)=8位(bits)

==和equals的區別是什麼?

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

final在java中有什麼作用?

final修飾的類叫最終類,該類不能被繼承.
final修飾的方法不能被重寫
final修飾的變量是常量,常量必須初始化,初始化之後不能被修改

java容器有哪些?

java容器分爲Collection和Map兩大類.其下又有很多子類.如下所示:

Collection

  • List ---------- ArrayList, LinkedList, Vector, Stack
  • Set ---------- HashSet, LinkedHashSet, TreeSet

Map

  • HashMap LinkedHashMap
  • TreeMap
  • ConcurrentHashMap
  • HashTable

HashMap和Hashtable有什麼區別?

  • 存儲: HashMap運行key和value爲null,而Hashtable不允許.
  • 線程安全: Hashtable是線程安全的,而HashMap是非線程安全的.
  • 推薦使用: 在Hashtable的類註釋可以看到,Hashtbale是保留類不建議使用,推薦在單線程環境下使用HashMap替代,如果需要多線程則用ConcurrentHashMap替代

HashMap的實現原理?

HashMap是使用拉鍊法.HashMap基於Hash算法實現,通過put(key,value)存儲,get(key)來獲取.當傳入key時,HashMap會根據
key.hashCode()計算hash值,根據hash值將value保存在bucket裏.當計算出的hash值相同時,我們稱之爲hash衝突
HashMap的做法是用鏈表和紅黑樹存儲相同的hash值得value.當hash衝突的個數比較少時,使用鏈表,當大於8個時使用紅黑樹.

ArrayList和LinkedList的區別是什麼?

  • 數據結構實現: ArrayList是動態數組的數據結構實現,而LinkedList是雙向鏈表的數據結構實現.
  • 隨機訪問效率: ArrayList在隨機訪問的時候效率要高,因爲LinkedList是線性的數據存儲方式,所以需要移動指針從前往後一次查找.
  • 增加和刪除效率: 在非首尾的增加和刪除操作,LinkedList要比ArrayList效率要高,因爲ArrayList增刪操作要影響數組內的其他數據的下標.
    綜合來說,在需要頻繁讀取集合中的元素時,更推薦使用ArrayList,而在插入和刪除操作比較多時,更推薦使用LinkedList.

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

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

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

  • 方法一: 使用安全類,比如Java.util.concurrent下的類.
  • 方法二: 使用自動鎖synchronized
  • 方法三: 使用手動鎖Lock

什麼是反射?

反射是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用他的任意一個方法和屬性;
這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制.

tcp和udp的區別?

tcp和udp是OSI模型中的運輸層中的協議.tcp提供可靠的通信傳輸.而udp則常被用於讓廣播和細節控制交給應用的通信傳輸.
兩者的區別大致如下:

  • tcp面向連接,udp面向非連接即發送數據前不需要建立連接;
  • tcp提供可靠的服務(數據傳輸),udp無法保證;
  • tcp面向字節流,udp面向報文;
  • tcp數據傳輸慢,udp數據傳輸快;

如何實現跨域?

  • 服務器端運行跨域 甚至CORS等於*;
  • 在單個接口使用註解@CorssOrigin運行跨域;
  • 使用jsonpk跨域;

說一下你熟悉的設計模式?

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

mybatis 的 dao 接口跟 xml 文件裏面的sql 是如何建立關係的?

是通過JDK動態代理,返回了一個Dao接口的代理對象,這個代理對象的處理器是MapperProxy對象。所以,我們通過@Autowired注入Dao接口的時候,注入的就是這個代理對象,我們調用到Dao接口的方法時,則會調用到MapperProxy對象的invoke方法。
只要保證namespace+id唯一即可

二.數據庫

事務的四大特性?

  • 原子性
  • 一致性
  • 隔離性
  • 持久性

四種隔離級別?

  • ① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
  • ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
  • ③ Read committed (讀已提交):可避免髒讀的發生。
  • ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

不考慮事務的隔離性,會發生什麼問題?

  • 髒讀
  • 不可重複讀
  • 幻讀

數據庫的索引有哪些?

  • 普通索引(INDEX):最基本的索引,沒有任何限制
  • 唯一索引(UNIQUE):與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
  • 主鍵索引(PRIMARY):它 是一種特殊的唯一索引,不允許有空值。
  • 全文索引(FULLTEXT ):僅可用於 MyISAM 表, 用於在一篇文章中,檢索文本信息的, 針對較大的數據,生成全文索引很耗時好空間。
  • 組合索引:爲了更多的提高mysql效率可建立組合索引,遵循”最左前綴“原則。

什麼操作會破壞索引?

  • 1.如果條件中有or,即使其中有條件帶索引也不會使用;要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引.
  • 2.like查詢是以%開頭
  • 3.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
  • 4.對於多列索引,不是使用的第一部分,則不會使用索引
  • 5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引

Mysql 性能優化

  • 爲搜索字段創建索引。
  • 避免使用 select *,列出需要查詢的字段。
  • 垂直分割分表。
  • 選擇正確的存儲引擎。
  • 使用join時,小表驅大表
  • 避免字段爲null

Sql優化方法

1.索引的優化?

  • 只要列中含有NULL值,就最好不要在此例設置索引,複合索引如果有NULL值,此列在使用時也不會使用索引
  • 儘量使用短索引,如果可以,應該制定一個前綴長度
  • 對於經常在where子句使用的列,最好設置索引,這樣會加快查找速度
  • 對於有多個列where或者order by子句的,應該建立複合索引
  • 對於like語句,以%或者‘-’開頭的不會使用索引,以%結尾會使用索引
  • 儘量不要在列上進行運算(函數操作和表達式操作)
  • 儘量不要使用not in和<>操作

2.sql語句的優化?

  • 查詢時,能不要就不用,儘量寫全字段名
  • 大部分情況連接效率遠大於子查詢
  • 多使用explain和profile分析查詢語句
  • 查看慢查詢日誌,找出執行時間長的sql語句優化
  • 多表連接時,儘量小表驅動大表,即小表 join 大表
  • 在千萬級分頁時使用limit
  • 對於經常使用的查詢,可以開啓緩存

3.表的優化?

  • 表的字段儘可能用NOT NULL
  • 字段長度固定的表查詢會更快
  • 把數據庫的大表按時間或一些標誌分成小表
  • 將表分區

三.Spring

爲什麼要使用 spring?

spring 提供 ioc 技術,容器會幫你管理依賴的對象,從而不需要自己創建和管理依賴對象了,更輕鬆的實現了程序的解耦。
spring 提供了事務支持,使得事務操作變的更加方便。
spring 提供了面向切片編程,這樣可以更方便的處理某一類的問題。
更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。

解釋一下什麼是 aop?

aop 是面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。
簡單來說就是統一處理某一“切面”(類)的問題的編程思想,比如統一處理日誌、異常等。

解釋一下什麼是 ioc?

ioc:Inversionof Control(中文:控制反轉)是 spring 的核心,對於 spring 框架來說,就是由 spring 來負責控制對象的生命週期和對象間的關係。
簡單來說,控制指的是當前對象對內部成員的控制權;控制反轉指的是,這種控制權不由當前對象管理了,由其他(類,第三方容器)來管理。

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

setter 屬性注入
構造方法注入
註解方式注入

spring 中的 bean 是線程安全的嗎?

spring 中的 bean 默認是單例模式,spring 框架並沒有對單例 bean 進行多線程的封裝處理。

實際上大部分時候 spring bean 無狀態的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 對象),那就要開發者自己去保證線程安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更爲“prototype”,這樣請求 bean 相當於 new Bean()了,所以就可以保證線程安全了。

有狀態就是有數據存儲功能。
無狀態就是不會保存數據。

spring 事務實現方式有哪些?
聲明式事務:聲明式事務也有兩種實現方式,基於 xml 配置文件的方式和註解方式(在類上添加 @Transaction 註解)。
編碼方式:提供編碼的形式管理和維護事務。

Spring boot優勢

(1)獨立運行的Spring項目
Spring Boot可以以jar包的形式進行獨立的運行,使用:java -jar xx.jar 就可以成功的運行項目,或者在應用項目的主程序中運行main函數即可;
(2)內嵌的Servlet容器
內嵌容器,使得我們可以執行運行項目的主程序main函數,並讓項目的快速運行;
(3)提供starter簡化Manen配置
Spring Boot提供了一系列的starter pom用來簡化我們的Maven依賴
(4)自動配置Spring
Spring Boot會根據我們項目中類路徑的jar包/類,爲jar包的類進行自動配置Bean,這樣一來就大大的簡化了我們的配置。當然,這只是Spring考慮到的大多數的使用場景,在一些特殊情況,我們還需要自定義自動配置;
(5)應用監控
Spring Boot提供了基於http、ssh、telnet對運行時的項目進行監控;

SpringCloud五大核心組件?

  • 服務發現——Netflix Eureka
  • 客服端負載均衡——Netflix Ribbon
  • 斷路器——Netflix Hystrix
  • 服務網關——Netflix Zuul
  • 分佈式配置——Spring Cloud Config

四.JVM

JVM模型?

  • 程序計數器
  • JVM棧
  • 本地方法棧
  • 方法區

五.Redis

redis持久化方式?

  • RDB(redis database):在指定的時間間隔能對你的數據進行快照存儲。
  • AOF(append only file):記錄每次對服務器寫的操作,當服務器重啓的時候會重新執行這些命令來恢復原始的數據。

redis有哪些數據類型?

  • String
  • Hash
  • List
  • Set
  • zset
    在這裏插入圖片描述

redis常見應用場景?

  • 全頁面緩存
  • 排行榜
  • Session 存儲
  • 隊列
  • 發佈/訂閱

六.多線程

線程池的幾種常見的創建的方式?

一:創建大小不固定的線程池
二:創建固定數量線程的線程池
三:創建單線程的線程池
四:創建定時線程

java類庫提供一個靈活的線程池以及一些有用的默認配置;我們可以通過Executors的靜態方法來創建線程池。
一: newCachedThreadPool()
二: newFixedThreadPool(int nThreads)
三: newSingleThreadExecutor()
四: newScheduledThreadPool(int corePoolSize)

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