史上最全Java面試題合集400道(面試30k程序員必備)
1. final關(guān)鍵字的作用?
被final修飾的類不可以被繼承,被final修飾的方法不可以被重寫,被final修飾的變量不可以被改變.如果修飾引用,那么表示引用不可變,引用指向的內(nèi)容可變.被final修飾的方法,JVM會嘗試將其內(nèi)聯(lián),以提高運行效率,被final修飾的常量,在編譯階段會存入常量池中.
2. abstract class 和interface有什么區(qū)別?
聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstract class),它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實現(xiàn)該類的情況。不能創(chuàng)建abstract類的實例。然而可以創(chuàng)建一一個變量, 其類型是-一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract類的子類為它們父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類可以在類中實現(xiàn)這些方法。
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final 成員變量。接口的實現(xiàn)與子類相似,除了該實現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實現(xiàn)特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof運算符可以用來決定某對象的類是否實現(xiàn)了接口。
3. Java 集合類: list、 set、queue、 map、stack 的特點與用法?
Map
Map是鍵值對,鍵Key是唯一不能重復(fù)的, -一個鍵對應(yīng)一一個值, 值可以重復(fù)。
TreeMap可以保證順序,HashMap不保證順序,即為無序的,Map 中可以將Key和Value單
獨抽取出來,其中KeySet()方法可以將所有的keys抽取成- -個 Set,而Values() 方法可以
將map中所有的values抽取成一個集合。
Set
不包含重復(fù)元素的集合,set 中最多包含一個null元素,只能用Iterator實現(xiàn)單項遍歷,
Set中沒有同步方法。
List
有序的可重復(fù)集合,可以在任意位置增加刪除元素,用Iterator實現(xiàn)單向遍歷,也可用
ListIterator實現(xiàn)雙向遍歷。
Queue
Queue遵從先進先出原則,使用時盡量避免add()和remove()方法,而是使用offer ()來添加
元素,使用poll()來移除元素,它的優(yōu)點是可以通過返回值來判斷是否成功,LinkedList
實現(xiàn)了Queue接口,Queue 通常不允許插入null元素。
Stack
Stack遵從后進先出原則,Stack 繼承自Vector,它通過五個操作對類Vector進行擴展,允許將向量視為堆棧,它提供了通常的push和pop操作,以及取堆棧頂點的peek()方法、
測試堆棧是否為空的empty方法等。
用法
如果涉及堆棧,隊列等操作,建議使用List。
對于快速插入和刪除元素的,建議使用LinkedList.
如果需要快速隨機訪問元素的,建議使用ArrayList.
4.說出ArrayList, Vector, LinkedList 的存儲性能和特性?
ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便
增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)
存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized 方法(線程安全), .
通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要
進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。.
5.內(nèi)存泄漏和內(nèi)存溢出?
內(nèi)存泄漏(memoryleak),是指應(yīng)用程序在申請內(nèi)存后,無法釋放已經(jīng)申請的內(nèi)存空間,一
次內(nèi)存泄漏危害可以忽略,但如果任其發(fā)展最終會導(dǎo)致內(nèi)存溢出Coutofmemory) 。如讀取
文件后流要進行及時的關(guān)閉以及對數(shù)據(jù)庫連接的釋放。
內(nèi)存溢出(outofmemory)是指應(yīng)用程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用。如我
們在項目中對于大批量數(shù)據(jù)的導(dǎo)入,采用分批量提交的方式。
6.反射中,Class. forName ()和ClassLoader. loadClass ()的區(qū)別?
lass.forName(lassName)方法,
內(nèi).部實際調(diào)用的方法是
Class.forName(className,true,lassloader);
第2個boolean參數(shù)表示類是否需要初始化,Class.forNamel(lassName)默認(rèn) 是需要初始化,
一旦初始化,就會觸發(fā)目標(biāo)對象的static 塊代碼執(zhí)行,static 參數(shù)也也會被再次初始
化,CassaderladlasslassName) 方法,內(nèi)部實際調(diào)用的方法是
Classloader.loadClass(className,false);第2個boolean 參數(shù),表示目標(biāo)對象是否進行鏈接,
false表示不進行鏈接,由上面介紹可以,不進行鏈接意味著不進行包括初始化等一- 些列步
驟,那么靜態(tài)塊和靜態(tài)對象就不會得到執(zhí)行
7. Int 和Integer的區(qū)別?
Integer是int的包裝類型,在拆箱和裝箱中,二者自動轉(zhuǎn)換. int是基本類型,直接存數(shù)值;
而integer是對象;用一個引用指向這個對象.由于Integer 是一一個對象, 在JVM中對象需要
一定的數(shù)據(jù)結(jié)構(gòu)進行描述,相比int而言,其占用的內(nèi)存更大- -些.
8. String、 StringBuilder、 StringBuffer 區(qū)別?
String? ?字符串常量? 不可變? ?使用字符串 拼接時是不同的2個空間
StringBuffer?字 符串變量??可變.???線程安全字 符串拼接直接在字符串后追加
StringBuilder?字符串變量??可變? ?非線程安全字符串拼接直接在字符申后追加
1.StringBuilder執(zhí)行效率高于StringBuffer高于String.
2.String是一個常量,是不可變的,所以對于每一次+ =賦值都會創(chuàng)建一個新的對象,
StringBuffer和StringBuilder都是可變的,當(dāng)進行字符串拼接時采用append方
法,在原來的基礎(chǔ)上進行追加,所以性能比String要高,又因為StringBuffer是
線程安全的而StringBuilder是線程非安全的,所以StringBuilder的效率高于
StringBuffer.
3.對于大數(shù)據(jù)量的字符串的拼接,采用StringBuffer ,StringBuilder.
9. Hashtable 和Hashmap的區(qū)別?
1、HashTable 線程安全,HashMap 非線程安全
2、Hashtable 不允許null 值(key 和value 都不可以),HashMap 允許null 值(key和
value都可以)。
3、兩者的遍歷方式大同小異,Hashtable僅僅比HashMap多-一個elements方法。
10.說幾個常見的編譯時異常?
SQLException提供有關(guān)數(shù)據(jù)庫訪問錯誤或其他錯誤的信息的異常。
I0exception表示發(fā)生了某種I / 0異常的信號。此類是由失敗或中斷的1 / 0操作產(chǎn)生的
一般異常類
FileNotFoundException當(dāng)試圖打開指定路徑名表示的文件失敗時,拋出此異常。
ClassNotFoundException找不到具有指定名稱的類的定義。
EOFException當(dāng)輸入過程中意外到達文件或流的末尾時,拋出此異常。



