1. 程式人生 > >Java 面試基礎總結(一)

Java 面試基礎總結(一)

tor rac 時有 線程安全 lec getclass ron 接口 add

1、九種基本數據類型的大小以及它們的封裝類

java提供的九種基本數據類型:boolean、byte(1)、char(2)、short(2)、int(4)、long(8)、float(4)、double(8)、void
以及它們的封裝類:Boolean、Byte、Character、Short、Integer、Long、Float、Double、Void

2、switch能用string做參數嗎

在java7之後可以使用string做參數

3、equals與==的區別

“==”是對比較的兩個對象的地址進行比較,Object類中的equals是基於“==”實現的,因此equals方法根據用戶的需求自定義來實現同類對象的比較

java中提供的其它類基本都實現了對equals的復寫

4、Object有哪些共用方法

Object類有12個成員方法,按照用途可以分為以下幾種
1,構造函數
2,hashCode和equale函數用來判斷對象是否相同,
3,wait(),wait(long),wait(long,int),notify(),notifyAll()
4,toString()和getClass,
5,clone()
6,finalize()用於在垃圾回收

5、Java中的四種引用,強弱軟虛,用到的場景

1、強引用

強引用不會被GC回收,並且在java.lang.ref裏也沒有實際的對應類型,平時工作接觸的最多的就是強引用。Object obj = new Object();這裏的obj引用便是一個強引用。如果一個對象具有強引用,那就類似於必不可少的生活用品,垃圾回收器絕不會回收它。當內存空 間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足問題。

2.弱引用(WeakReference)

如果一個對象只有弱引用,就類似一個可有可無的產品,弱引用與軟引用的區別在於:只具有弱引用的對象擁有更短暫的生命周期,在垃圾回收線程掃描它所管轄的區域的過程中,一旦發現了弱引用的對象,不管當前內存空間足夠與否,都會回收它的存在,不過垃圾回收器是一個優先級很低的線程,因此不一定會可很快發現那些具有若引用的對象

3.軟引用(SoftReference)

如果一個對象只具有軟引用,那就類似於可有可無的物品,如果內存空間足夠,垃圾回收器就不會回收這些對象的內存,只要垃圾回收器沒有回收它,該對象就可以被程序使用,軟引用可用來實現內存敏感的高速緩存,軟引用可以與引用隊列(ReferenceQueue)聯合使用,如果軟引用的對象被垃圾回收,JAVA虛擬機就會把這個軟引用加入到關聯的引用隊列中

4.虛引用(PhantomReference)

"虛引用"顧名思義,就是形同虛設,和其他幾種引用都不同,它不會決定一個對象的生命周期,如果一個對象只具有虛應用,那麽他就和沒有任何引用一樣,任何時候都可能被垃圾回收,虛引用主要用來跟蹤對象被垃圾回收的活動,虛引用和軟引用和弱引用的一個區別在於:虛引用必須和引用隊列聯合使用,當垃圾回收器準備回收一個對象時,如果發現他還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中,程序可以判斷引用隊列中是否加入了虛引用,來了解引用的對象是否將要被垃圾回收,程序如果發現某個虛引用被加入到引用隊列中,那麽就可以在所引用的對象的內存被回收之前采取必要的行動

6、HashCode的作用

可以用來進行對象的比較,不過並不一定可靠,equals比較相同的兩個對象,其hashCode一定相同,但是反之並不一定相同

用於在hashTable、HashMap等散列結構中通過hashCode來確定對象在散列結構中的位置

7、ArrayList、LinkedList、Vector的區別

1.ArrayList是最常用的List實現類,內部是通過數組實現的,它允許對元素進行快速隨機訪問。數組的缺點是每個元素之間不能有間隔,當數組大小不滿足時需要增加存儲能力,就要講已經有數組的數據復制到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時,需要對數組進行復制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。

2.Vector與ArrayList一樣,也是通過數組實現的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問ArrayList慢。

3.LinkedList是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用於操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。

4、當容量不夠需要擴容時,ArrayList是擴容50%,Vector是100%

5、由於LinkedList是鏈式結構,因此在插入和刪除方面的性能優於ArrayList,在查詢方面不如ArrayList

8、String、StringBuffer與StringBuilder的區別

String 字符串常量
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)

這三個類之間的區別主要是在兩個方面,即運行速度和線程安全這兩方面

1.首先說運行速度,或者說是執行速度,在這方面運行速度快慢為:StringBuilder > StringBuffer > String

String最慢的原因:

String為字符串常量,而StringBuilder和StringBuffer均為字符串變量,即String對象一旦創建之後該對象是不可更改的,但後兩者的對象是變量,是可以更改的。在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因為每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。

2.再來說線程安全,在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的

  如果一個StringBuffer對象在字符串緩沖區被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證線程安全,有可能會出現一些錯誤的操作。所以如果要進行的操作是多線程的,那麽就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。

9、Map、Set、List、Queue、Stack的特點和用法

  • Map

Map是鍵值對,鍵Key是唯一不能重復的,一個鍵對應一個值,值可以重復。
TreeMap可以保證順序,HashMap不保證順序,即為無序的。
Map中可以將Key和Value單獨抽取出來,其中KeySet()方法可以將所有的keys抽取正一個Set。而Values()方法可以將map中所有的values抽取成一個集合。

  • Set

不包含重復元素的集合,set中最多包含一個null元素
只能用iterator實現單項遍歷,Set中沒有同步方法。

  • List

有序的可重復集合。
可以在任意位置增加刪除元素。
用Iterator實現單向遍歷,也可用ListIterator實現雙向遍歷

  • Queue

Queue遵從先進先出原則。
使用時盡量避免add()和remove()方法,而是使用offer()來添加元素,使用poll()來移除元素,它的優點是可以通過返回值來判斷是否成功。
LinkedList實現了Queue接口。
Queue通常不允許插入null元素。

  • Stack

Stack遵從後進先出原則。
Stack繼承自Vector。
它通過五個操作對類Vector進行擴展,允許將向量視為堆棧,它提供了通常的push和pop操作,以及取堆棧頂點的peek()方法、測試堆棧是否為空的empty方法等

  • 用法

如果涉及堆棧,隊列等操作,建議使用List
對於快速插入和刪除元素的,建議使用LinkedList
如果需要快速隨機訪問元素的,建議使用ArrayList

10、HashMap和HashTable的區別

1、HashTable是繼承Dictionary類,而HashMap是實現的Map接口

2、HashMap是線程不安全的,HashTable是線程安全的

3、HashMap可以使用null作為key和value

HashMap可以通過下面的語句進行同步:
Map m = Collections.synchronizeMap(hashMap);

11、HashMap與ConcurrentHashMap的區別

ConcurrentHashMap是線程安全的,使用了鎖分離技術,將內部分為若幹段(默認情況下分為16段),通過key的hashcode來確定在哪一段,對其操作時,則對需要操作的段進行加鎖,因此在默認情況下,如果理想的話可以同時有16個線程對一個ConcurrentHshMap進行操作

12、TreeMap、HashMap、LinkedHashMap的區別

TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序。
  默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。

HashMap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。遍歷時,取得數據的順序是完全隨機的。
  HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null。
  HashMap不支持線程的同步(即任一時刻可以有多個線程同時寫HashMap),可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
  Hashtable與 HashMap類似,它繼承自Dictionary類。不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步(即任一時刻只有一個線程能寫Hashtable),因此也導致了 Hashtable在寫入時會比較慢。

LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。也可以在構造時帶參數,按照應用次數排序。
在遍歷的時候會比HashMap慢,不過有種情況例外:當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢。因為LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關

13、Collection包結構,與Collections的區別

Collection是集合類的一個頂級接口,其直接繼承接口有List與Set

而Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各種操作。

14、try/catch finally,try裏面有retrun,finally還會執行嗎

try裏面有return,會在執行finally後再執行return,如果finally裏面return,則不會執行try裏面的return

finally可以對try中的非基礎數據類型的結果產生影響,而基礎數據類型不會有影響

15、Exception與Erro包結構,OOM你遇到過哪些情況,SOF你遇到過哪些情況

https://blog.csdn.net/gs_008/article/details/50951617

Java 面試基礎總結(一)