Java面試題

    近段時間在準備實習的面試,在網上看到一份面試題,就慢慢試着作,爭取天天積累一點點。
    暫時手頭上的面試題只有一份,題量仍是挺大的,有208題,因此可能講的不是很詳細,只是我本身幫助記憶的筆記,但願對大家有啓發,同時有什麼說的不許確的能夠互相討論一下。
    如今天天給本身在面試題編寫的任務是4題,有時候忙起來可能就沒有時間寫了,可是爭取日更,即便當天沒更也會在以後的更新補上。java

  • JDK 和 JRE 區別面試

    • JDK全名爲Java development kit
    • JRE全名爲Java Runtime environment
    • JDK包括JRE,編譯器javac,以及不少調試和分析工具,例如jconsole等等
    • Java程序運行環境必須有JRE
  • ==和equals的區別數組

    • 在基本數據類型對比中,==用於對比二者是否相等,沒有equals的適用
    • equals是Object類的實例方法,若子類沒有重寫equals方法,則跟==做用一致
    • 在引用數據類型對比中,==用於對比實例內存地址是否相同,若引用都指向同一對象,則返回true
    • 在引用數據類型對比中,euqals的返回值取決於重寫邏輯
  • 兩個對象的 hashCode()相同,則 equals()也必定爲 true,對嗎緩存

    • equals用於對比對象間是否相等
    • hasCode則是給對象返回一個hash code值
    • 在使用Object默認的hasCode以及equals時,equals返回爲true
    • 若hasCode或equals任一方法被重寫,返回的結果取決於重寫邏輯的實現
  • final 在 Java 中做用安全

    • final能夠修飾類,方法,變量
    • final修飾類,則該類不能被繼承,且類內全部方法自動指定爲final方法
    • final修飾方法,則該方法不能被繼承,類內private隱式指定爲final方法
    • final修飾基本數據類型變量,則該變量需在定義時指定初始值,且後續該值不能被改變
    • final修改引用類型的變量,則該變量不能再指向其餘對象。
    • final修飾變量,在編譯時JVM已經將他做爲常量,存放於常量池中
  • Java 中的 Math.round(-1.5)多線程

    • Java 中的 Math.round(-1.5) 等於-1
    • Java 中的 Math.round(-1.4) 等於-1
    • Java 中的 Math.round(-1.6) 等於-2
  • String 屬於基礎的數據類型嗎併發

    • String不屬於基礎數據類型,屬於引用數據類型
    • String擁有不少方法對字符串進行處理,翻轉裁切追加等等
  • Java 中操做字符串都有哪些類?它們之間有什麼區別?函數

    • StringBuilder以及StringBuffer
    • StringBuffer爲線程安全的,性能較StringBuilder弱
    • StringBuilder爲線程不安全的,可是性能比StringBuffer好
    • 若無線程安全的考慮,一般使用StringBuilder
  • String str="i"與 String str=new String(「i」)同樣嗎工具

    • 不同
    • 二者的引用都存放於棧中,可是前一引用指向常量池,後一引用指向堆中對象中,對象再指向常量池
  • 如何將字符串反轉性能

    • 採用遞歸以及二分法進行字符串反轉
    • 調用String中的reverse方法進行反轉
    • 正序遍歷字符串倒序拼接字符串
    • 將字符串轉換成字符數組,倒序遍歷數組拼接
    • 正序遍歷1/2長度字符串,將開頭以及對應結尾的字符對調
  • String 類的經常使用方法

    • 字符類

      * charAt(int),根據索引找到索引上字符
      * indexOf,尋找條件在當前字符串上的索引
    • 字符串信息類

      * length,字串長度
      * isEmpty,判斷字符串是否爲空
    • 字符串操做類

      * trim,刪除字符串中全部空格
      * substring,截取一部分字符串
      * toUpperCase,將字符串全變成大寫
      * spilt,根據條件切割字符串並返回數組
      * concat,追加字符串
    • 對比

      * equals
      * compareTo
  • 抽象類必需要有抽象方法嗎

    • 抽象類中能夠不含有抽象方法,平常開發主要使用抽象類做爲模板,若抽象類不含抽象方法,我以爲喪失了抽象類原有的功能
  • 普通類和抽象類有哪些區別

    • 普通類能夠實例化,抽象類不能夠
    • 普通類不能有抽象方法,抽象類能夠含有抽象方法
    • 抽象類被繼承時必須選擇繼承父類的一個構造方法
  • 抽象類能使用 final 修飾嗎?

    • 抽象類不能用final修飾。
    • final修飾的類不能被繼承,抽象類設計的初衷就是爲了被繼承
  • 接口和抽象類有什麼區別?

    • 接口不能有抽象方法,抽象類能夠
    • 接口內方法只聲明不實現,抽象類的方法能夠有具體實現
    • 接口內變量默認爲final static,抽象類變量跟普通類一致
    • 接口方法默認是public
    • 普通類能夠實現多個接口,只能繼承一個抽象類
  • Java 中 IO 流分爲幾種?

    • 操做對象來看,分爲字節流,字符流
    • 流的流向來看,分爲輸入流輸出流
    • 整體來講,流分爲節點流和處理流,應用了裝飾模式,用處理流包裝節點流,達到代碼通用性
  • BIO、NIO、AIO 有什麼區別?

    • BIO,從發起I/O請求開始到接收結果,線程都是阻塞的
    • NIO,線程發起I/O請求後馬上返回,當接收數據時,I/O通知線程,線程阻塞獲取結果
    • AIO,線程發起I/O請求後馬上返回,I/O操做不阻塞線程,結果經過回調函數進行返回
  • File的經常使用方法都有哪些?

    • 獲取文件名字及路徑

      * getName,獲取文件名字
      * getPath。獲取文件當前路徑
      * getPath,獲取文件絕對路徑
      * isAbsoulute,判斷文件是否絕對路徑
    • 文件信息

      * canRead/canWrite,是否可讀/可寫
      * isFile,是不是文件
      * isDirectory,是不是目錄
      * length,文件內容長度
    • 文件操做

      * createFile,新建一個文件/目錄
      * delete,刪除當前文件/目錄
      * exists,判斷文件/目錄是否存在
  • Java 容器都有哪些?

    • java容器主要分兩種,單一數據類型以及鍵值對:Collection以及map
    • Collection包括List,Set,Queue,List爲有序列表,Set爲無序列表,Queue爲隊列實現
    • Map子類以及接口底層實現不同,可是高層使用是同樣的
  • Collection 和 Collections 有什麼區別?

    • Collection爲java集合類,Collections爲java集合操做類
    • Collections經常使用方法

      * addAll
      * binarySearch,二分查找
      * emptyList,返回一個有序空列表
      * synchronizedXxx,將線程不安全的集合轉換成線程安全的集合
    • Collection具備Set,List,Queue子接口,用於多數據的存儲以及使用
  • List、Set、Map 之間的區別是什麼?

    • Set爲無序集合,List爲有序列表,Map爲鍵值對集合
    • Set的底層實現爲:Map的全部value置爲null封裝而成,Map的key是惟一的,因此Set不容許重複元素
    • Set不容許重複元素,List容許重複元素
    • Set和List只容許存儲單一元素,Map容許存儲有映射關係的鍵值對
  • HashMap 和 Hashtable 有什麼區別?

    • HashMap爲線程不安全,Hashtable線程安全
    • HashMap容許使用null做爲key或value,Hashtable不容許
    • Hashtable使用Enumeration遍歷,HashMap沒有專門的迭代器,可是能夠經過遍歷key的集合或者entry對,也可使用java8的函數接口進行遍歷
  • 如何決定使用 HashMap 仍是 TreeMap?

    • HashMap爲無序集合,TreeMap爲有序集合
    • HashMap底層存儲結構爲數組,TreeMap爲紅黑樹
    • 數據量大且須要按照key排序時,使用TreeMap
    • 數據量小且對順序無要求時,使用HashMap
    • 若查找操做佔大部分時,使用HashMap,插入刪除大部分時使用TreeMap
  • 說一下 HashMap 的實現原理?

    • HashMap底層封裝了一個Entry數組,元素位置基於Object類的hashCode函數計算
    • 當出現哈希衝突時,採用拉鍊法解決衝突
    • 數組的初始大小由capacity決定,默認是16
    • 當數組達到必定限度時,觸發到負載因子的極限,數組進行動態擴容,擴容後的大小爲原大小的兩倍

2019.4.24更新

  • 說一下 HashSet 的實現原理?

    • HashSet底層爲HashMap,方法幾乎都是調用HashMap相關方法實現
  • ArrayList 和 LinkedList 的區別是什麼?

    • ArrayList底層實現爲數組,當數組元素個數達到數組長度時,數組將進行動態擴容
    • LinkedList底層實現爲鏈表,原則上不存在元素個數飽和的狀況
    • ArrayList經常使用於隨機訪問場景
    • 在添加刪除場景中,ArrayList主要耗時爲System.arrayCopy,Linked
List則是經過for循環尋找插入位置。
* 數據量小於30,二者沒有明顯差異,當數據量大於容量1/10時,LinkedList的效率沒有ArrayList高
* 在元素個數大體相等的狀況下,二者遍歷的性能差很少
  • 如何實現數組和 List 之間的轉換?

    • List轉Array

      • 調用List成員方法toArray
      • for循環生成Array
    • Array轉List

      • 調用Arrays類方法asList
      • for循環生成
  • ArrayList 和 Vector 的區別是什麼?

    • Vector爲jdk1.0的集合類,內部經過數組實現,支持Enumeration遍歷
    • ArrayList爲1.2的集合類,內部經過數組實現,支持Iterator遍歷
    • Vector線程同步,ArrayList線程不一樣步
    • 內存不足時,Vector默認擴展1倍,ArrayList默認擴展1.5倍
  • Array 和 ArrayList 有何區別?

    • Array能夠含有基本數據類型和引用類型,ArrayList只能包括引用類型
    • Array的大小是固定的,ArrayList大小能夠動態增長
    • ArrayList對數據的處理方法比Array多,ArrayList爲Array的增強版
    • Array的元素數據類型同樣,ArrayList在未指定泛型的前提下數據類型能夠多樣
    • 實際開發中Array不經常使用,主要用於肯定元素個數的場景中。多用ArrayList

2019.04.25更新

  • 在 Queue 中 poll()和 remove()有什麼區別?

    • 在隊列不爲空時,二者的做用都是返回隊頭元素
    • 在隊列爲空時,使用poll方法會返回null,使用remove則會拋出NoSuchElementException異常
  • 哪些集合類是線程安全的?

    • Hashtable,Vector,Stack
    • 由Collections的synchronizedXxx方法包裝的集合
    • java.util.concurrent包中的集合

      • ConcurrentHashMap
      • CopyOnWriteArrayList/CopyOnWriteArraySet
  • 迭代器 Iterator 是什麼?

    • Iterator隱藏了Collection實現類的具體細節,提供不少對集合元素進行迭代的方法
  • Iterator 怎麼使用?有什麼特色?

    • 使用集合類的成員方法獲取Iterator實例
    • hasNext,檢查是否具備下一迭代元素
    • next,獲取下一迭代元素
    • forEachRemaining,java 8新增的方法,利用函數式接口進行迭代
    • remove,移除底層集合元素

2019.04.26更新

  • Iterator 和 ListIterator 有什麼區別?

    • 相同

      * 都是迭代器,均可以用於迭代Collection集合
      * 均可以順序向後遍歷集合元素
      * 均可以移除底層集合元素
    • 不一樣

      * ListIteaator有add方法,能夠添加元素到底層集合中,位置在迭代器當前位置以前
      * ListIterator能夠向前遍歷,Iterator不能
      * ListIterator能夠經過nextIndex以及preIndex定位索引位置,Iteratoor不能
      * ListIterator能夠經過set方法對元素進行修改
  • 怎麼確保一個集合不能被修改?

    • 經過Collections工具類的靜態方法unmodifiableXxx對可變集合進行封裝
    • 經過Collections的靜態方法emptyXxx返回一個空的不可變集合
    • 經過Collections靜態方法singletonXxx返回帶有特定對象的不可變集合
  • 並行和併發有什麼區別?

    • 並行是指能同時處理多個任務的能力,屬於計算機硬件處理範疇
    • 併發是指多個任務被計算機交替執行,例如Java的多線程,屬於計算機軟件的範疇
  • 線程和進程的區別?

    • 進程是程序在計算機的一次執行活動,是操做系統分配資源的基本單位,能夠單獨執行
    • 線程是進程的一個實體,是CPU調度和分派的基本單位,必須依附於進程執行
    • 進程是計算機硬件範疇的概念,線程是計算機軟件範疇的概念
    • 一個進程至少由一個線程組成

