一些面試的java題
1.什麽是Java虛擬機?為什麽Java被稱作是“平臺無關的編程語言”?
答,虛擬機是可以執行java字節碼的虛擬機進程,把源文件編譯成可執行的字節碼文件。java虛擬機知道硬件平臺底層的指令長度和相應的特性
2,jdk和jre
答,jre稱為java run environment ,是執行程序的虛擬機,而jdk是java develop kit 是指java開發工具包,包含了jre,編譯器,和其他工具。可以進行開發,便宜,執行
3,Java中,什麽是構造函數?什麽是構造函數重載?什麽是復制構造函數?
答,當新對象被創建的時候,構造函數會被調用。每一個類都有構造函數。在程序員沒有給類提供構造函數的情況下,Java編譯器會為這個類創建一個默認的構造函數。
Java中構造函數重載和方法重載很相似。可以為一個類創建多個構造函數。每一個構造函數必須有它自己唯一的參數列表。
Java不支持像C++中那樣的復制構造函數,這個不同點是因為如果你不自己寫構造函數的情況下,Java不會創建默認的復制構造函數。
4,接口和抽象類的區別是什麽?
Java提供和支持創建抽象類和接口。它們的實現有共同點,不同點在於:
- 接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
- 類可以實現很多個接口,但是只能繼承一個抽象類
- 類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
- 抽象類可以在不提供接口方法實現的情況下實現接口。
- Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
- Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
- 接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的。
5,進程和線程的區別是什麽?
進程是執行著的應用程序,而線程是進程內部的一個執行序列。一個進程可以有多個線程。線程又叫做輕量級進程。
6,如何確保N個線程可以訪問N個資源同時又不導致死鎖?
使用多線程的時候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,並強制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現死鎖了。
7,為什麽集合類沒有實現Cloneable和Serializable接口?
集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它自己的方式對元素進行保存和排序。有的集合類允許重復的鍵,有些不允許。
8,
Iterator和ListIterator的區別是什麽?
下面列出了他們的區別:
- Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
- Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。
- ListIterator實現了Iterator接口,並包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等
9,快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什麽?
Iterator的安全失敗是基於對底層集合做拷貝,因此,它不受源集合上修改的影響。java.util包下面的所有的集合類都是快速失敗的,而java.util.concurrent包下面的所有的類都是安全失敗的。快速失敗的叠代器會拋出ConcurrentModificationException異常,而安全失敗的叠代器永遠不會拋出這樣的異常。
10,hashCode()和equals()方法的重要性體現在什麽地方?
Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的hash值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發現重復元素。所以這兩個方法的實現對HashMap的精確性和正確性是至關重要的。
11,數組(Array)和列表(ArrayList)有什麽區別?什麽時候應該使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同點:
- Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
- Array大小是固定的,ArrayList的大小是動態變化的。
- ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
- 對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。
12,如何權衡是使用無序的數組還是有序的數組?
有序數組最大的好處在於查找的時間復雜度是O(log n),而無序數組是O(n)。有序數組的缺點是插入操作的時間復雜度是O(n),因為值大的元素需要往後移動來給新元素騰位置。相反,無序數組的插入時間復雜度是常量O(1)。
13,Enumeration接口和Iterator接口的區別有哪些?
Enumeration速度是Iterator的2倍,同時占用更少的內存。但是,Iterator遠遠比Enumeration安全,因為其他線程不能夠修改正在被iterator遍歷的集合裏面的對象。同時,Iterator允許調用者刪除底層集合裏面的元素,這對Enumeration來說是不可能的。
14,HashSet和TreeSet有什麽區別?
HashSet是由一個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間復雜度是O(1)。
另一方面,TreeSet是由一個樹形的結構來實現的,它裏面的元素是有序的。因此,add(),remove(),contains()方法的時間復雜度是O(logn)。
15,System.gc()和Runtime.gc()會做什麽事情?
這兩個方法用來提示JVM要進行垃圾回收。但是,立即開始還是延遲進行垃圾回收是取決於JVM的
一些面試的java題