面试的一些题目
arrayList和linkedList區別,各自內部實現
源碼解析看這里http://www.cnblogs.com/wuchaodzxx/p/6518302.html
LinkedeList和ArrayList都實現了List接口,但是它們的工作原理卻不一樣。它們之間最主要的區別在于ArrayList是可改變大小的數組,而LinkedList是雙向鏈接串列(doubly LinkedList)。ArrayList更受歡迎,很多場景下ArrayList比LinkedList更為適用。這篇文章中我們將會看看LinkedeList和ArrayList的不同,而且我們試圖來看看什么場景下更適宜使用LinkedList,而不用ArrayList。
LinkedList和ArrayList的區別
LinkedList和ArrayList的差別主要來自于Array和LinkedList數據結構的不同。如果你很熟悉Array和LinkedList,你很容易得出下面的結論:
1) 因為Array是基于索引(index)的數據結構,它使用索引在數組中搜索和讀取數據是很快的。Array獲取數據的時間復雜度是O(1),但是要刪除數據卻是開銷很大的,因為這需要重排數組中的所有數據。
2) 相對于ArrayList,LinkedList插入是更快的。因為LinkedList不像ArrayList一樣,不需要改變數組的大小,也不需要在數組裝滿的時候要將所有的數據重新裝入一個新的數組,這是ArrayList最壞的一種情況,時間復雜度是O(n),而LinkedList中插入或刪除的時間復雜度僅為O(1)。ArrayList在插入數據時還需要更新索引(除了插入數組的尾部)。
3) 類似于插入數據,刪除數據時,LinkedList也優于ArrayList。
4) LinkedList需要更多的內存,因為ArrayList的每個索引的位置是實際的數據,而LinkedList中的每個節點中存儲的是實際的數據和前后節點的位置。
什么場景下更適宜使用LinkedList,而不用ArrayList
我前面已經提到,很多場景下ArrayList更受歡迎,但是還有些情況下LinkedList更為合適。譬如:
1) 你的應用不會隨機訪問數據。因為如果你需要LinkedList中的第n個元素的時候,你需要從第一個元素順序數到第n個數據,然后讀取數據。
2) 你的應用更多的插入和刪除元素,更少的讀取數據。因為插入和刪除元素不涉及重排數據,所以它要比ArrayList要快。
以上就是關于ArrayList和LinkedList的差別。你需要一個不同步的基于索引的數據訪問時,請盡量使用ArrayList。ArrayList很快,也很容易使用。但是要記得要給定一個合適的初始大小,盡可能的減少更改數組的大小。
hashTable和hashMap的區別
源碼解析看這里http://www.cnblogs.com/wuchaodzxx/p/6519336.html
1 HashMap不是線程安全的
hastmap是一個接口 是map接口的子接口,是將鍵映射到值的對象,其中鍵和值都是對象,并且不能包含重復鍵,但可以包含重復值。HashMap允許null key和null value,而hashtable不允許。
2 HashTable是線程安全的一個Collection
HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。 HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差
volatile關鍵字的作用
詳見這里http://www.cnblogs.com/wuchaodzxx/p/6516811.html
concurrentMap
詳見這里http://www.cnblogs.com/wuchaodzxx/p/6516855.html
數據庫事務正確執行的四個基本要素
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的數據庫系統,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性,交易過程極可能達不到交易 ?
原子性(Atomicity):事務是數據庫的邏輯工作單位,它對數據庫的修改要么全部執行,要么全部不執行。
一致性(Consistemcy):
事務前后,數據庫的狀態都滿足所有的完整性約束。
隔離性(Isolation):
并發執行的事務是隔離的,一個不影響一個。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用于同一數據。通過設置數據庫的隔離級別,可以達到不同的隔離效果。
持久性(Durability):
在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,并不會被回滾。
sping依賴注入的優點,AOP的作用
什么是”依賴注入”?
所謂依賴注入,就是明確地定義組件接口(如UserDAO),獨立開發各個組件,然后根據組件間的依賴關系組裝(UserAction依賴于UserBiz,UserBiz依賴于UserDAO)運行的設計開發模式。
依賴注入帶來的好處:
應用DI原則后,代碼將更加清晰。而且當bean自己不再擔心對象之間的依賴關系(以及在何時何地指定這種依賴關系和依賴的實際類是什么)之后,實現更高層次的松耦合將易如反掌。
(1)降低組件間的偶合關系,從而降低設計大型系統的復雜度。
(2)可以為同一結構提供多種實現,并方便地切換。
?什么是AOP?
AOP是Aspect-Oriented Programming的簡稱,意思是面向方面編程。是將散布在系統各處的某個方面(如權限控制功能)同一實現的一種設計方式。
動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
使用AOP的好處:
面向切面編程(AOP)提供另外一種角度來思考程序結構,通過這種方式彌補了面向對象編程(OOP)的不足。 除了類(classes)以外,AOP提供了 切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理。 (這些關注點術語通常稱作 橫切(crosscutting) 關注點。)
linux grep等指令
詳見http://www.cnblogs.com/wuchaodzxx/p/5678709.html
java中重載equals()后為什么還要重載hashCode()方法
詳見http://www.cnblogs.com/wuchaodzxx/p/6517853.htm
spring中事物的傳播屬性和隔離級別
一、Propagation (事務的傳播屬性)
Propagation : key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
1: PROPAGATION_REQUIRED
加入當前正要執行的事務不在另外一個事務里,那么就起一個新的事務
比如說,ServiceB.methodB的事務級別定義為PROPAGATION_REQUIRED, 那么由于執行ServiceA.methodA的時候,
ServiceA.methodA已經起了事務,這時調用ServiceB.methodB,ServiceB.methodB看到自己已經運行在ServiceA.methodA
的事務內部,就不再起新的事務。而假如ServiceA.methodA運行的時候發現自己沒有在事務中,他就會為自己分配一個事務。
這樣,在ServiceA.methodA或者在ServiceB.methodB內的任何地方出現異常,事務都會被回滾。即使ServiceB.methodB的事務已經被
提交,但是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾
2: PROPAGATION_SUPPORTS
如果當前在事務中,即以事務的形式運行,如果當前不再一個事務中,那么就以非事務的形式運行
3: PROPAGATION_MANDATORY
必須在一個事務中運行。也就是說,他只能被一個父事務調用。否則,他就要拋出異常
4: PROPAGATION_REQUIRES_NEW
這個就比較繞口了。 比如我們設計ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_REQUIRES_NEW,
那么當執行到ServiceB.methodB的時候,ServiceA.methodA所在的事務就會掛起,ServiceB.methodB會起一個新的事務,等待ServiceB.methodB的事務完成以后,
他才繼續執行。他與PROPAGATION_REQUIRED 的事務區別在于事務的回滾程度了。因為ServiceB.methodB是新起一個事務,那么就是存在
兩個不同的事務。如果ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB是不會回滾的。如果ServiceB.methodB失敗回滾,
如果他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務仍然可能提交。
5: PROPAGATION_NOT_SUPPORTED
當前不支持事務。比如ServiceA.methodA的事務級別是PROPAGATION_REQUIRED ,而ServiceB.methodB的事務級別是PROPAGATION_NOT_SUPPORTED ,
那么當執行到ServiceB.methodB時,ServiceA.methodA的事務掛起,而他以非事務的狀態運行完,再繼續ServiceA.methodA的事務。
6: PROPAGATION_NEVER
不能在事務中運行。假設ServiceA.methodA的事務級別是PROPAGATION_REQUIRED, 而ServiceB.methodB的事務級別是PROPAGATION_NEVER ,
那么ServiceB.methodB就要拋出異常了。
7: PROPAGATION_NESTED
理解Nested的關鍵是savepoint。他與PROPAGATION_REQUIRES_NEW的區別是,PROPAGATION_REQUIRES_NEW另起一個事務,將會與他的父事務相互獨立,
而Nested的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。也就是說,如果父事務最后回滾,他也要回滾的。
而Nested事務的好處是他有一個savepoint。
*****************************************
ServiceA {
/**
* 事務屬性配置為 PROPAGATION_REQUIRED
*/
void methodA() {
try {
//savepoint
ServiceB.methodB(); //PROPAGATION_NESTED 級別
} catch (SomeException) {
// 執行其他業務, 如 ServiceC.methodC();
}
}
}
********************************************
也就是說ServiceB.methodB失敗回滾,那么ServiceA.methodA也會回滾到savepoint點上,ServiceA.methodA可以選擇另外一個分支,比如
ServiceC.methodC,繼續執行,來嘗試完成自己的事務。
但是這個事務并沒有在EJB標準中定義。
Spring事務的隔離級別
?1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
????? 另外四個與JDBC的隔離級別相對應
?2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的數據。
????? 這種隔離級別會產生臟讀,不可重復讀和幻像讀。
?3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據
?4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。
????? 它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。
?5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。
????? 除了防止臟讀,不可重復讀外,還避免了幻像讀。
什么是臟數據,臟讀,不可重復讀,幻覺讀?
?臟讀: 指當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,
???? 另外一個事務也訪問這個數據,然后使用了這個數據。因為這個數據是還沒有提交的數據, 那么另外一
???? 個事務讀到的這個數據是臟數據,依據臟數據所做的操作可能是不正確的。
???
?不可重復讀: 指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。
???????????? 那么,在第一個事務中的兩次讀數據之間,由于第二個事務的修改,那么第一個事務兩次讀到的數據
???????????? 可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀。
???????????
?幻覺讀: 指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及
???????? 到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,
???????? 以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。
轉載于:https://www.cnblogs.com/wuchaodzxx/p/6516907.html
總結
- 上一篇: 虚幻4 远处的贴图模糊处理
- 下一篇: 标签的制作