java面試——java常用類庫與技巧


String,StringBuffer,SrtingBuilder的區別

  目錄  

  • java異常

java異常

  異常處理機制主要回答了三個問題

  • what:異常類型回答了什么被拋出
  • where:異常堆棧跟蹤回答了在哪拋出
  • why:異常信息回答了為什么拋出

Java的異常體系

  

  RuntimeException:不可預知的,程序應當自行避免

  1. NullpointException——空指針異常
  2. ClassCastException——類型強制轉換異常
  3. IllegalArragumentException——傳遞非法參數異常
  4. IndexOutOfBoundsException——下標越界異常
  5. NumberFormatException——數字格式異常

  非RuntimeException:可預知的,從編譯器校驗的異常

  1. ClassNotFoundException——找不到指定的class的異常
  2. IOException——IO操作異常

  Error

  1. NoClassDefFoundError——找不到class定義的異常
  2. StackOverflowError——深遞歸導致棧被耗盡而拋出的異常
  3. OutOfMemoryError——內存溢出異常

  NoClassDefFoundError的成因

  1. 類依賴的class或者jar不存在
  2. 類文件存在,但是存在不同的域中
  3. 大小寫問題,javac編譯的時候是無視大小寫的,很有可能編譯出來的class文件就與想要的不一樣

  從責任角度看

  1. Error屬於JVM需要負擔的責任
  2. RuntimeException是程序應該承擔的責任
  3. Check Exception可檢查異常是Java編譯器應該負擔的責任

Error和Exception的區別

  從概念角度解析Java的異常處理機制

  • Error:程序無法處理的系統錯誤,編譯器不檢查
  • Exception:程序可以處理的異常,捕獲后可能恢復
  • 總結:前者是程序無法處理的錯誤,后者是可以處理的異常

Java的異常處理機制

  拋出異常:創建異常對象,交由運行時系統處理

  在用戶看來,應用系統發生的所有異常都是應用系統內部的異常

  • 設計一個通用的繼承自RuntimeException的異常來同一處理
  • 其余異常都統一譯為上述異常AppException
  • 在catch之后,拋出上述異常的子類,並提供足以定位的信息

  Java異常處理消耗性能的地方

  • try-catch塊印象概念股JVM的優化
  • 異常對象實例需要保存棧快照等信息,開銷較大

Java集合框架

  工作中消失而面試卻長存的算法與數據結構

  • 優秀的算法和數據結構被封裝到了Java的集合框架

數據結構考點

  • 數組和鏈表的區別
  • 鏈表的操作,如反轉,鏈表環路檢測,雙向鏈表,循環鏈表相關操作
  • 隊列,棧的應用
  • 二叉樹的遍歷方式及其遞歸和非遞歸的實現
  • 紅黑樹的旋轉

算法考點

  • 內部排序:如遞歸排序、交換排序(冒泡、快排)、選擇排序、插入排序
  • 外部排序:應掌握如何利用有限的內存配合海量的外部存儲來處理超大的數據集,寫不出也要有相關的思路

  

HashMap、HashTable、ConccurentHashMap

  HashMap(Java8以前):數組+鏈表

          hash(key.hashCode())%len

  

 

  HashMap(Java8及以后):數組+鏈表+紅黑樹

    性能從O(n)提高到O(logn)

  

如何優化Hashtable?

  • 通過鎖細粒度化,將整鎖拆解多個鎖進行優化

  早期的ConcurrentHashMap:通過分段鎖Segment來實現

  數據+鏈表

  

ConcurrentHashMap

  當前的ConcurrentHashMap:CAS+synchronized使鎖更細化

  數組+鏈表+紅黑樹

  

