那些你曾錯過的JAVA題(二)

  • 2019 年 10 月 4 日
  • 筆記

6

執行緒安全的map在JDK 1.5及其更高版本環境 有哪幾種方法可以實現?

A.Map map = new HashMap()

B.Map map = new TreeMap()

C.Map map = new ConcurrentHashMap();

D.Map map = Collections.synchronizedMap(new HashMap())

解析:

HashMap,TreeMap 未進行同步考慮,是執行緒不安全的,所以 A,B排除。

HashTable 和 ConcurrentHashMap 都是執行緒安全的。區別在於他們對加鎖的範圍不同,HashTable 對整張Hash表進行加鎖,而ConcurrentHashMap將Hash表分為16桶(segment),每次只對需要的桶進行加鎖。

Collections 類提供了synchronizedXxx()方法,可以將指定的集合包裝成執行緒同步的集合。比如,

List list = Collections.synchronizedList(new ArrayList());

Set set = Collections.synchronizedSet(new HashSet());

答案:C,D

7

下面有關JVM記憶體,說法錯誤的是?

A.程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執行的位元組碼執行到了第幾行,是執行緒隔離的

B.虛擬機棧描述的是Java方法執行的記憶體模型,用於存儲局部變數,操作數棧,動態鏈接,方法出口等資訊,是執行緒隔離的

C.方法區用於存儲JVM載入的類資訊、常量、靜態變數、以及編譯器編譯後的程式碼等數據,是執行緒隔離的

D.原則上講,所有的對象都在堆區上分配記憶體,是執行緒之間共享的

解析:

JVM運行時,數據區包含:虛擬機棧,堆,方法區,本地方法棧,程式計數器,其中,堆和方法區是執行緒共享的,虛擬機棧和程式計數器是執行緒私有的

大多數 JVM 將記憶體區域劃分為 Method Area(Non-Heap)(方法區) ,Heap(堆) , Program Counter Register(程式計數器) , VM Stack(虛擬機棧,也有翻譯成JAVA 方法棧的),Native Method Stack ( 本地方法棧 ),

其中Method Area 和 Heap 是執行緒共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非執行緒共享的。為什麼分為 執行緒共享和非執行緒共享的呢?請繼續往下看。

首先我們熟悉一下一個一般性的 Java 程式的工作過程。一個 Java 源程式文件,會被編譯為位元組碼文件(以 class 為擴展名),每個java程式都需要運行在自己的JVM上,然後告知 JVM 程式的運行入口,再被 JVM 通過位元組碼解釋器載入運行。那麼程式開始運行後,都是如何涉及到各記憶體區域的呢?

概括地說來,JVM初始運行的時候都會分配好 Method Area(方法區) 和Heap(堆) ,而JVM 每遇到一個執行緒,就為其分配一個 Program Counter Register(程式計數器) , VM Stack(虛擬機棧)和Native Method Stack (本地方法棧), 當執行緒終止時,三者(虛擬機棧,本地方法棧和程式計數器)所佔用的記憶體空間也會被釋放掉。這也是為什麼我把記憶體區域分為執行緒共享和非執行緒共享的原因,非執行緒共享的那三個區域的生命周期與所屬執行緒相同,而執行緒共享的區域與JAVA程式運行的生命周期相同,所以這也是系統垃圾回收的場所只發生在執行緒共享的區域(實際上對大部分虛擬機來說知發生在Heap上)的原因。(---解析來自牛客網網友)

答案:C

8

關於依賴注入,下列選項中說法錯誤的是() A.依賴注入能夠獨立開發各組件,然後根據組件間關係進行組裝 B.依賴注入使組件之間相互依賴,相互制約 C.依賴注入提供使用介面編程 D依賴注入指對象在使用時動態注入

解析:

B 依賴注入的動機就是減少組件之間的耦合度,使開發更為簡潔

補充:

依賴注入和控制反轉是同一概念:

依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。依賴注入是從應用程式的角度在描述,可以把依賴注入描述完整點:應用程式依賴容器創建並注入它所需要的外部資源;而控制反轉是從容器的角度在描述,描述完整點:容器控制應用程式,由容器反向的嚮應用程式注入應用程式所需要的外部資源。

答案:B

9

有關hashMap跟hashTable的區別,說法正確的是?ABCD

A.HashMap和Hashtable都實現了Map介面

B.HashMap是非synchronized,而Hashtable是synchronized

C.HashTable使用Enumeration,HashMap使用Iterator

D.Hashtable直接使用對象的hashCode,HashMap重新計算hash值,而且用與代替求模

解析:

HashTable和HashMap區別

①繼承不同。

public class Hashtable extends Dictionary implements Map    public class HashMap extends AbstractMap implements Map

②Hashtable 中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。在多執行緒並發的環境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。

③Hashtable中,key和value都不允許出現null值。

在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示 HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

④兩個遍歷方式的內部實現上不同。Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。

⑤哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。

⑥Hashtable和HashMap它們兩個內部實現方式的數組的初始大小和擴容的方式。HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。

10

關於訪問許可權說法正確 的是 ? ( )

A.類定義前面可以修飾public,protected和private

B.內部類前面可以修飾public,protected和private

C.局部內部類前面可以修飾public,protected和private

D.以上說法都不正確

解析: 對於外部類來說,只有兩種修飾,public和默認(default),因為外部類放在包中,只有兩種可能,包可見和包不可見。 對於內部類來說,可以有所有的修飾,因為內部類放在外部類中,與成員變數的地位一致,所以有四種可能

Tags: