- 1、String類能被繼承么分瘾?
不能胎围,因為String類被final修飾符修飾,final修飾的類不能被繼承; - 2德召、String白魂,Stringbuffer,StringBuilder的區(qū)別氏捞?
String 常量碧聪,位于字符串常量池中,不可變的對象
Stringbuffer 變量,線程安全液茎,效率比較低
StringBuilder變量逞姿,線程不安全辞嗡,效率比較高 - 3、ArrayList和LinkedList有什么區(qū)別
兩者都是list集合的子集
arrayList是基于動態(tài)數(shù)組滞造,而LinkedList是基于鏈表操作续室;
arrayList在查詢效率方面更高,直接找到索引index返回谒养,而LinkedList則需要進行for遍歷查找
arrayList 一般認為插入和刪除效率比較高一些挺狰,實際上插入位置位于容量1/10以下的時候,才會發(fā)生买窟;LinkedList效率比較高的原因是直接for遍歷到元素丰泊,插入或者刪除,而arrayList則需要移動指針始绍,將指針后的元素都向后推移 - 4瞳购、類的實例化順序
父類的靜態(tài)變量
父類的靜態(tài)初始化代碼塊
子類的靜態(tài)變量
子類的靜態(tài)初始化代碼塊
子類main方法
父類的變量
父類的初始化代碼塊
父類的構(gòu)造函數(shù)
子類的變量
子類的初始化代碼塊
子類類的構(gòu)造函數(shù)
- 5、hashmap
基于Map接口實現(xiàn)亏推,可以為null或者空值学赛,非同步,不保證有序吞杭,也不保證順序隨時間而不發(fā)生變化盏浇,存儲Entry(hask,key,value,next)對象
put實現(xiàn)原理:
1、對key的hashcode進行hash,再計算索引index
2芽狗、如果索引沒有碰撞绢掰,那么直接放進bucket中
3、如果有沖突译蒂,則以鏈表的形式掛在buckets后曼月,如果鏈表過長谊却,則將鏈表轉(zhuǎn)換為紅黑樹(jdk8之后默認為8)
4柔昼、如果節(jié)點已經(jīng)存在,則把原來的值替換
5炎辨、如果bucket滿了捕透,則需要重新resize(factor默認是0.75)
get實現(xiàn)原理:
1、bucket里的第一個節(jié)點碴萧,直接命中
2乙嘀、如果有沖突,則通過key.equals(k)查找對應(yīng)的entry
3破喻、如果是樹虎谢,則通過key.equals(k)查找O(logn)
4、如果是鏈表曹质,則通過key.equals(k)查找O(n)
key的hashcode進行hash(hashcode的高16位和低16位進行異或),
initialCapacity : 初始化容量16
table : Entry<K,V>[] table 是用來存儲數(shù)據(jù)的數(shù)組
Entry<K,V> 是HashMap的一個內(nèi)部類婴噩,鏈表結(jié)構(gòu)
- 6 ConcurrentHashMap
ConcurrentHashMap 包括兩個內(nèi)部類擎场,hashEntry和segment,hashEntry存儲鍵值對,segment充當(dāng)鎖的作用几莽。
并發(fā)性高的原因
1迅办、是由自身特點決定的。當(dāng)插入一個元素的時候章蚣,對hashcode進行hash站欺,計算出索引,得到segment中桶的位置由于hashEntry鏈的final特性纤垂,只能在鏈頭插入元素矾策,不影響遍歷;鎖住的當(dāng)前的segment,其他segment讀寫并不受影響
2峭沦、hashEntry的value是volatile變量蝴韭,不同線程間可以正確的獲得值
jdk
1.8 其中拋棄了原有的 Segment 分段鎖,而采用了 CAS + synchronized 來保證并發(fā)安全性熙侍。
hashcode 定位node榄鉴,如果為空,cas嘗試寫入蛉抓,不成功庆尘,自旋保證成功
如果都不滿足,就synchronized 寫入數(shù)據(jù)
- 7 抽象類和接口區(qū)別
- 抽象類的修飾符可以public protected default,接口的修飾符只能是public
- 抽象類強調(diào)的是繼承,只聲明不實現(xiàn),是單繼承巷送,接口強調(diào)的實現(xiàn),是抽象方法的集合驶忌,可以多實現(xiàn)。
- 抽象類可以有構(gòu)造器笑跛,接口沒有
- 抽象類中可以包含非抽象方法付魔,也就是默認實現(xiàn),而接口的子類實現(xiàn)必須實現(xiàn)所有的方法
類單繼承飞蹂,接口可以多繼承几苍,一個類可以實現(xiàn)多個接口
- 8 jvm
共享區(qū)域:堆(年輕代(eden s0 s1)和老年代)和方法區(qū)
方法區(qū):存放已加載類信息、方法信息陈哑、常量池
- 9 棧內(nèi)存溢出
遞歸太深妻坝、循環(huán)沒有出口、靜態(tài)變量過多惊窖、大量字符串拼接刽宪、數(shù)據(jù)未分頁
內(nèi)存溢出
Dump機制會幫助我們,可以通過加上VM參數(shù)-XX:+HeapDumpOnOutOfMemoryError讓虛擬機在出現(xiàn)內(nèi)存溢出異常時生成dump文件界酒,然后通過外部工具(作者使用的是VisualVM)來具體分析異常的原因