首頁  >  文章  >  Java  >  java面試題(找工作必看)

java面試題(找工作必看)

怪我咯
怪我咯原創
2017-06-26 11:45:351799瀏覽

個人的一點參考總結,如有雷同,純屬巧合!

 

1、hashmap的實作原理、hashtable的執行緒安全性是怎麼實現的?
HashMap其實也是一個線性的陣列實現的,所以可以理解為其儲存資料的容器就是一個線性數組。
首先HashMap裡面實作一個靜態內部類別Entry,其重要的屬性有key , value, next,從屬性key,value我們就能很明顯的看出來Entry就是HashMap鍵值對實現的一個基礎bean,我們上面說到HashMap的基礎就是一個線性數組,這個數組就是Entry[],Map裡面的內容都保存在Entry[]裡面。
HashTable容器使用synchronized來確保線程安全,但在線程競爭激烈的情況下HashTable的效率非常低下。因為當一個執行緒存取HashTable的同步方法時,其他執行緒存取HashTable的同步方法時,可能會進入封鎖或輪詢狀態。
ConcurrentHashMap所使用的鎖分段技術,首先將資料分成一段一段的存儲,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他線程存取。

2、hashmap的put(),get()實作原理?
第一個鍵值對A進來,透過計算其key的hash得到的index=0,記做:Entry[0] = A。一會後又進來一個鍵值對B,透過計算其index也等於0,現在怎麼辦? HashMap會這樣做:B.next = A,Entry[0] = B,如果又進來C,index也等於0,那麼C.next = B,Entry[0] = C;這樣我們發現index=0的地方其實訪問了A,B,C三個鍵值對,他們透過next這個屬性連結在一起。所以疑問不用擔心。也就是說數組中儲存的是最後插入的元素。
get()先定位,再遍歷。


3、spring bean的生命週期?
在spring中,singleton屬性預設為true,只有設定為false,則每次指定別名取得的Bean時都會產生一個新的實例。
3.1:Bean的建立:容器尋找Bean的定義資訊並將其實例化。
3.2:屬性注入。
3.3:BeanNameAware
3.4:BeanFactoryAware的setBeanFactory()
3.5:BeanPostProcessors的ProcessBeforeInitialization()
3.6:initializingBean的afterPropertiesSet():#od3.7:#od :
3.8:BeanPostProcessors的ProcessaAfterInitialization()
DisposableBean的destroy(),在Bean定義檔中定義destroy-method


#4、spring如何管理交易? Spring 的事務,可以說是 Spring AOP 的一種實作。反射和動態代理。

AOP面向切面編程,即在不修改原始程式碼的情況下,對原有功能進行擴展,透過代理類別來對具體類別進行操作。

spring是一個容器,透過spring這個容器來對物件進行管理,根據設定檔來實現spring對物件的管理。

spring的交易宣告有兩種方式,編程式和宣告式。 spring主要是透過「聲明式交易」的方式對事務進行管理,即在設定檔中進行聲明,透過AOP將事務切面切入程序,最大的好處是大幅減少了程式碼量。


5、service層是單例還是多例的?是線程安全的嗎?如果要做到多實例怎麼做? spring產生物件預設是單例的。透過scope屬性可以更改為多例。

 
5.1、servlet是單例的,嚴格地說是一個ServletMapping對應一個單例實例
5.2、要維護Servlet線程安全有很多辦法,通常是使用同步塊(或方法)來保護共享數據,其次可以volatile、Lock一些鎖機制,還可以使用ThreadLocal來打通安全通道,同時為了線程安全還要阻塞對方線程,其效能非常之差。不要在C層定義變量,防止多執行緒並發。

6、事物的傳播性?資料庫的隔離等級? PROPAGATION_REQUIRED 如果存在一個事務,則支援目前事務。如果沒有事務則開啟
PROPAGATION_SUPPORTS 如果存在一個事務,支援目前事務。如果沒有事務,則非事務的執行
PROPAGATION_MANDATORY 如果已經存在一個事務,支援目前事務。如果沒有一個活動的事務,則拋出異常。
PROPAGATION_REQUIRES_NEW 總是開啟一個新的交易。如果一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_NOT_SUPPORTED 總是非交易地執行,並掛起任何存在的交易。
PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常
PROPAGATION_NESTED 如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務,
     則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行
在預設的情況下,我們採用的是
PROPAGATION_REQUIRED

 ① Serializable (串行化):可避免髒讀、無法重複讀取、幻讀的發生。

  ② Repeatable read (可重複讀取):可避免髒讀、不可重複讀取的發生。

  ③ Read committed (讀取已提交):可避免髒讀的發生。

  ④ Read uncommitted (讀取未提交):最低級別,任何情況都無法保證。
其中一般資料庫預設的為Read committed等級。

MySQL預設的隔離等級為 Repeatable read。

在MySQL資料庫中查看目前交易的隔離等級:

select @@tx_isolation;
在MySQL資料庫中設定交易的隔離等級:







## set  [glogal | session]  transaction isolation level 隔離等級名稱;

set tx_isolation='隔離等級名稱;'

記住:設定資料庫的隔離等級一定要是在開啟交易之前!

 

7、Arraylist如何實現執行緒安全性?

那麼為了解決這個線程安全問題你可以這麼使用Collections.synchronizedList(),如:

###List> data=Collections.synchronizedList(new ArrayList< Map>());######8、如何配置Tomcat記憶體大小? ###### Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,需要調大。有以下幾種方法可以選用:######第一種方法:######  Windows下,在檔案/bin/catalina.bat,Unix下,在檔案/bin/catalina.sh的前面,增加如下設定:######  JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】'######  需要把這個兩個參數值調大。例如:######  JAVA_OPTS='-Xms256m -Xmx512m'######  表示初始化記憶體為256MB,可使用的最大記憶體為512MB。 ######第二種方法: 環境變數中設    變數名稱:JAVA_OPTS     變數值:-Xms512m   -Xmx512m###第三種方法:前兩種方法針對的是bin目錄下有catalina.bat的情況(例如直接解壓縮的Tomcat等),但有些安裝版的Tomcat下沒有catalina.bat,這時候可以採用以下方法,當然這個方法也是最通用的方法:開啟tomcatHome//bin//tomcat5w.exe,點選Java選項卡,然後將會發現其中有這麼兩項:Initial memory pool和Maximum memory pool.Initial memory pool這個就是初始化設定的記憶體的大小。 Maximum memory pool這個是最大內存的大小設定完了就按確定然後再重啟TOMCAT你就會發現tomcat中jvm可用的內存改變了###在catalina.bat的@echo off下面添加(就是第二行)# #####set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=256m#########9、servlet預設實作類別? ######lServlet介面SUN公司定義了兩個預設實作類,分別為:GenericServlet、HttpServlet。 ###如為GET請求,則呼叫HttpServlet的doGet方法,如為Post請求,則呼叫doPost方法。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法###### ####

以上是java面試題(找工作必看)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn