63道java面試真題擊破BAT招聘套路!跳槽季助你一臂之力
“金三銀四”跳槽季,網上出現了各種面試真題,一時會讓人眼花繚亂,分不清最該看哪個,小編耗時一星期為大家做了一些java面試的真題。請準備好你的小本本

63道java面試真題擊破BAT招聘套路!跳槽季助你一臂之力
✍ 面向物件和麵向過程的區別
· 面向過程
優點:效能比面向物件高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源;比如微控制器、嵌入式開發、Linux/Unix等一般採用面向過程開發,效能是最重要的因素
缺點:沒有面向物件易維護、易複用、易擴充套件。
· 面向物件
優點:易維護、易複用、易擴充套件,由於面向物件有封裝、繼承、多型性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護。
缺點:效能比面向過程低。
✍ java的四個基本特性
抽象:就是把現實生活中的某一類東西提取出來,用程式程式碼表示,我們通常叫做類或者介面。抽象包括兩個方面:一個是資料抽象,一個是過程抽象。資料抽象也就是物件的屬性。過程抽象是物件的行為特徵。
封裝:把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行封裝隱藏。封裝分為屬性的封裝和方法的封裝。
繼承:是對有著共同特性的多類事物,進行再抽象成一個類。這個類就是多類事物的父類。父類的意義在於抽取多類事物的共性。
多型:允許不同類的物件對同一訊息做出響應。方法的過載、類的覆蓋正體現了多型。
✍ 過載和重寫的區別
過載:發生在同一個類中,方法名必須相同,引數型別不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。
重寫:發生在父子類中,方法名、引數列表必須相同,返回值小於等於父類,丟擲的異常小於等於父類,訪問修飾符大於等於父類;如果父類方法訪問修飾符為private則子類中就不是重寫。
✍ 採用位元組碼的好處
Java語言通過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。
所以Java程式執行時比較高效,而且,由於位元組碼並不專對一種特定的機器,因此,Java程式無須重新編譯便可在多種不同的計算機上執行。
✍ 構造器Constructor是否可被override
構造器不能被重寫,不能用static修飾構造器,只能用public、private、protected這三個許可權修飾符,且不能有返回語句。
✍** 訪問控制符public,protected,private,以及預設的區別**
private只有在本類中才能訪問;
public在任何地方都能訪問;
protected在同包內的類及包外的子類能訪問;
預設不寫在同包內能訪問。
✍ 是否可以繼承String類
String類是final類故不可以繼承,一切由final修飾過的都不能繼承。
✍ String和StringBuffer、StringBuilder的區別
· 可變性
String類中使用字元陣列儲存字串,private final char value[],所以string物件是不可變的。StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元陣列儲存字串,char[] value,這兩種物件都是可變的。
· 執行緒安全性
String中的物件是不可變的,也就可以理解為常量,執行緒安全。AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是執行緒安全的。StringBuilder並沒有對方法進行加同步鎖,所以是非執行緒安全的。
· 效能
每次對String 型別進行改變的時候,都會生成一個新的String 物件,然後將指標指向新的String 物件。StringBuffer每次都會對StringBuffer 物件本身進行操作,而不是生成新的物件並改變物件引用。相同情況下使用StirngBuilder 相比使用StringBuffer 僅能獲得10%~15% 左右的效能提升,但卻要冒多執行緒不安全的風險。
✍ hashCode和equals方法的關係
equals相等,hashcode必相等;hashcode相等,equals可能不相等。
✍ Java語言採用的編碼方案
Java語言採用Unicode編碼標準,Unicode(標準碼),它為每個字元制訂了一個唯一的數值,因此在任何的語言,平臺,程式都可以放心的使用。
✍ 抽象類和介面的區別
· 語法層次
抽象類和介面分別給出了不同的語法定義。
· 設計層次
抽象層次不同,抽象類是對類抽象,而介面是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類區域性(行為)進行抽象。抽象類是自底向上抽象而來的,介面是自頂向下設計出來的。
· 跨域不同
抽象類所體現的是一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is-a"關係,即父類和派生類在概念本質上應該是相同的。對於介面則不然,並不要求介面的實現者和介面定義在概念本質上是一致的,僅僅是實現了介面定義的契約而已,"like-a"的關係。
✍ 自動裝箱與拆箱
· 裝箱
將基本型別用它們對應的引用型別包裝起來;
· 拆箱
將包裝型別轉換為基本資料型別;
Java使用自動裝箱和拆箱機制,節省了常用數值的記憶體開銷和建立物件的開銷,提高了效率,由編譯器來完成,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動作。
✍ 什麼是泛型、為什麼要使用以及泛型擦除
泛型,即“引數化型別”。
建立集合時就指定集合元素的型別,該集合只能儲存其指定型別的元素,避免使用強制型別轉換。
Java編譯器生成的位元組碼是不包涵泛型資訊的,泛型型別資訊將在編譯處理是被擦除,這個過程即型別擦除。泛型擦除可以簡單的理解為將泛型java程式碼轉換為普通java程式碼,只不過編譯器更直接點,將泛型java程式碼直接轉換成普通java位元組碼。
型別擦除的主要過程如下:
1)將所有的泛型引數用其最左邊界(最頂級的父型別)型別替換。
2)移除所有的型別引數。
✍ Java中的集合類及關係圖
List和Set繼承自Collection介面。
Set無序不允許元素重複。HashSet和TreeSet是兩個主要的實現類。List有序且允許元素重複。ArrayList、LinkedList和Vector是三個主要的實現類。
Map也屬於集合系統,但和Collection介面沒關係。Map是key對value的對映集合,其中key列就是一個集合。key不能重複,但是value可以重複。HashMap、TreeMap和Hashtable是三個主要的實現類。
SortedSet和SortedMap介面對元素按指定規則排序,SortedMap是對key列進行排序。
✍ HashMap實現原理
HashMap基於hashing原理,通過put()和get()方法儲存和獲取物件。當將鍵值對傳遞給put()方法時,它呼叫鍵物件的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值物件。當獲取物件時,通過鍵物件的equals()方法找到正確的鍵值對,然後返回值物件。HashMap使用LinkedList來解決碰撞問題,當發生碰撞了,物件將會儲存在LinkedList的下一個節點中。 HashMap在每個LinkedList節點中儲存鍵值對物件。
當兩個不同的鍵物件的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的LinkedList中。鍵物件的equals()方法用來找到鍵值對。
✍ HashTable實現原理
和HashMap一樣,Hashtable 也是一個散列表,它儲存的內容是鍵值對(key-value)對映。
Hashtable 繼承於Dictionary,實現了Map、Cloneable、java.io.Serializable介面。
Hashtable 的函式都是同步的,這意味著它是執行緒安全的。它的key、value都不可以為null。此外,Hashtable中的對映不是有序的。
✍ HashMap和HashTable區別
1).HashTable的方法前面都有synchronized來同步,是執行緒安全的;HashMap未經同步,是非執行緒安全的。
2).HashTable不允許null值(key和value都不可以) ;HashMap允許null值(key和value都可以)。
3).HashTable有一個contains(Objectvalue)功能和containsValue(Objectvalue)功能一樣。
4).HashTable使用Enumeration進行遍歷;HashMap使用Iterator進行遍歷。
5).HashTable中hash陣列預設大小是11,增加的方式是old*2+1;HashMap中hash陣列的預設大小是16,而且一定是2的指數。
6).雜湊值的使用不同,HashTable直接使用物件的hashCode; HashMap重新計算hash值,而且用與代替求模。
✍ ArrayList和vector區別
ArrayList和Vector都實現了List介面,都是通過陣列實現的。Vector是執行緒安全的,而ArrayList是非執行緒安全的。
List第一次建立的時候,會有一個初始大小,隨著不斷向List中增加元素,當List 認為容量不夠的時候就會進行擴容。Vector預設情況下自動增長原來一倍的陣列長度,ArrayList增長原來的50%。
由於真題比較多,小編就不一一寫到文中,除此之外,還有23篇word真題。
部分資源截圖

QQ截圖20190222172937.jpg
小編會將文中之外的真題全部打包,發給你!
資源獲取
轉發後關注我
加群:714526711領取獲取往期Java高階架構資料、原始碼、筆記、視訊。Dubbo、Redis、設計模式、Netty、zookeeper、Spring cloud、分散式、高併發等架構技術