[TOC]
1空民、基礎(chǔ)知識
-
StringBuilder String StringBuffer的區(qū)別橱脸,String為啥不可變
- 可變性
- String 源碼實現(xiàn)的時候使用了final修飾 private final char value[]
- String buffer StringBuilder 都是AbstractStringBuilder類饲鄙,這個類沒有final修飾
- 安全性
- String對象不可變,常量,安全
- StringBuilder對方法加了同步鎖歹垫,對調(diào)用方法加了同步鎖,安全
- 沒有加同步鎖颠放,并不安全
- 性能
- 每次對StringBuilder本身操作排惨,不生成新的對象改變對象引用,所以Builder比Buffer僅僅多獲得了10% 的性能提升碰凶,但是卻有多線程不安全的風(fēng)險
- 結(jié)論:
- 數(shù)據(jù)少的時候直接String
- 數(shù)據(jù)多的時候暮芭,單線程鹿驼,就是Stringbuilder
- 多線程,StringBuilder
- 可變性
-
== 與equal
- equal:沒有覆蓋equal()方法的辕宏,等價于
==
比較這兩個對象 - 覆蓋了equals方法的時候畜晰,一般我們都覆蓋這個方法來比較兩個對象內(nèi)容相等
- String中的equal重寫過,Object中的方法比較的是內(nèi)存地址瑞筐,String比較的是兩個值
- equal:沒有覆蓋equal()方法的辕宏,等價于
-
final
- final變量:基本數(shù)據(jù)類型凄鼻,初始化之后不能修改,引用類的變量聚假,地址值就不能修改
- final類:不能被繼承块蚌,所有的方法都默認(rèn)變成final方法
- final方法:方法鎖定,防止任何繼承類修改它魔策,效率匈子,private都隱式的將方法指定成final
-
finally不會被執(zhí)行的情況
- 在finally語句塊中發(fā)生了異常
- 前面的代碼中使用了System.exit();
- 線程死亡
- CPU結(jié)束
-
接口和抽象類的區(qū)別
接口默認(rèn)方法都是pinlic 所有的方法在接口中不能實現(xiàn),java8之后可以有默認(rèn)實現(xiàn)抽象類可以有飛抽象的方法
接口中的實例變量默認(rèn)都是final類型的闯袒,抽象類不一定
一個類可以實現(xiàn)多個接口虎敦,但是最多只能實現(xiàn)一個抽象類
一個類實現(xiàn)接口的話,要實現(xiàn)接口所有的接口政敢,抽象類不一定
-
接口不能用new實例化其徙,但是可以申明。
- 抽象是類的抽象喷户,一種模板設(shè)計
- 接口是行為抽象唾那,一種行為規(guī)范
jdk8中,接口定義靜態(tài)方法褪尝,接口名調(diào)用闹获。
如果同時實現(xiàn)了兩個接口,接口中一定要重寫河哑,不然會報錯避诽。
2. Java集合框架
- Arraylist 的LinkedList
- 是否保證線程安全:ArrayList LinkedList 不同步的,不保證線程安全
- 數(shù)據(jù)結(jié)果:Arraylist Object數(shù)組璃谨,LinkedList 雙向鏈表數(shù)據(jù)結(jié)構(gòu)沙庐,1.6之前是循環(huán)鏈表,1.7取消了循環(huán)
- 插入和刪除元素:ArrayList 數(shù)組佳吞,增刪時間復(fù)雜度受元素位置的影響拱雏。LinkedList受時間復(fù)雜度都是O(1)
- ArrayList支持搞笑隨機(jī)元素訪問,LinkedList不支持
- 內(nèi)存占用:list列表結(jié)尾會預(yù)留一定的容量空間底扳,LinkedList每一個元素消耗都多與ArrayList
- ArrayList與Vector區(qū)別
- Vector是同步的铸抑,兩個線程安全的訪問衣蛾Vector對象,但是一個線程訪問的話衷模,代碼時間可能會比較長鹊汛。
- HashMap
- 1.8之前:數(shù)組和鏈表結(jié)合在一起 形成鏈表散列
- 1.8之后:解決哈希沖突的時候菇爪,當(dāng)鏈表長度大于閾值,就會將鏈表轉(zhuǎn)化為紅黑樹柒昏,減少搜索時間。
- HashMap HashTable
- x線程安全 熙揍,Map是不安全的职祷,table是安全的。table所有的方法都經(jīng)過synchronized修飾届囚。ConcurrentHashMap線程也是安全的有梆,推薦用這個 ,如果有需求的話
- 效率意系,因為線程安全的問題泥耀,HashMap比HashTable效率高。HashTable被淘汰了不要用
- 初始大小蛔添,hashMap初始大小默認(rèn)是11痰催,每次擴(kuò)充,容量就是2n+1
- HashMap /HashSet
- HashSet的底層是HashMap實現(xiàn)的
- HashSet 的值存放于HashMap的key中迎瞧,所以不能重復(fù)
- ConcurrenthashMap Hashtable
- 數(shù)據(jù)結(jié)構(gòu):
- ConcurtenthashMap 1.7以前分段數(shù)組+鏈表 實現(xiàn)夸溶,1.8數(shù)據(jù)結(jié)構(gòu)和hashMap1,8一樣,數(shù)組+紅黑
- table he 1.8以前的hashMap的底層數(shù)據(jù)結(jié)構(gòu)類似凶硅,都是采用數(shù)組+鏈表的形式缝裁。數(shù)組是HashMap的主體,鏈表是為了解決沖突存在的
- 線程安全:
- 1.7之前ConcurrentHashMap對整個數(shù)組進(jìn)行了分割分段足绅,沒一把鎖只鎖容器的一部分捷绑,多線程訪問不同的容器,就不會競爭氢妈,提高效率
- 1.8之后直接采用Node+鏈表+紅黑樹的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)粹污。
- Hashtable 使用synchronized保證線程安全,功效底下允懂。競爭可能會越來越大
- 數(shù)據(jù)結(jié)構(gòu):