java面試題:基礎知識

類和對象

Q:講一下面向對象OOP思想。
面向對象主要是抽象,封裝,繼承,多態。
多態又分爲重載和重寫。重載主要是方法參數類型不同,重寫則是方法內容不同。
Q:抽象類和接口有什麼區別?html

  1. 抽象類中能夠沒有抽象方法;接口中的方法必須是public abstract抽象方法;
  2. 抽象類中能夠有普通的成員變量;接口中的變量必須是public static final 類型的,必須被初始化,接口中只有常量,沒有變量。
  3. 抽象類只能單繼承,接口能夠繼承多個父接口;
  4. Java 8 中接口中會有 default 方法,即方法能夠被實現。

Q:java是值傳遞仍是引用傳遞?
java是值傳遞。
由於 Java 是值傳遞的,也就是說,咱們在調用一個須要傳遞參數的函數時,傳遞給函數的參數並非咱們傳遞進去的參數自己,而是它的一個副本,咱們改變了數據其實只是改變了副本的數據而已,並不會對原來的參數有任何的改變。
Q:類初始化的順序是怎樣的?
建立類的對象的時候,先初始化靜態變量和靜態代碼塊(靜態變量和靜態代碼塊的初始化順序按照在類中的前後順序),而後再初始化非靜態變量和非靜態代碼塊(非靜態變量和非靜態代碼塊之間也是按照在類中的前後順序),若是非靜態變量未顯示賦值會被賦值爲默認值。最後執行構造函數。
Q:final修飾符有什麼做用?
1.final修飾的類,不能夠被繼承。
2.final修飾方法,能夠把方法鎖定,以防任何繼承類修改它的含義。
3.fianl修飾的變量,若是是基本數據類型的變量,則其數值一旦在初始化以後便不能更改;若是是引用類型的變量,則在對其初始化以後便不能再讓其指向另外一個對象。
Q:建立對象的方式有哪些?
new,反射(包括使用Class類的newInstance方法和Constructor類的newInstance方法),clone,反序列化
還可使用建造者模式。java

Object

Q:Object有哪些方法?
getClass(),hashCode(),equals(),wait(),notify(),notifyAll(),toString(),finalize(),clone()
Q:如何理解hashCode()?
Q:hashCode()和equals()有什麼聯繫?
重寫equals()必須重寫hashCode()。
首先equals與hashcode間的關係是這樣的:
一、若是兩個對象相同(即用equals比較返回true),那麼它們的hashCode值必定要相同;
二、若是兩個對象的hashCode相同,它們並不必定相同(即用equals比較返回false)
Q:clone()的深複製和淺複製,有什麼區別?
淺複製:被複制對象的全部變量都含有與原來的對象相同的值,而全部的對其餘對象的引用仍然指向原來的對象。換言之,淺複製僅僅複製所考慮的對象,而不復制它所引用的對象。
深複製:被複制對象的全部變量都含有與原來的對象相同的值,除去那些引用其餘對象的變量。那些引用其餘對象的變量將指向被複制過的新對象,而再也不是原有的那些被引用的對象。換言之,深複製把要複製的對象所引用的對象都複製了一遍。算法

基礎類型

Q:基礎類型有哪些?怎麼比較?
int,char,float,double都是基本類型。 String不是基本類型。
基礎類型直接用==比較。
Q:Integer和int的區別?
Integer是int的包裝類。
Integer默認值是null,int默認值是0。
int默認是4個字節,Integer是16個字節。
Q: Integer和int怎麼比較?Integer怎麼比較?
Integer是int的包裝類。Integer跟Integer不可使用==比較。Integer跟int可使用==比較,Integer會自動拆箱。數據庫

String

Q:String怎麼比較?從內存角度講。
使用equals()比較。若是使用==比較的是內存,使用equals()比較的是對象的內容。
Q:String能夠繼承嗎?
String用final修飾,不能夠繼承。
Q:String和StringBulider、StringBuffer有什麼區別?
String長度不可變。StringBuilder、StringBuffer長度可變。
StringBuffer是線程安全的,StringBuilder是線程不安全的。
StringBuffer經過synchronized 關鍵字來實現同步操做
Q:String裏面的equals()是怎麼實現的?設計模式

IO

Q:IO中用到了哪些設計模式?
IO中用到了裝飾器模式,適配器模式。
裝飾器模式表現如: BufferedReader reader=new BufferedReader(new FileReader( new File(fileName)));
一樣是加強對象的功能,爲何使用裝飾器, 而不是繼承?
好比功能一,功能二,功能三。裝飾器能夠根據須要加強功能,隨意組合裝配。
而因爲功能的隨機組合有六種,想經過繼承加強功能要寫六個類。當須要的功能較多時,組合總和太大,經過繼承完成不太理想。數組

