1-2 map和list和set-ThreadLocal-finally-finalize
- 1-map和list和set
- 1-1 各自分集合
- 1-2 區別
- 1-3 ArrayList和LinkedList區別
- 1-4 List的遍歷方式和效率
- 2-ThreadLocal
- 2-1介紹
- 2-2 原理
- 2-3 原始碼
- 2-4 ThreadLocal導致的記憶體泄漏問題
- 3-finally-finalize
這里是easy的java基礎面試
下面是總的閱覽:
java基礎
java集合
JVM
多執行緒
mysql_資料庫
計算機網路
nosql_redis
設計模式
作業系統
訊息中間件activeMq
SSM框架面試題
服務中間件Dubbo
1-map和list和set
1-1 各自分集合
list:
ArrayList Vector : Object陣列 LinkedList雙向鏈表,1.7取消了回圈
set:
HastSet|(無序,唯一): 基于hashmap實作,底層采用hashmap來保存元素
LinkedHashSet :繼承與HashSet, 并且其內部是通過LinkedHashMap 來實作的
TreeSet(有序, 唯一): 紅黑樹,(自帶平衡的排序二叉樹)
map:
HashMap: JDK1.8 之前 hashmap由陣列+鏈表組成,陣列是hashmap主體,鏈表主要是為了解決哈希沖突而存在的(“拉鏈法”解決沖突,)
TreeMap: 紅黑樹(自平衡的排序二叉樹)
1-2 區別
List(對付順序的好幫手): List介面存盤一組不唯一(可以有多個元素參考相同的物件 ) 有序的物件,通過下標訪問元素,
Set(獨一無二的性質) : 不允許重復的集合,不會有多個元素參考相同的物件,
Map(利用key來進行搜索): 使用鍵值對存盤,Map會維護與key有關聯的值,key不可以參考相同的物件,但key不重復,key是string / 任何物件,
1-3 ArrayList和LinkedList區別
| 型別 | ArrayList | LinkedList |
|---|---|---|
| 是否保證執行緒安全 | 都是不同步的,所以執行緒不安全 | |
| 底層資料結構 | Object陣列 | jdk1.6 雙向回圈鏈表 1.7取消了回圈 |
| 插入和洗掉是否受元素位置的影響 | 受影響,因為需要移動元素 | 不受影響 O(1) |
| 是否支持快速隨機訪問 | 支持因為實作了randomAccess介面 | 不支持,需要遍歷鏈表 |
| 記憶體空間占用 | 主要體現在List串列尾部會預留一部分空間 | 體現在每一個元素都有直接后繼和直接前驅資料 |
1-4 List的遍歷方式和效率
- 實作了RandomAccess介面的list: 優先使用for, 其次foreach
- 未實作上述介面: 優先使用iterator foreach, 注意大 size的資料,千萬不要用普通for,
2-ThreadLocal
2-1介紹
記住,ThreadLocal不是解決物件的共享訪問問題,ThreadLoacl.set()到執行緒中的物件是執行緒自己使用的物件,其他執行緒是不能訪問的,因為這就是執行緒自己專屬的資料,
2-2 原理
各個執行緒獨立的物件不是通過,ThreadLocal.set()創建的,而是在每個執行緒中自己new 的物件,ThreadLocal.set() 將新建的物件的參考保存在執行緒獨有的map中,也就是(ThreadLocal, 值) ,
2-3 原始碼
Thread:
public class Thread implements Runnable {
ThreadLocal.ThreadLocalMap threadLoacls = null;
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
...
}
ThreadLocal 只是ThreadLocalMap的封裝,傳遞了變數值, 每一個thread中都具備一個threadLocalMap—>存盤以threadLocal為key的 鍵值對,
當使用ThreadLocal 維護變數時,ThreadLocal為每個使用該變數的執行緒都提供獨立的變數副本,所以每一個執行緒都可以獨立的改變自己的副本,而不會影響其他執行緒所對應副本,
ThreadLocal
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value); // this 就是當前 ThreadLocal副本
} else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLoacls;
}
2-4 ThreadLocal導致的記憶體泄漏問題
threadLocalMap 中key是 ThreadLocal的弱引用,而value是強參考, 如果ThreadLocal無被外部強參考的情況下,在垃圾回收的時候, key會被清理掉,而value不會被清理掉,這樣nulll–>value的entry,如果我們不做什么,那么value永遠都不會被GC回收與,就會造成記憶體泄漏,
然而, ThreadLocalMap已經考慮到這一點,所以在呼叫set get remove時,都會清理掉key為null的記錄,使用完ThreadLocal最好手動呼叫remove方法,
3-finally-finalize
- finalize 用途
垃圾回收器決定回收物件時,就會運行物件的finalize方法,
主要是: 回收從特殊渠道申請的記憶體,JNI呼叫non-Java程式(c++)
- finally
在return之前會執行fianlly中的代碼,如果fianlly中有return,則直接return,值為fianlly中修改的值,
如果finally中無 return,則執行try中return,數值仍然是 try中的,
如果fianlly中無return,但是finally中作了值的修改,那try中return回傳的值依舊是try中的值,
- 區別
無論是否拋出例外,finally都會執行,他主要是用來釋放應用占用的記憶體,比如流,檔案關閉,
finalize方式是Object類的一個protected方法,他是在物件被垃圾回收器回收之前,用JVM來呼叫的,
下一篇:
1-2 map和list和set-ThreadLocal-finally-finalize
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/209132.html
標籤:其他
