1. 程式人生 > >高階程式設計師(JAVA)面試必知必會(問題+答案)

高階程式設計師(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不重複並放入陣列,求陣列的子陣列的最大和,二分查詢演算法的實現及其時間複雜計算