大家想不想進入一線大廠來進行自我提升、漲薪跳槽呢?
今天就給大家分享一波阿里資深架構師整理分享出的60道必備的Java核心技術面試題及答案,希望大家能夠喜歡!文末還有大量面試題分享,不止這60道!!
60道必備Java核心技術面試題及答案1、作用域 public,private,protected,以及不寫時的區別
答:區別如下:
作用域 當前類 同一 package 子孫類 其他 package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不寫時預設為 friendly
2、Anonymous Inner Class (匿名內部類) 是否可以 extends(繼承)其它類,是否可以 implements(實現)interface(介面)
答:匿名的內部類是沒有名字的內部類。不能 extends(繼承) 其它類,但一個內部類可以作為一個介面,由另一個內部類實現
3、Static Nested Class 和 Inner Class 的不同
答:Nested Class (一般是 C++的說法),Inner Class (一般是 JAVA 的說法)。Java 內部類與C++巢狀類最大的不同就在於是否有指向外部的引用上。注: 靜態內部類(Inner Class)意味著 1 建立一個 static 內部類的物件,不需要一個外部類物件,2 不能從一個 static 內部類的一個物件訪問一個外部類物件!
4、&和&&的區別
答:&是位運算子,表示按位與運算,&&是邏輯運算子,表示邏輯與(and)
5、Collection 和 Collections 的區別
答:Collection 是集合類的上級介面,繼承與他的介面主要有 Set 和 List.Collections 是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作
6、什麼時候用 assert
答:assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都支援這種機制。
在實現中,assertion 就是在程式中的一條語句,它對一個 boolean 表示式進行檢查,一個正確程式必須保證這個 boolean 表示式的值為 true;如果該值為 false,說明程式已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion 用於保證程式最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高效能,在軟體釋出後,assertion 檢查通常是關閉的
7、String s = new String("xyz");建立了幾個 String Object
答:兩個,一個字元物件,一個字元物件引用物件
8、Math.round(11.5)等於多少? Math.round(-11.5)等於多少
答: Math.round(11.5)==12;Math.round(-11.5)==-11;round 方法返回與引數最接近的長整數,引數加 1/2 後求其 floor
9、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯
答:short s1 = 1; s1 = s1 + 1; (s1+1 運算結果是 int 型,需要強制轉換型別)short s1 = 1; s1 += 1;(可以正確編譯)
10、Java 有沒有 goto
答:java 中的保留字,現在沒有在 java 中使用
11、陣列有沒有 length()這個方法? String 有沒有 length()這個方法
答:陣列沒有 length()這個方法,有 length 的屬性。String 有有 length()這個方法
12、Overload 和 Override 的區別。Overloaded 的方法是否可以改變返回值的型別
答:方法的重寫 Overriding 和過載 Overloading 是 Java 多型性的不同表現。重寫 Overriding是父類與子類之間多型性的一種表現,過載 Overloading 是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被"遮蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloaded 的方法是可以改變返回值的型別
13、Set 裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是 equals()? 它們有何區別
答:Set 裡的元素是不能重複的,那麼用 iterator()方法來區分重複與否。equals()是判讀兩個Set 是否相等equals()和==方法決定引用值是否指向同一物件 equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值
14、給我一個你最常見到的 runtime exception
答:常見的執行時異常有如下這些 ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
15、error 和 exception 有什麼區別
答:error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能指望程式能處理這樣的情況exception 表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況
16、List, Set, Map 是否繼承自 Collection 介面
答: List,Set 是,Map 不是
17、abstract class 和 interface 有什麼區別答:宣告方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要建立一個體現某些基本行為的類,併為該類宣告方法,但不能在該類中實現該類的情況。不能建立 abstract 類的例項。然而可以建立一個變數,其型別是一個抽象類,並讓它指向具體子類的一個例項。
不能有抽象建構函式或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可透過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程式體。介面只可以定義 static final 成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即將程式體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何物件上呼叫介面的方法。由於有抽象類,它允許使用介面名作為引用變數的型別。通常的動態聯編將生效。引用可以轉換到介面型別或從介面型別轉換,instanceof 運算子可以用來決定某物件的類是否實現了介面。
18、abstract 的 method 是否可同時是 static,是否可同時是 native,是否可同時是 synchronized
答:都不能
19、介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)
答:介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類必須有明確的建構函式
20、構造器 Constructor 是否可被 override
答:構造器 Constructor 不能被繼承,因此不能重寫 Overriding,但可以被過載 Overloading
21、是否可以繼承 String 類
答:String 類是 final 類故不可以繼承
22、try {}裡有一個 return 語句,那麼緊跟在這個 try 後的 finally {}裡的 code 會不會被執行,什麼時候被執行,在 return 前還是後
答:會執行,在 return 前執行
23、用最有效率的方法算出 2 乘以 8 等於幾
答:2 << 3
24、兩個物件值相同(x.equals(y) == true),但卻可有不同的 hash code,這句話對不對
答:不對,有相同的 hash code
25、當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞
答:是值傳遞。Java 程式語言只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的
26、swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
答:witch(expr1)中,expr1 是一個整數表示式。因此傳遞給 switch 和 case 語句的引數應該是 int、 short、 char 或者 byte。long,string 都不能作用於 swtich
27、ArrayList 和 Vector 的區別,HashMap 和 Hashtable 的區別
答:就 ArrayList 與 Vector 主要從二方面來說.一.同步性:Vector 是執行緒安全的,也就是說是同步的,而 ArrayList 是執行緒序不安全的,不是同步的
二.資料增長:當需要增長時,Vector 預設增長為原來一培,而 ArrayList 卻是原來的一半就 HashMap 與 HashTable 主要從三方面來說。
一.歷史原因:Hashtable 是基於陳舊的 Dictionary 類的,HashMap 是 Java 1.2 引進的 Map介面的一個實現
二.同步性:Hashtable 是執行緒安全的,也就是說是同步的,而 HashMap 是執行緒序不安全的,不是同步的
三.值:只有 HashMap 可以讓你將空值作為一個表的條目的 key 或 value
28、char 型變數中能不能存貯一箇中文漢字?為什麼?
答:是能夠定義成為一箇中文的,因為 java 中以 unicode 編碼,一個 char 佔 16 個位元組,所以放一箇中文是沒問題的
29、GC 是什麼? 為什麼要有 GC
答:GC 是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java 提供的 GC 功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java 語言沒有提供釋放已分配記憶體的顯示操作方法。
30、float 型 float f=3.4 是否正確?
答:不正確。精度不準確,應該用強制型別轉換,如下所示:float f=(float)3.4
31、介紹 JAVA 中的 Collection FrameWork(包括如何寫自己的資料結構)?
答:Collection FrameWork 如下:
Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap
Collection 是最基本的集合介面,一個 Collection 代表一組 Object,即 Collection 的元素(Elements)
Map 提供 key 到 value 的對映
32、抽象類與介面?
答:抽象類與介面都用於抽象,但是抽象類(JAVA 中)可以有自己的部分實現,而介面則完全是一個標識(同時有多重繼承的功能)。
JAVA 類實現序例化的方法是實現 java.io.Serializable 介面
Collection 框架中實現比較要實現 Comparable 介面和 Comparator 介面
33、STRING 與 STRINGBUFFER 的區別。
答:STRING 的長度是不可變的,STRINGBUFFER 的長度是可變的。如果你對字串中的內容經常進行操作,特別是內容要修改時,那麼使用 StringBuffer,如果最後需要 String,那麼使用 StringBuffer 的 toString()方法
34、談談 final, finally, finalize 的區別
答:final—修飾符(關鍵字)如果一個類被宣告為 final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被宣告為 abstract 的,又被宣告為 final 的。將變數或方法宣告為 final,可以保證它們在使用中不被改變。被宣告為 final 的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改。被宣告為 final 的方法也同樣只能使用,不能過載finally—再異常處理時提供 finally 塊來執行任何清除操作。如果丟擲一個異常,那麼相匹配的catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的
35、面向物件的特徵有哪些方面
答:主要有以下四方面:
1.抽象:
抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。
2.繼承:
繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。
物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
3.封裝:
封裝是把過程和資料包圍起來,對資料的訪問只能透過已定義的介面。面向物件計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件透過一個受保護的介面訪問其他物件。
4. 多型性:
多型性是指允許不同類的物件對同一訊息作出響應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。
36、String 是最基本的資料型別嗎
答:基本資料型別包括 byte、int、char、long、float、double、boolean 和 short。
java.lang.String 類是 final 型別的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用 StringBuffer 類
37、int 和 Integer 有什麼區別
答:Java 提供兩種不同的型別:引用型別和原始型別(或內建型別)。Int 是 java 的原始資料型別,Integer 是 java 為 int 提供的封裝類。Java 為每個原始型別提供了封裝類。
原始型別封裝類,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用型別和原始型別的行為完全不同,並且它們具有不同的語義。引用型別和原始型別具有不同的特徵和用法,它們包括:大小和速度問題,這種型別以哪種型別的資料結構儲存,當引用型別和原始型別用作某個類的例項資料時所指定的預設值。物件引用例項變數的預設值為 null,而原始型別例項變數的預設值與它們的型別有關
38、執行時異常與一般異常有何異同
答:異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java 編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。
39、說出 ArrayList,Vector, LinkedList 的儲存效能和特性
答:ArrayList 和 Vector 都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector 由於使用了 synchronized 方法(執行緒安全),通常效能上較 ArrayList 差,而 LinkedList 使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。
40、HashMap 和 Hashtable 的區別
答:HashMap 是 Hashtable 的輕量級實現(非執行緒安全的實現),他們都完成了 Map 介面,主要區別在於 HashMap 允許空(null)鍵值(key),由於非執行緒安全,效率上可能高於 Hashtable。
HashMap 允許將 null 作為一個 entry 的 key 或者 value,而 Hashtable 不允許。
HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因為 contains 方法容易讓人引起誤解。
Hashtable 繼承自 Dictionary 類,而 HashMap 是 Java1.2 引進的 Map interface 的一個實現。
最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多個執行緒訪問 Hashtable 時,不需要自己為它的方法實現同步,而 HashMap 就必須為之提供外同步。
Hashtable 和 HashMap 採用的 hash/rehash 演算法都大概一樣,所以效能不會有很大的差異。
41、heap 和 stack 有什麼區別
42、Java 的介面和 C++的虛類的相同和不同處答:由於 Java 不支援多繼承,而有可能某個類或物件要使用分別在幾個類或物件裡面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,介面有更高的靈活性,因為介面中沒有任何實現程式碼。當一個類實現了介面以後,該類要實現接口裡面所有的方法和屬性,並且接口裡面的屬性在預設狀態下面都是 public static,所有方法預設情況下是 public.一個類可以實現多個介面。
43、Java 中的異常處理機制的簡單原理和應用
答:當 JAVA 程式違反了 JAVA 的語義規則時,JAVA 虛擬機器就會將發生的錯誤表示為一個異常。
違反語義規則包括 2 種情況。一種是 JAVA 類庫內建的語義檢查。例如陣列下標越界,會引發 IndexOutOfBoundsException;訪問 null 的物件時會引發 NullPointerException。另一種情況就是 JAVA 允許程式設計師擴充套件這種語義檢查,程式設計師可以建立自己的異常,並自由選擇在何時用 throw 關鍵字引發異常。所有的異常都是 java.lang.Thowable 的子類。
43、垃圾回收的優點和原理。並考慮 2 種回收機制
答:Java 語言中一個顯著的特點就是引入了垃圾回收機制,使 c++程式設計師最頭疼的記憶體管理的問題迎刃而解,它使得 Java 程式設計師在編寫程式的時候不再需要考慮記憶體管理。由於有個垃圾回收機制,Java 中的物件不再有"作用域"的概念,只有物件的引用才有"作用域"。垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低級別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清楚和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。
44、你所知道的集合類都有哪些?主要方法?
答:最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。 List 適用於按數值索引訪問元素的情形。
Map 提供了一個更通用的元素儲存方法。 Map 集合類用於儲存元素對(稱作"鍵"和"值"),其中每個鍵對映到一個值。
45、描述一下 JVM 載入 class 檔案的原理機制?
答:JVM 中類的裝載是由 ClassLoader 和它的子類來實現的,Java ClassLoader 是一個重要的Java 執行時系統元件。它負責在執行時查詢和裝入類檔案的類。
46、排序都有哪幾種方法?請列舉
答: 排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(氣泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)快速排序的虛擬碼。
/ /使用快速排序方法對 a[ 0 :n- 1 ]排序
從 a[ 0 :n- 1 ]中選擇一個元素作為 m i d d l e,該元素為支點
把餘下的元素分割為兩段 left 和 r i g h t,使得 l e f t 中的元素都小於等於支點,而 right 中的元素都大於等於支點
遞迴地使用快速排序方法對 left 進行排序遞迴地使用快速排序方法對 right 進行排序所得結果為 l e f t + m i d d l e + r i g h t
47、JAVA 語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally 分別代表什麼意義?在 try 塊中可以丟擲異常嗎?
答:Java 透過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在 Java 中,每個異常都是一個物件,它是 Throwable 類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。Java 的異常處理是透過 5 個關鍵詞來實現的:try、catch、throw、throws和 finally。一般情況下是用 try 來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以透過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理。
用 try 來指定一塊預防所有"異常"的程式。緊跟在 try 程式後面,應包含一個 catch 子句來指定你想要捕捉的"異常"的型別。
throw 語句用來明確地丟擲一個"異常"。
throws 用來標明一個成員函式可能丟擲的各種"異常"。
Finally 為確保一段程式碼不管發生什麼"異常"都被執行一段程式碼。
可以在一個成員函式呼叫的外面寫一個 try 語句,在這個成員函式內部寫另一個 try 語句保護其他程式碼。每當遇到一個 try 語句,"異常"的框架就放到堆疊上面,直到所有的 try 語句都完成。
如果下一級的 try 語句沒有對某種"異常"進行處理,堆疊就會展開,直到遇到有處理這種"異常"的 try 語句。
48、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?
答:可以。必須只有一個類名與檔名相同。
49、java 中有幾種型別的流?JDK 為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
答:位元組流,字元流。位元組流繼承於 InputStream OutputStream,字元流繼承於 InputStreamReader OutputStreamWriter。在 java.io 包中還有許多其他的流,主要是為了提高效能和使用方便。
50、java 中會存在記憶體洩漏嗎,請簡單描述。
答:會。自己實現堆載的資料結構時有可能會出現記憶體洩露,可參看 effective java.
51、java 中實現多型的機制是什麼?
答:方法的重寫 Overriding 和過載 Overloading 是 Java 多型性的不同表現。重寫 Overriding是父類與子類之間多型性的一種表現,過載 Overloading 是一個類中多型性的一種表現。
52、垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知虛擬機器進行垃圾回收
答:對於 GC 來說,當程式設計師建立物件時,GC 就開始監控這個物件的地址、大小以及使用情況。
通常,GC 採用有向圖的方式記錄和管理堆(heap)中的所有物件。透過這種方式確定哪些物件是"可達的",哪些物件是"不可達的"。當 GC 確定一些物件為"不可達"時,GC 就有責任回收這些記憶體空間。可以。程式設計師可以手動執行 System.gc(),通知 GC 執行,但是 Java 語言規範並不保證GC 一定會執行。
53、靜態變數和例項變數的區別?
答:static i = 10; //常量 class A a; a.i =10;//可變
54、什麼是 java 序列化,如何實現 java 序列化?
答:序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現 Serializable 介面,該介面沒有需要實現的方法,implements Serializable 只是為了標註該物件是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個 ObjectOutputStream(物件流)物件,接著,使用 ObjectOutputStream 物件的 writeObject(Object obj)方法就可以將引數為 obj 的物件寫出(即儲存其狀態),要恢復的話則用輸入流。
55、是否可以從一個 static 方法內部發出對非 static 方法的呼叫?
答:不可以,如果其中包含物件的 method();不能保證物件初始化.
56、寫 clone()方法時,通常都有一行程式碼,是什麼?
答:Clone 有預設行為,super.clone();他負責產生正確大小的空間,並逐位複製。
57、在 JAVA 中,如何跳出當前的多重巢狀迴圈?
答:用 break; return 方法。
58、List、Map、Set 三個介面,存取元素時,各有什麼特點?
答:List 以特定次序來持有元素,可有重複元素。Set 無法擁有重複元素,內部排序。Map 保
存 key-value 值,value 可多值。
59、說出一些常用的類,包,介面,請各舉 5 個
答:常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的介面:Remote List Map Document NodeList
一線大廠面試題分享