ConcurrentHashMap:put方法的邏輯

  1. 判斷Node[]數組是否初始化,沒有則進行初始化操作
  2. 通過hash定位數組的索引坐標,是否有Node節點,如果沒有則使用CAS進行添加(鏈表的頭結點),添加失敗則進入下次循環
  3. 檢查到內部正在擴容,就幫助它一塊擴容
  4. 如果f!=null,則使用synchronized鎖住f元素(鏈表/紅黑二叉樹的頭元素)
    1. 如果是Node(鏈表結構)則執行鏈表ode添加操作
    2. 如果是TreeNode(樹形結構)則執行樹添加操作
  5.  判斷鏈表長度已經達到臨界值,當然這個8是默認值,大家也可以去做調整,當節點數超過這個值就需要把鏈表轉換為樹結構

ConcurrentHashMap總結:比起Segment,鎖拆的更細

  • 首先使用無鎖操作CAS插入頭結點,失敗則循環重試
  • 若頭結點已存在,則嘗試獲取頭結點的同步鎖,再進行操作

 ConcurrentHashMap:注意

  • size()和mappingCount()的一桶,兩者計算是否准確
  • 多線程環境下如何進行擴容

三者的區別

  • HashMap線程不安全,數組+鏈表+紅黑樹
  • Hashtable線程安全,鎖住整個對象,數組+鏈表
  • ConcurrentHashMap線程安全,CAS+同步鎖,數組+鏈表+紅黑樹
  • HashMap的key、value均可為null,而其他的兩個類不支持

 Java.util.concurrent:提供了並發編程的解決方案

  • CAS是java.util.concurrent.atomic包的基礎
  • AQS是java.util.concurrent.locks包以及一些常用類比如Semophore,ReentrantLock等類的基礎

J.U.C包的分類

  • 線程執行器executor
  • 鎖locks
  • 原子變量類atomic
  • 並發工具類tools
  • 並發集合collections

CountDownLatch:讓主線程等待一組時間后繼續執行

  • 事件指的是CountDownLatch里的countDown()

  

CyclicBarrier:阻塞當前線程,等待其他線程

  • 等待其他線程,且會阻塞自己當前線程,所有線程必須同時到達柵欄位置后,才能繼續執行
  • 所有線程到達柵欄處,可以觸發執行另一個預先設置的線程

  

Semaphore:控制某個資源可被同時訪問的線程個數

  

BlockingQueue:提供可阻塞的入隊和出隊操作

  主要用於生產者-消費者模式,在多線程場景時生產者線程在隊列尾部添加元素,而消費者線程則在隊列頭部消費元素,通過這種方式能夠到達將任務的生產和消費進行隔離的目的

  • ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列
  • LinkedBlockingQueue:一個由鏈表結構組成的有界/無界阻塞隊列
  • PriorityBlockingQueue:一個支持優先級排序的無界阻塞隊列
  • DealyQueue:一個使用優先級隊列實現的無界阻塞隊列
  • SynchronousQueue:一個不存儲元素的阻塞隊列
  • LinkedTransferQueue:一個由鏈表結構哦組成的無界阻塞隊列
  • LinkedBlockingQueue:一個由鏈表結構組成的雙向阻塞隊列

  

Java的IO機制

BIO、NIO、AIO

  

Block-IO:InputStream和OutputStream,Reader和Writer

  

  

NonBlock-IO:構建多路復用的、同步非阻塞的IO操作

  

NIO的核心

  • Channels
    • FileChannel
      • transferTo:把FileChannel中的數據拷貝到另一個Channel
      • transferFrom:把另一個Channel中的數據拷貝到FileChannel避免了兩次用戶態巨額內核態間的上下文切換,即“零拷貝”,效率較高
    • DatagramChannel
    • SocketChannel
    • ServerSocketChannel
  • Buufers
    • ByteBuffer
    • CharBuffer
    • DoubleBuffer
    • FloatBuffer
    • IntBuffer
    • LongBuffer
    • ShortBuffer
    • MappedByteBuffer
  • Seletors
     

  

    

  

 select、poll、epoll的區別

  支持一個進程所能打開的最大連接數

  

  FD劇增后帶來的IO效率問題

  

Asynchronus IO:基於時間和回到機制

  

AIO如何進一步加工處理結果

  • 基於回調:實現ComplerionHandlerj接口,調用時觸發回調函數
  • 返回Future:通過isDone()查看是否准備好,通過get()等待返回數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM