高階程式設計師(JAVA)面試必知必會(問題+答案)
-
Java基本型別哪些,所佔位元組和範圍
-
型別 儲存要求 範圍(包含) 預設值 包裝類 整 int 4位元組(32位) -231~ 231-1 0 Integer 數 short 2位元組(16位) -215~215-1 0 Short 類 long 8位元組(64位) -263~263-1 0 Long 型 byte 1位元組(8位) -27~27-1 0 Byte 浮點 float 4位元組(32位) -3.4e+38 ~ 3.4e+38 0.0f Float 型別 double 8位元組(64位) -1.7e+308 ~ 1.7e+308 0 Double 字元 char 2位元組(16位) u0000~uFFFF(‘’~‘?’) ‘0’ Character (0~216-1(65535)) 布林 boolean 1/8位元組(1位) true, false FALSE Boolean
-
Set、List、Map的區別和聯絡
- Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap -
什麼時候使用Hashmap
- 繼承實現方式不同(
HashMap繼承於AbstractMap,而Hashtable繼承於Dictionary。
- Dictionary是一個抽象類,它直接繼承於Object類,沒有實現任何介面。Dictionary類是JDK 1.0的引入的。雖然Dictionary也支援“新增key-value鍵值對”、“獲取value”、“獲取大小”等基本操作,但它的API函式比Map少;而且Dictionary一般是通過Enumeration(列舉類)去遍歷,Map則是通過Iterator(迭代器)去遍歷。 然而‘由於Hashtable也實現了Map介面,所以,它既支援Enumeration遍歷,也支援Iterator遍歷。
- )
- 初始容量和擴容策略不同(
HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子預設都是0.75
HashMap擴容時是當前容量翻倍即:capacity*2,Hashtable擴容時是容量翻倍+1即capacity*2+1
) -
Hashtable計算hash是直接使用key的hashcode對table陣列的長度直接進行取模
-
HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的雜湊值,然後對table陣列長度取摸
- 使用場景
-
非併發場景使用HashMap,併發場景可以使用Hashtable,但是推薦使用ConcurrentHashMap(鎖粒度更低、效率更高)。
-
另外使用在使用HashMap時要注意null值的判斷,
Hashtable也要注意防止put null key和 null value。 -
HashMap提供對key的Set進行遍歷,因此它是fail-fast的,但HashTable提供對key的Enumeration進行遍歷,它不支援fail-fast
-
什麼時候使用Linkedhashmap、Concurrenthashmap、Weakhashmap
-
哪些集合類是執行緒安全的
-
Vector:就比Arraylist多了個同步化機制(執行緒安全)。
Hashtable:就比Hashmap多了個執行緒安全。
ConcurrentHashMap:是一種高效但是執行緒安全的集合。
Stack:棧,也是執行緒安全的,繼承於Vector。
-
為什麼Set、List、map不實現Cloneable和Serializable介面
- 克隆(cloning)或者序列化(serialization)的語義和含義是跟具體的實現相關的。因此應該由集合類的具體實現類來決定如何被克隆或者序列化
-
Concurrenthashmap的實現,1.7和1.8的實現
-
Arrays.sort的實現
-
什麼時候使用CopyOnWriteArrayList
- CopyOnWrite容器即寫時複製的容器。通俗的理解是當我們往一個容器新增元素的時候,不直接往當前容器新增,而是先將當前容器進行Copy,複製出一個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行併發的讀,而不需要加鎖,因為當前容器不會新增任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。
-
volatile的使用
- volatile是一種輕量級的同步機制,它主要有兩個特性:一是保證共享變數對所有執行緒的可見性;二是禁止指令重排序優化。同時需要注意的是,volatile對於單個的共享變數的讀/寫具有原子性,但是像num++這種複合操作,volatile無法保證其原子性,當然文中也提出瞭解決方案,就是使用併發包中的原子操作類,通過迴圈CAS地方式來保證num++操作的原子性。
-
synchronied的使用
-
reentrantlock的實現和Synchronied的區別
- 這兩種方式最大區別就是對於Synchronized來說,它是java語言的關鍵字,是原生語法層面的互斥,需要jvm實現。而ReentrantLock它是JDK 1.5之後提供的API層面的互斥鎖,需要lock()和unlock()方法配合try/finally語句塊來完成。
-
CAS的實現原理以及問題
-
AQS的實現原理
-
介面和抽象類的區別,什麼時候使用
-
類載入機制的步驟,每一步做了什麼,static和final修改的成員變數的載入時機
-
雙親委派模型
-
反射機制:反射動態擦除泛型、反射動態呼叫方法等
-
動態繫結:父類引用指向子類物件
-
JVM記憶體管理機制:有哪些區域,每個區域做了什麼
-
JVM垃圾回收機制:垃圾回收演算法 垃圾回收器 垃圾回收策略
-
jvm引數的設定和jvm調優
-
什麼情況產生年輕代記憶體溢位、什麼情況產生年老代記憶體溢位
-
內部類:靜態內部類和匿名內部類的使用和區別
-
內部類:
成員內部類可訪問外部類所有的方法和成員變數。
不能有靜態的方法和成員變數。
靜態內部類:
只能訪問外部類的靜態成員變數與靜態方法。
靜態內部類的非靜態成員可訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。
匿名內部類:
沒有類名,沒有class關鍵字也沒有extends和implements等關鍵字修飾。
類的定義和物件的例項化同時進行。
-
Redis和memcached:什麼時候選擇redis,什麼時候選擇memcached,記憶體模型和儲存策略是什麼樣的
-
MySQL的基本操作 主從資料庫一致性維護
-
mysql的優化策略有哪些
-
mysql索引的實現 B+樹的實現原理
-
什麼情況索引不會命中,會造成全表掃描
-
java中bio nio aio的區別和聯絡
-
為什麼bio是阻塞的 nio是非阻塞的 nio是模型是什麼樣的
-
Java io的整體架構和使用的設計模式
-
Reactor模型和Proactor模型
-
http請求報文結構和內容
-
http三次握手和四次揮手
-
rpc相關:如何設計一個rpc框架,從io模型 傳輸協議 序列化方式綜合考慮
-
Linux命令 統計,排序,前幾問題等
- sort data | uniq -c | sort -k 1 -n -r | head 10
-
StringBuff 和StringBuilder的實現,底層實現是通過byte資料,外加陣列的拷貝來實現的
-
cas操作的使用
-
記憶體快取和資料庫的一致性同步實現
-
微服務的優缺點
-
微服務優點
1、通過分解巨大單體式應用為多個服務方法解決了複雜性問題,每個微服務相對較小
2、每個單體應用不侷限於固定的技術棧,開發者可以自由選擇開發技術,提供API服務。
3、每個微服務獨立的開發,部署
4、單一職責功能,每個服務都很簡單,只關注於一個業務功能
5、易於規模化開發,多個開發團隊可以並行開發,每個團隊負責一項服務
6、改善故障隔離。一個服務宕機不會影響其他的服務
微服務缺點:
1.開發者需要應對建立分散式系統所產生的額外的複雜因素
l 目前的IDE主要面對的是單體工程程式,無法顯示支援分散式應用的開發
l 測試工作更加困難
l 需要採用服務間的通訊機制
l 很難在不採用分散式事務的情況下跨服務實現功能
l 跨服務實現要求功能要求團隊之間的緊密協作
2.部署複雜
3.記憶體佔用量更高
-
執行緒池的引數問題
-
ip問題 如何判斷ip是否在多個ip段中
-
判斷陣列兩個中任意兩個數之和是否為給定的值
-
樂觀鎖和悲觀鎖的實現
-
synchronized實現原理
-
你在專案中遇到的困難和怎麼解決的
-
你在專案中完成的比較出色的亮點
-
訊息佇列廣播模式和釋出/訂閱模式的區別
-
生產者消費者程式碼實現
-
死鎖程式碼實現
-
執行緒池:引數,每個引數的作用,幾種不同執行緒池的比較,阻塞佇列的使用,拒絕策略
-
Future和ListenableFuture 非同步回撥相關
-
演算法相關:判斷能否從陣列中找出兩個數字和為給定值,隨機生成1~10000不重複並放入陣列,求陣列的子陣列的最大和,二分查詢演算法的實現及其時間複雜計算