java面试常考系列四
轉載自?java面試常考系列四
題目一
大O符號(big-O notation)的作用是什么?有哪些使用方法?
大O符號描述了當數據結構里面的元素增加的時候,算法的規模或者是性能在最壞的場景下有多么好。
大O符號也可用來描述其他的行為,比如:內存消耗。因為集合類實際上是數據結構,一般使用大O符號基于時間、內存和性能來選擇最好的實現。大O符號可以對大量數據的性能給出一個很好的說明。
題目二
有序數組和無序數組的區別是什么?
1、有序數組最大的好處在于查找的時間復雜度是O(log n),而無序數組是O(n)。
2、有序數組的缺點是插入操作的時間復雜度是O(n),因為值大的元素需要往后移動來給新元素騰位置。相反,無序數組的插入時間復雜度是常量O(1)。
?
題目三Java集合類框架的最佳實踐有哪些?
實踐一根據應用的需要,正確選擇要使用集合的類型對性能非常重要,所以,如果提前知道元素的大小是固定的,我們就會使用Array,而不ArrayList。
實踐二
對于那些允許指定初始容量的集合。如果能估計出存儲的元素的數目,就可以提前設置初始容量,以此來避免重新計算hash值或者是擴容。
實踐三
為了類型安全,可讀性和健壯性的原因總是要使用泛型。同時,使用泛型還可以避免運行時的ClassCastException。
實踐四
使用JDK提供的不變類(immutable class)作為Map的鍵可以避免為我們自己的類實現hashCode()和equals()方法。
實踐五
編程的時候接口優于實現。
實踐六
底層的集合實際上是空的情況下,返回長度是0的集合或者是數組,不要返回null。?
題目四
Enumeration接口和Iterator接口的區別有哪些?
1.速度
Enumeration速度是Iterator的2倍。
2.內存
Enumeration比Iterator占用更少的內存。
3.安全
Enumeration安全性遠遠低于Iterator,因為當集合里面的對象正在被Iterator遍歷的時候,其他線程無法修改對象。
4.可操作
Enumeration不允許調用者刪除底層集合里面的元素,Iterator可以。
題目五
HashSet和TreeSet有什么區別?
區別一
底層存儲的數據結構不同。HashSet底層用的是HashMap哈希表結構存儲,而TreeSet底層用的是TreeMap樹結構存儲。
區別二
有序性不同。HashSet是無序的,而TreeSet是有序的。
區別三
存儲時保證數據唯一性依據不同。HashSet是通過復寫hashCode()方法和equals()方法來保證數據唯一性的,而HashSet通過Compareable接口的compareTo()方法來保證數據唯一性的。
區別四
時間復雜度不同。HashSet的add()、remove()和contains()方法的時間復雜度是0(1),TreeSet的時間復雜度是0(logn)。
?
題目六Java中垃圾回收有什么目的?垃圾回收的時機是什么?
目的
識別并且丟棄應用不再使用的對象來釋放和重用資源。
時機
1.程序員可以手動調用gc,但是Java語言規范并不保證GC一定會執行。
2.當應用程序空閑時,即沒有應用線程在運行時,GC會被調用。
3.Java堆內存不足時,GC會被調用。
?
題目七System.gc()和Runtime.gc()的作用是什么?
這兩個方法用來提示JVM要進行垃圾回收。但是,立即開始還是延遲進行垃圾回收是取決于JVM的。GC本身是會周期性的自動運行的,由JVM決定運行的時機,現在的版本有多種更智能的模式可以選擇,還會根據運行的機器自動去做選擇。
?
題目八finalize()方法什么時候被調用?析構函數(finalization)的目的是什么?
在釋放對象占用的內存之前,垃圾收集器會調用對象的finalize()方法。
目的是回收某些對象,清理內存,一般建議在該方法中釋放對象持有的資源。
?
題目九如果對象的引用被置為null,占用內存將在何時被回收?
在下一個垃圾回收周期,這個對象將是可被回收的。
題目十
Java堆的結構是什么樣子的?什么是堆中的永久代(Perm Gen space)?
JVM的堆是運行時數據區,所有類的實例和數組都是在堆上分配內存。它在JVM啟動的時候被創建。對象所占的堆內存是由自動內存管理系統也就是垃圾收集器回收。
堆內存是由存活和死亡的對象組成的。存活的對象是應用可以訪問的,不會被垃圾回收。死亡的對象是應用不可訪問尚且還沒有被垃圾收集器回收掉的對象,一直到垃圾收集器把這些對象回收掉之前,會一直占據堆內存空間。
總結
以上是生活随笔為你收集整理的java面试常考系列四的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA面试常考系列三
- 下一篇: JAVA面试常考系列五