異常

Q:Java中的異常有哪些?
Exception分爲運行時異常和非運行時異常。
RuntimeException, 運行時異常,特色是Java編譯器不會檢查它。
非運行時異常 (編譯異常): 是RuntimeException之外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,若是不處理,程序就不能編譯經過。如IOException、SQLException等以及用戶自定義的Exception異常,通常狀況下不自定義檢查異常
Error:用於指示合理的應用程序不該該試圖捕獲的嚴重問題。如OutOfMemoryError、StackOverFlowError。
Q:RuntimeException有哪些?
空指針異常類:NullPointerException
類型強制轉換異常:ClassCastException
數組下標越界異常:ArrayIndexOutOfBoundsException
文件已結束異常:EOFException
文件未找到異常:FileNotFoundException
字符串轉換爲數字異常:NumberFormatException
操做數據庫異常:SQLException
輸入輸出異常:IOException
方法未找到異常:NoSuchMethodException
Q:何時會出現OutOfMemoryError、StackOverFlowError?
內存溢出OutOfMemoryError,當內存不夠用時,會拋出OutOfMemoryError。須要優化代碼,或者調整jvm參數,經過-Xmx將最大內存數調大。
棧溢出StackOverFlowError,當大量嵌套遞歸時,可能會出現StackOverFlowError,遞歸從本質上講也是棧的使用。緩存

Jdk

Q:Jdk各個版本有哪些差異?
Q:Jdk1.8之後的特性,有沒有了解過?
Jdk1.5:foreach迭代,可變參數,枚舉,自動拆裝箱,泛型,註解;
Jdk1.6:輕量級HttpServer的API,使用Complier API,對腳本語言的支持;
Jdk1.7:Switch支持字符串,泛型類型自動推斷,try-with-resource資源關閉技巧(省去了本身在finally裏去關閉資源),Objects工具類,ForkJoinPool
Jdk1.8:接口的默認方法實現與靜態方法,Lambda表達式,函數式接口,方法與構造函數引用,新的日期與時間API,流式處理。
Jdk1.9:優化了HTTP Client,支持HTTP/2和HTTPS/TLS協議。
Jigsaw模塊化項目,簡化進程API,輕量級JSON API,錢和貨幣的API,進程改善和鎖機制優化,代碼分段緩存。
Jdk10:局部變量的類型推斷var,改進GC和內存管理,線程本地握手,備用內存設備上的堆分配
Jdk11:可拓展的低延遲垃圾收集器ZGC。
Q:Java8的Lambda表達式,你會用嗎?能夠作哪些事情?可否手寫一下?
匿名函數式。能夠進行篩選,排序,求值,查找等功能。
Q:看過哪些Jdk源碼?
集合,多線程,併發。安全

集合(重點)

關鍵詞:ArrayList、LinkedList、HashTable、HashMap、ConcurrentHashMap、HashSet、
Q:List和Set有什麼區別?
List有序可重複,Set無序不重複數據結構

ArrayList

Q:ArrayList和LinkedList有什麼區別?(常問)
ArrayList數據結構是數組,查詢比較快。LinkedList是一個雙向鏈表,增刪比較快。
Q:ArrayList何時擴容?如何擴容?擴容多少?
ArrayList在初始化的時候,是不會擴容的。好比List list=new ArrayList(20); 執行這句代碼時不會進行擴容。
ArrayList數組的初始長度是10,當數組填滿後會進行擴容,每次擴容0.5倍,也就是原來的1.5倍。
擴容的過程,因爲數組的長度是不可變的,只能新建一個數組。
擴容的過程就是數組拷貝 Arrays.copyOf的過程,每一次擴容就會開闢一塊新的內存空間和數據的複製移動。多線程

HashSet

Q:講一下HashSet
無序不重複,容許爲null。
Q:HashSet是怎麼實現的?
基於HashMap來實現的,底層採用HashMap來保存元素。
Q:HashSet源碼是怎麼實現不重複的?
HashMap的key是不能重複的,而這裏HashSet的元素又是做爲了map的key,固然也不能重複了。
HashMap的key怎麼保證是不能重複的?
HashMap調用了對象的hashCode和equals方法進行的判斷。

HashTable

Q:HashTable是怎麼實現的?數據結構是什麼?
哈希表(hash table, 也叫散列表),是種根據關鍵碼值(Key value)而直接進行訪問數據結構,它能夠提供快速的插入操做和查找操做。也就是說,它經過把關鍵字值映射到一個位置來訪問記錄,以加快查找的速度。這個映射函數稱爲哈希函數。
Hashtable是經過"拉鍊法"實現的哈希表。由一個數組實現,數組元素都是單向鏈表。

HashMap(重點)

Q:HashMap有哪些遍歷方式?
Map.Entry,EntrySet,Iterator(迭代器)
Q:HashMap和Hashtable的區別有哪些?
HashMap沒有考慮同步,是線程不安全的;Hashtable使用了synchronized關鍵字,是線程安全的;
前者容許null做爲Key;後者不容許null做爲Key
HashTable繼承了Dictionary類。而HashMap是基於AbstractMap
Q:HashMap的數據結構是什麼?
HashMap數據結構是一個長度爲16的數組,數組元素是鏈表,在jdk1.8中,當鏈表長度達到8時,會轉換爲紅黑樹。
注:紅黑樹是一種二叉查找樹,每一個節點都標記紅色或黑色,根節點爲黑色,規律是「有紅必有黑,紅紅不相連」
Q:HashMap何時擴容?擴容多少?
HashMap中有一個負載因子loadFactor,0.75。當數組的長度達到數組長度(16)*負載因子(0.75)也就是12時,會進行擴容。
HashMap擴容時長度會翻倍。
Q:HashMap擴容後,是怎麼查找數據的?數據的位置會變嗎?Hash算法須要變嗎??
擴容後須要從新計算數據的位置。
Q:HashMap中的Hash算法具體是怎樣的?
Hash算法本質上就是三步:取key的hashCode值、高位運算 、取模運算。
經過Hash算法,對key計算出數組下標,把數據放在對應下標元素的鏈表上。
Hash碰撞:經過Key進行Hash的計算,就能夠獲取Key對應的HashCode。若是出現了重複的hashCode,就稱做碰撞。
若是發生了碰撞事件,那麼意味這數組的一個位置要插入兩個或者多個元素,這個時候數組上面掛的鏈表起做用了,鏈表會將數組某個節點上多出的元素按照尾插法(jdk1.7及之前爲頭差法)的方式添加。

Q:HashMap 的長度爲何是2的冪次方?
在Hash算法中,須要進行如下操做:

  1. 經過將 Key 的 hash 值與 length - 1 進行 & 運算,實現了當前 Key 的定位,2 的冪次方能夠減小衝突(碰撞)的次數,提升 HashMap 查詢效率
  2. 若是 length 爲 2 的次冪 則 length-1 轉化爲二進制一定是 11111……的形式,在與 h 的二進制與操做效率會很是的快,並且空間不浪費;若是 length 不是 2 的次冪,好比 length 爲 15,則 length - 1 爲 14,對應的二進制爲 1110,在於 h 與操做,最後一位都爲 0 ,而 0001,0011,0101,1001,1011,0111,1101 這幾個位置永遠都不能存放元素了,空間浪費至關大,更糟的是這種狀況中,數組可使用的位置比數組長度小了不少,這意味着進一步增長了碰撞的概率,減慢了查詢的效率!這樣就會形成空間的浪費。

ConcurrentHashMap(重點)

Q:能夠在遍歷ArrayList或者HashMap時,一邊增刪集合嗎?
不能夠。集合的fail-fast原則。
在遍歷ArrayList或者HashMap時,一邊增刪集合會拋出ModifyCountException。
Q:HashMap和ConcurrentHashMap的區別是什麼?
HashMap是線程不安全的。ConcurrentHashMap線程安全。
HashMap的Key和Value能夠是null。而ConcurrentHashMap不能夠。
Q:ConcurrentHashMap是如何實現的?
在jdk1.8以前,ConcurrentHashMap使用鎖分段技術的。
在jdk1.8,ConcurrentHashMap主要使用了CAS(compareAndSwap)、volatile(保證可見性)、synchronized鎖。
Q:ConcurrentHashMap是怎麼保證線程安全的?
CAS,比較和替換,運用了樂觀鎖的機制。
Q: ArrayList是線程不安全的,若是要求線程安全,應該用什麼集合代替ArrayList?
CopyOnWriteArrayList。寫時拷背。

集合排序

集合排序,偏向算法,問的人比較少。
Q:Collections.sort()怎麼排序?默認的排序是什麼?
必須實現Comparable接口的compare方法。
默認的排序方法是Timsort。結合了合併排序和插入排序而得出的排序算法。
Q:Arrays.sort();默認的排序算法是什麼?
數組有序就會採用歸併排序,數組無序就會採用快速排序。
詳情見:http://www.javashuo.com/article/p-uwlvhbqr-eg.html

參考資料:
《碼出高效 java開發手冊》
http://www.javashuo.com/article/p-aetvdusa-cb.html

相關文章
相關標籤/搜索