2019.04.27更新

    • 守護線程是什麼?

      • 在Java中有兩類線程,用戶線程與守護線程
      • 守護線程獨立於控制終端·而且週期性執行某種任務或等待處理某些發生的事件
      • 守護線程主要爲其餘線程運行提供便利服務,例如GC
      • 守護線程建立與用戶線程大概一致,但要在線程開始以前經過成員方法setDaemon設置爲守護線程
      • 當全部非守護線程中止工做時,守護線程纔會中止工做
    • 建立線程有哪幾種方式?

      • 經過繼承Tread並重寫run方法建立
      • 經過實現Runnable接口並重寫run方法建立
      • 經過實現Callable接口重寫call方法,並使用FutureTask包裝對象進行建立
    • 說一下 runnable 和 callable 有什麼區別?

      • callable有返回值,能夠經過Future接口的get方法獲取,runnable沒有返回值
      • callable執行會阻塞線程,runnable不會
      • callable的執行經過FutureTask進行包裝,runnable的執行則經過Thread
      • callable能夠拋出異常,runnable只能在內部進行處理
    • 線程有哪些狀態?

      • 新建,就緒,運行,阻塞,死亡五種狀態
      • 當調用線程類的start方法時,線程進入就緒狀態,等待得到CPU時間片
      • 線程獲得CPU時間片時進行運行狀態
      • 當調用sleep方法,調用阻塞式I/O,試圖獲取同步監視器,suspend被調用,等待notify時,進入阻塞狀態
      • 當被notify,獲取到資源或同步監視器時,進行就緒狀態
      • 當run/call方法執行完畢,拋出異常未處理或調用stop方法時,線程死亡

    2019.04.28更新

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

      • sleep屬於線程類方法,wait屬於Object類的方法
      • sleep不會釋放線程鎖,wait釋放線程鎖
    • notify()和 notifyAll()有什麼區別?

      • notify和notifyAll都屬於Object類的方法
      • notify只會隨機選擇某一wait線程喚醒,notifyAll則會所有喚醒等待線程
    • 線程的 run()和 start()有什麼區別?

      • run定義線程執行的方法體,定義完成後線程處於新建狀態
      • start用於線程的執行,調用後線程處於就緒狀態
    • 建立線程池有哪幾種方式?

      • 建立單線程的線程池:newSingleThreadExecutor
      • 建立固定大小的線程池:newFixedThreadPool
      • 建立帶緩存的線程池:newCachedThreadPool
      • 建立大小無限的線程池:newScheduledPool,用於定時或週期性執行任務

    2019.04.29更新

    • 線程池都有哪些狀態?

      • running:線程池一旦建立,進入running狀態,接受新任務並處理現有任務
      • shutdown:調用線程池shutdown方法,不接受新任務,但能處理已有任務
      • stop:調用線程池shutdownNow方法,不接受新任務,不處理現有任務,中斷現有任務
      • tidying:當線程池處於stop而且任務隊列爲空時,執行terminated方法
      • terminated:線程池處於tidying狀態並執行完terminated方法,線程池終止
    • 線程池中 submit()和 execute()方法有什麼區別?

      • execute提交一個Runnable對象
      • submit能夠提交Runnable或者Callable對象
      • submit能夠提交Callable對象後返回一個泛型對象
    • 在 Java 程序中怎麼保證多線程的運行安全?

      • 經過設置符號位進行訪問,可是資源浪費嚴重
      • 經過synchronized代碼同步塊進行互斥資源的訪問
      • 經過鎖機制的等待與喚醒控制資源的訪問
      • 經過阻塞隊列控制互斥資源的數量進而控制資源的訪問
    • 多線程鎖的升級原理是什麼?

    2019.05.02更新

    • 什麼是死鎖?

      • 指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外在協調,它們都將沒法推動下去
    • 怎麼防止死鎖?

      • 預防死鎖

        • 破環互斥條件
        • 破環部分分配條件
        • 破環循環等待條件
        • 破環不可搶佔條件
      • 避免死鎖

        • 在爲申請者分配資源前檢測系統狀態
      • 循環檢測死鎖是否產生
    • ThreadLocal 是什麼?有哪些使用場景?

      • 線程局部變量,爲每一線程提供其副本,副本間獨立
      • 隔壁線程間對共享變量的競爭
      • 使用場景:多線程中使用同一變量,且該變量沒有線程衝突現象
    • 說一下 Synchronized 底層實現原理?

      • 暫未了解
    • synchronized 和 volatile 的區別是什麼?

      • synchronized保證操做的內存可見性,volatile保證變量的可見性
      • synchronized做用在變量,代碼塊,方法,類,volatile做用在變量級別
      • volatile保證程序從主存讀取變量的值,synchronized鎖定當前變量,甚至形成線程阻塞
      • volatile變量不會被編譯器優化,synchronized會被編譯器優化
      • volatile只能保證變量修改可見性,不能保證原子性;synchronized能保證變量修改可見性和原子性
    • synchronized 和 Lock 有什麼區別?

      • synchronized是java關鍵字,lock是java一個類
      • synchronized線程執行完成或者執行異常自動釋放鎖,Lock必須顯式釋放鎖
      • synchronized沒法判斷鎖狀態,Lock能夠
      • synchronized會組成線程阻塞,Lock不會
      • 參考:https://blog.csdn.net/u012403...
    • synchronized 和 ReentrantLock 區別是什麼?

      • 二者都是同一線程進入一次,鎖計數器自增1,計數器變成0釋放鎖
      • synchronized依賴JVM實現,synchronized是JDK實現的
      • synchronized自動釋放鎖,synchronized顯式釋放鎖
      • 鎖的細粒度和靈活度:ReenTrantLock優於synchronized
      • ReenTrantLock能夠指定公平或非公平鎖,synchronized爲非公平鎖
      • ReenTrantLock能夠指定喚醒線程,synchronized只能隨機或所有喚醒線程
      • 參考:https://blog.csdn.net/qq83864...
    • 說一下 Atomic 的原理?

      • 暫未了解
    相關文章
    相關標籤/搜索