java 基礎面試題
一、陣列有沒有length()這個方法? String有沒有length()這個方法
陣列沒有length()這個方法,有length的屬性。String有有length()這個方法。
二、final, finally, finalize的區別。
final 用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
內部類要訪問區域性變數,區域性變數必須定義成final型別,例如,一段程式碼……
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫
三、error和exception有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能指望程式能處理這樣的情況。 exception表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況。
四、Java中的異常處理機制的簡單原理和應用。
Java對異常進行了分類,不同型別的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,Error表示應用程式本身無法克服和恢復的一種嚴重問題,程式只有死的份了,例如,說記憶體溢位和執行緒死鎖等系統問題。Exception表示程式還能夠克服和恢復的問題,其中又分為系統異常和普通異常,系統異常是軟體本身缺陷所導致的問題,也就是軟體開發人員考慮不周所導致的問題,軟體使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟體系統繼續執行或者讓軟體死掉,例如,陣列指令碼越界(ArrayIndexOutOfBoundsException),空指標異常(NullPointerException)、類轉換異常(ClassCastException);普通異常是執行環境的變化或異常所導致的問題,是使用者能夠克服的問題,例如,網路斷線,硬碟空間不夠,發生這樣的異常後,程式不應該死掉。
java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用throws宣告繼續拋給上層呼叫方法處理,所以普通異常也稱為checked異常,而系統異常可以處理也可以不處理,所以,編譯器不強制用try..catch處理或用throws宣告,所以系統異常也稱為unchecked異常。
五、java 常見的runtime exception
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。
六、java 實現多執行緒的方法
有兩種實現方法,分別是繼承Thread類與實現Runnable介面
七 、多執行緒同步有幾種實現方法?
同步的實現方面有兩種,分別是synchronized,wait與notify
wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。
sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException(中斷異常)異常。
notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。
Allnotity():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。
八、執行緒的基本概念、執行緒的基本狀態以及狀態之間的關係
狀態:就緒,執行,synchronize阻塞,wait和sleep掛起,結束。wait必須在synchronized內部呼叫。
呼叫執行緒的start方法後執行緒進入就緒狀態,執行緒排程系統將就緒狀態的執行緒轉為執行狀態,遇到synchronized語句時,由執行狀態轉為阻塞,當synchronized獲得鎖後,由阻塞轉為執行,在這種情況可以呼叫wait方法轉為掛起狀態,當執行緒關聯的程式碼執行完後,執行緒變為結束狀態。
九、 synchronized 和 Lock 的 異同
主要相同點:Lock能完成synchronized所實現的所有功能
主要不同點:Lock有比synchronized更精確的執行緒語義和更好的效能。synchronized會自動釋放鎖,而Lock一定要求程式設計師手工釋放,並且必須在finally從句中釋放。Lock還有更強大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。
十、ArrayList和Vector的區別
這兩個類都實現了List介面(List介面繼承了Collection介面),他們都是有序集合,即儲存在這兩個集合中的元素的位置都是有順序的,相當於一種動態的陣列,我們以後可以按位置索引號取出某個元素,,並且其中的資料是允許重複的,這是HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重複的元素
ArrayList與Vector的區別,這主要包括兩個方面:.
(1)同步性:
Vector是執行緒安全的,也就是說是它的方法之間是執行緒同步的,而ArrayList是執行緒序不安全的,它的方法之間是執行緒不同步的。如果只有一個執行緒會訪問到集合,那最好是使用ArrayList,因為它不考慮執行緒安全,效率會高些;如果有多個執行緒會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫執行緒安全的程式碼。
備註:對於Vector&ArrayList、Hashtable&HashMap,要記住執行緒安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是執行緒安全的,ArrayList與HashMap是java2時才提供的,它們是執行緒不安全的。所以,我們講課時先講老的。
(2)資料增長:
ArrayList與Vector都有一個初始的容量大小,當儲存進它們裡面的元素的個數超過了容量時,就需要增加ArrayList與Vector的儲存空間,每次要增加儲存空間時,不是隻增加一個儲存單元,而是增加多個儲存單元,每次增加的儲存單元的個數在記憶體空間利用與程式效率之間要取得一定的平衡。Vector預設增長為原來兩倍,而ArrayList的增長策略在文件中沒有明確規定(從原始碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設定初始的空間大小,Vector還可以設定增長的空間大小,而ArrayList沒有提供設定增長空間的方法。
總結:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。
十一、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演算法都大概一樣,所以效能不會有很大的差異。
就HashMap與HashTable主要從三方面來說。
一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現
二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value
十二、List和 Map區別
一個是儲存單列資料的集合,另一個是儲存鍵和值這樣的雙列資料的集合,List中儲存的資料是有順序,並且允許重複;Map中儲存的資料是沒有順序的,其鍵是不能重複的,它的值是可以有重複的。
十三、List、Map、Set三個介面,存取元素時,各有什麼特點
List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個功共同的父介面,叫Collection。Set裡面不允許有重複的元素,所謂重複,即不能有兩個相等(注意,不是僅僅是相同)的物件,即假設Set集合中有了一個A物件,現在我要向Set集合再存入一個B物件,但B物件與A物件equals相等,則B物件儲存不進去,所以,Set集合的add方法有一個boolean的返回值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則返回true,當集合含有與某個元素equals相等的元素時,此時add方法無法加入該元素,返回結果為false。Set取元素時,沒法說取第幾個,只能以Iterator介面取得所有的元素,再逐一遍歷各個元素。
List表示有先後順序的集合,注意,不是那種按年齡、按大小、按價格之類的排序。當我們多次呼叫add(Obj e)方法時,每次加入的物件就像火車站買票有排隊順序一樣,按先來後到的順序排序。有時候,也可以插隊,即呼叫add(int index,Obj e)方法,就可以指定當前物件在集合中的存放位置。一個物件可以被反覆儲存進List中,每呼叫一次add方法,這個物件就被插入進集合中一次,其實,並不是把這個物件本身儲存進了集合中,而是在集合中用一個索引變數指向這個物件,當這個物件被add多次時,即相當於集合中有多個索引指向了這個物件,如圖x所示。List除了可以以Iterator介面取得所有的元素,再逐一遍歷各個元素之外,還可以呼叫get(index i)來明確說明取第幾個。
Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(obj key,objvalue),每次儲存時,要儲存一對key/value,不能儲存重複的key,這個重複的規則也是按equals比較相等。取則可以根據key獲得相應的value,即get(Object key)返回值為key所對應的value。另外,也可以獲得所有的key的結合,還可以獲得所有的value的結合,還可以獲得key和value組合成的Map.Entry物件的集合。
List 以特定次序來持有元素,可有重複元素。Set無法擁有重複元素,內部排序。Map儲存key-value值,value可多值。
HashSet按照hashcode值的某種運算方式進行儲存,而不是直接按hashCode值的大小進行儲存。例如,"abc"---> 78,"def" ---> 62,"xyz" ---> 65在hashSet中的儲存順序不是62,65,78,LinkedHashSet按插入的順序儲存,那被儲存物件的hashcode方法還有什麼作用呢?學員想想!hashset集合比較兩個物件是否相等,首先看hashcode方法是否相等,然後看equals方法是否相等。new兩個Student插入到HashSet中,看HashSet的size,實現hashcode和equals方法後再看size。
同一個物件可以在Vector中加入多次。往集合裡面加元素,相當於集合裡用一根繩子連線到目標物件。往HashSet中卻加不了多次的。
十四、ArrayList,Vector, LinkedList的儲存效能和特性
ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector由於使用了synchronized方法(執行緒安全),通常效能上較ArrayList差,而LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。
十五、Collection和 Collections的區別。
Collection是集合類的上級介面,繼承與他的介面主要有Set和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。