(1),HashMap的源碼,實現(xiàn)原理,JDK8中對HashMap做了怎樣的優(yōu)化方灾。
--------HashMap是由數(shù)組(Entry[])+鏈表(拉鏈法)組成的存儲區(qū)間,HashMap<key,value>,的儲存規(guī)則:通過key的hash值(key.hashCode())%length(數(shù)組長度) <==>(key.hashCode()) & (length-1)<源碼方式:位運算時間復雜度低>,通過這個計算式算出hashmap中value的數(shù)組下標(bucketIndex:存儲位置)碌更。由于可能出現(xiàn)重復結(jié)果(比如:12%16=12,28%16=12,108%16=12),當出現(xiàn)重復結(jié)果時裕偿,這個被稱為哈希碼碰撞,出現(xiàn)這種情況是將進行equal()判斷痛单,hashCode不同嘿棘,equal()=false,hashCode相同,equal()不一定ture旭绒,通過hashCode和equal()對bucketIndex進行判斷鸟妙,判斷key是否存在,存在了挥吵,進行替換重父,key不存在,就進行鏈表存儲(Entry[i] = b,b.next = a)忽匈。JDK8引入紅黑樹(平衡的二叉樹)房午。而當鏈表長度太長(默認超過8)時,鏈表就轉(zhuǎn)換為紅黑樹丹允,利用紅黑樹快速增刪改查的特點提高HashMap的性能郭厌,其中會用到紅黑樹的插入、刪除雕蔽、查找等算法折柠。
(2),HaspMap擴容是怎樣擴容的萎羔,為什么都是2的N次冪的大小液走。
--------?HashMap有兩個參數(shù)影響其性能:初始容量和加載因子。默認初始容量是16贾陷,加載因子是0.75缘眶。容量是哈希表中桶(Entry數(shù)組)的數(shù)量,初始容量只是哈希表在創(chuàng)建時的容量髓废。加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度巷懈。當哈希表中的條目數(shù)超出了加載因子與當前容量的乘積時,通過調(diào)用 rehash 方法將容量翻倍慌洪。
當容量一定是2^n時顶燕,h & (length - 1) == h % length,它倆是等價不等效的冈爹,位運算效率非常高涌攻,實際開發(fā)中,很多的數(shù)值運算以及邏輯判斷都可以轉(zhuǎn)換成位運算频伤,但是位運算通常是難以理解的恳谎,因為其本身就是給電腦運算的,運算的是二進制憋肖,這個等式實際上可以推理出來因痛,2^n轉(zhuǎn)換成二進制就是1+n個0,減1之后就是0+n個1岸更,如16 -> 10000鸵膏,15 -> 01111,那根據(jù)&位運算的規(guī)則怎炊,都為1(真)時谭企,才為1,那0≤運算后的結(jié)果≤15评肆,假設(shè)h <= 15赞咙,那么運算后的結(jié)果就是h本身,h >15糟港,運算后的結(jié)果就是最后三位二進制做&運算后的值攀操,最終,就是%運算后的余數(shù)秸抚,我想速和,這就是容量必須為2的冪的原因。
(3)剥汤,二進制補碼
補碼:二進制數(shù)的反碼 + 1
負數(shù)的二進制形式(補碼形式存在):負數(shù)對應(yīng)正數(shù)的二進制數(shù)颠放,對正數(shù)二進制數(shù)取反(0->1, 1->0)得到反碼,再對反碼加1
1吭敢、一個正整數(shù),當用原碼碰凶、反碼、補碼表示時,符號位都固定為0,用二進制表示的數(shù)位值都相同,即三種表示方法完全一樣
2、一個負整數(shù),當用原碼欲低、反碼辕宏、補碼表示時,符號位都固定為1,用二進制表示的數(shù)位值都不相同,即三種表示方法完全一樣.此時由原碼表示法變成補碼表示法的規(guī)則如下:
①原碼符號位為1不變,整數(shù)的每一位二進制數(shù)位求反得到反碼
②反碼符號位為1不變,反碼數(shù)值為最低位加1,得到補碼
<< 1 : 左移1位(*2)? ? ? ? ? >> 1 : 右移1位( /2 )? ? ? >>> 1 : 正數(shù)與 >> 1 效果一樣,負數(shù)時砾莱,右移一位高位補0
>>:帶符號右移瑞筐。正數(shù)右移高位補0,負數(shù)右移高位補1腊瑟。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? >>>:無符號右移聚假。無論是正數(shù)還是負數(shù),高位通通補0闰非。
位運算:? ? ? ? ? ? ? 按位與(&):比較的兩者同為1時結(jié)果才為1膘格,否則為0
? ? ? ? ? ? ? ? ? ? ? ? ? ? 按位或( | ):比較的兩者只要有一個為1,結(jié)果就為1
????????????????????????????按位異或(^):比較的兩者相位為異(一個為0财松,另一個為1或反過來)則結(jié)果為1瘪贱,否則(同為1或同為0)結(jié)果為0
(4),HashMap游岳,HashTable政敢,ConcurrentHashMap的區(qū)別
-------- HashMap和HashTable:? ??
? ? ? ? ?1,hashMap是非線程安全(多并發(fā)情況下會出錯)胚迫,hashTable是線程安全喷户,內(nèi)部方法都是被synchronized修飾。
? ? ? ? ?2访锻,hashmap允許鍵和值都為null褪尝,hashtable只要鍵和值任一為null就會報NullPointerException(空指針異常)
? ? ? ? ?3,hashMap默認數(shù)組大小16期犬,hashmap擴容為乘2河哑, hashmap通過對哈希值進行位運算(h<key的hash值> & (length<數(shù)組長度> - 1));? ? ? ? ? ? ? ????hashtable默認數(shù)組大小11龟虎,hashtable擴容為乘2+1璃谨,hashmap通過對哈希值進行取模(h<key的hash值>?% (length<數(shù)組長度>));? ? ? ? ? ? ? ? ? ? ? 位運算處理效率遠高于取模運算鲤妥,位運算針對二進制運算(計算機采用二進制)
-------- HashMap和ConcurrentHashMap:
? ? ? ? 1佳吞,ConcurrentHashMap在HashMap的基礎(chǔ)上,引入"分段鎖"(segmentFor)的概念,將數(shù)據(jù)分為多個segment棉安,每個segment相當于一個? ? ? ?????????????hashtable底扳。默認大小為16(concurrency level),每次操作就對一個segment加鎖(不同于hashtable每次操作全部鎖死),避免多線程鎖的幾率贡耽,提高并發(fā)效率衷模。?
(5)鹊汛,HashMap在高并發(fā)下如果沒有處理線程安全會有怎樣的安全隱患,具體表現(xiàn)是什么阱冶。
? ?--------? ? ? ?1刁憋,HashMap在多線程下put可能造成get死循環(huán);? ? ? ? 2熙揍,多線程下put可能造成元素丟失(哈希碰撞造成元素覆蓋丟失)? ? ??
(6)职祷,java中四種修飾符的限制范圍氏涩。
????????????????public:同一個類届囚,同一個包,不同包的子類是尖,不同包的非子類?意系;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? protected:同一個類,同一個包饺汹,不同包的子類蛔添;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?默認(default):同一個類,同一個包兜辞;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? private:同一個類迎瞧;
(7),創(chuàng)建對象的五種方式
? ? ? ? ? ? 1逸吵,直接new(? ? ? ? ? ?new TestDemo()? ? ? ? ? ? ? )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2凶硅,使用class類的newInstance方法(? ? ? ??? ? NewInstanceDemo.class.newInstance()? ? ? ? ? ? ?)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3,使用constructor類的newInstance方法(? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????Constructor<NewInstanceDemo> constructor = NewInstanceDemo.class.getConstructor();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NewInstanceDemo newInstanceDemo_constructor = constructor.newInstance();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4扫皱,使用clone方法(? ? ? ???(CloneDemo) demo.clone()足绅,demo需要調(diào)用Cloneable接口? ? ? ???)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5,使用反序列化(? ? ? ? 對象調(diào)用Serializable? ? ? ? ?)
(8)韩脑,Object類中的方法
? ? ? ? ? ? ? Object()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? clone():另存一個當前對象氢妈;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? equal():判定兩個對象是否相同? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hashCode():獲取對象的hash值用于? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? toString():返回一個String對象;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? getClass():返回一個Class對象;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wait():讓當前線程失去操作權(quán)限段多,當前線程進入等待序列? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wait(long):long為最大等待時間(毫秒)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wait(long,int);?long為最大等待時間(毫秒)首量,int:納秒? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? notify():對某一持有對象鎖的線程獲取操作權(quán)限? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? notifyAll(): 對所有持有對象鎖的線程獲取操作權(quán)限? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? finalize():在垃圾回收時調(diào)用
(9),接口和抽象類的區(qū)別进苍,注意JDK8的接口可以有實現(xiàn)加缘。
? ? ? ? ? ? ? 1,接口可以多實現(xiàn)琅捏,抽象類只能單繼承(本質(zhì):一個類可以調(diào)用多個接口生百,但只能繼承一個類)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2,抽象類可以由abstract + public(或protect)修飾柄延,接口只能通過abstract+public修飾? ? ? ? ? ? ? ? ? ?3蚀浆,抽象類可以有子類實行的抽象方法也可以有具體方法缀程,jdk8以前,接口只有子類實現(xiàn)的抽象方法市俊,jdk8時杨凑,接口也可以有具體實現(xiàn)方法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4,變量上摆昧,抽象類可以有各種修飾符對變量進行修飾撩满,接口中只能有public statc final(接口中變量只能讀不能寫,接口是對開閉原則的體現(xiàn))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?5,抽象類可以有靜態(tài)代碼塊和靜態(tài)方法绅你,接口不能有靜態(tài)代碼塊和需要子類實現(xiàn)的靜態(tài)方法伺帘,但可以有具體實現(xiàn)的靜態(tài)方法(jdk8)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6,抽象類可以有構(gòu)造方法忌锯,接口不能有構(gòu)造方法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7伪嫁,接口只能繼承(extends)接口,抽象類可以繼承(extends)類偶垮,也能調(diào)用(implements)接口
(10)张咳,動態(tài)代理的兩種方式,以及區(qū)別
? ? ? ? ? ? ? ? jdk動態(tài)代理:jdk內(nèi)置的Proxy動態(tài)代理可以在運行時動態(tài)生成字節(jié)碼似舵,而沒必要針對每個類編寫代理類脚猾。中間主要使用InvocationHandle和Proxy.newProxyInstance(loader,interfaces,h) --->? ? ? loader:一個ClassLoader對象,定義由哪個ClassLoader對象來生成對象進行加載? ? ? ? ? ? ---->? ? ? interfaces:一個Interface對象的數(shù)組砚哗,表示的是我將要給我需要代理的對象提供一組什么接口龙助,如果我提供一組接口給它,那么這個代理對象就宣稱實現(xiàn)了該接口(多態(tài))频祝,這樣就能調(diào)用接口中的方法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ----->? ? ?h:一個InvocationHandler對象泌参,表示的是當我這個動態(tài)代理對象在調(diào)用方法的時候,會關(guān)聯(lián)到哪一個InvocationHandler對象上常空,間接通過invoke來執(zhí)行? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 缺點:被代理的類必須實現(xiàn)接口沽一,未實現(xiàn)接口則沒辦法完成動態(tài)代理。
? ? ? ? ? ? ? ? cglib動態(tài)代理:針對類來實現(xiàn)代理漓糙,原理是對指定的業(yè)務(wù)類生成一個子類铣缠,并覆蓋其中業(yè)務(wù)方法實現(xiàn)代理。因為采用的是繼承昆禽,所以不能對final修飾的類進行代理
(11)蝗蛙,Java序列化的方式
? ? ? ? ? ? 序列化:將java對象轉(zhuǎn)變成字節(jié)流形式。用于:寫入硬盤或通過網(wǎng)絡(luò)傳輸數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 實現(xiàn)方法:1醉鳖,實體類調(diào)用Serializable接口捡硅;? ? ? 2,實體類調(diào)用Externalizable
(12)盗棵,傳值和傳引用的區(qū)別壮韭,Java是怎么樣的北发,有沒有傳值引用
? ? ? ? ? ? 1、在java中的參數(shù)傳遞都是按值傳遞喷屋,這句話的意思:按值傳遞是傳遞的值的拷貝琳拨,按引用傳遞其實傳遞的是引用的地址值,所以統(tǒng)稱按值傳遞屯曹。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2狱庇、在java中只有基本類型(int 等)和特殊定義方式的String(舉例:String str = “aaa”)是按值傳遞,其它的都是按引用傳遞恶耽。
(13)密任,一個ArrayList在循環(huán)過程中刪除,會不會出問題驳棱,為什么? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1批什、循環(huán)刪除時农曲,可能會造成需要刪除的連續(xù)數(shù)據(jù)社搅,沒有刪除干凈(比如:正序遍歷使用remove()方法刪除兩個連續(xù)的“b”字符時,第二個字符不能刪除)乳规,解決方法:倒序遍歷刪除? ? ? ? ? ? ? ?2形葬、foreach循環(huán)遍歷使用remove()方法刪除數(shù)據(jù)時會報(ConcurrentModificationException: list的remove()方法改變了modCount的值,而foreach類似于Iterator的簡寫暮的,iterator中有? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?final void checkForComodification() {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (modCount != expectedModCount)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? throw new ConcurrentModificationException();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
)笙以。解決方法:改用Iterator的remove()方法
(14),@transactional注解在什么情況下會失效冻辩,為什么
? ? ? ? ? ? 屬于聲明式事務(wù)管理猖腕,常作用于方法,用于當方法拋出異常時恨闪,對事務(wù)進行回滾倘感,保證數(shù)據(jù)一致性。@Transactional注解只能作用于public方法咙咽,其它protected等雖然不會報錯但注解無用老玛,默認情況下,@Transactional會對 unchecked異常 進行事務(wù)回滾钧敞,不會對 checked異常 作用蜡豹。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Transactional注解失效:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1、方法是否為public修飾溉苛;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2镜廉、異常類型是否為unchecked;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3愚战、數(shù)據(jù)庫引擎需要支持事務(wù)(比如:mysql需要使用innodb修飾表)娇唯;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4威根、是否開啟對注解的解析(<tx:annotation-driver transaction-manager="transactionManager" proxy-target-class="true">);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5视乐、spring是否掃描到該包洛搀;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6、異常是否被catch佑淀,未拋出?
(15)留美,異常與錯誤
? ? ? ? ? ? ? ? 異常(Exception)與錯誤(Error)繼承同一個接口(Throwable)。Exception伸刃,是程序可以解決的異常谎砾。Error是程序無法處理的錯誤(如:jvm出現(xiàn)錯誤)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? java里面將派生于Error或者RuntimeException(比如空指針捧颅,1/0)的異常稱為unchecked異常景图,其他繼承自java.lang.Exception得異常統(tǒng)稱為Checked Exception,如IOException碉哑、TimeoutException等
(16)挚币,八大排序
? ? ? ? ? ? ? ? 直接插入排序,shell排序扣典,直接選擇排序妆毕,冒泡排序---------->時間復雜度:O(n^2)? ? ? ? ? ? ? ? ? ? ? ? ? ? 快速排序:時間復雜度,平均和最好情況下:O(nlog2n)贮尖,最壞情況:O(n^2)笛粘,是不穩(wěn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 定排序。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 堆排序:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 歸并排序:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 基數(shù)排序:
(17)湿硝,jvm內(nèi)存結(jié)構(gòu)
? ? ? ? ? ? ? 程序計數(shù)器:jvm中的程序計數(shù)器與匯編中所屬的程序計數(shù)器(PC寄存器)薪前,除了無物理概念上的實體外,功能上與之相同关斜。用于當前需要執(zhí)行的指令的地址(java多線程的實現(xiàn)是通過線程之間輪流獲取cpu執(zhí)行時間來實現(xiàn)的示括,因此任何時刻cpu只會執(zhí)行一個線程的指令,所以為了線程之間互不干擾蚤吹,每個線程都有自己獨立的程序計數(shù)器例诀,可以說程序計數(shù)器是每個線程所私有的)。jvm規(guī)定裁着,在執(zhí)行非native方法時繁涂,程序計數(shù)器保存的是當前需要執(zhí)行的指令的地址,而在執(zhí)行native(本地)方法時二驰, 程序計數(shù)器中的值為undefined扔罪。程序計數(shù)器的存儲空間不會隨程序執(zhí)行而發(fā)生變化,所以不會產(chǎn)生內(nèi)存溢出的情況(OutOfMemory)桶雀;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?java棧:java棧就是java方法執(zhí)行的內(nèi)存模型矿酵,java棧中存放著一個個的棧幀唬复,每一個棧幀對應(yīng)一個調(diào)用的方法,每個棧幀有局部變量表(用于存儲方法中的局部變量全肮,包括非靜態(tài)變量以及函數(shù)形參敞咧,對于基本類型變量直接存儲值,對于引用類型變量則存儲對象的引用)辜腺,操作數(shù)棧休建,指向當前方法所屬的類的運行時常量池的引用,方法返回地址评疗,一些額外附加信息测砂。當前線程執(zhí)行的方法必定在java棧的頂部(這就是遞歸方法易造成棧溢出),每個線程都有自己獨立的java棧百匆;? ? ? ? ? ? ? ? ? ? ?本地方法棧:功能類似于java棧砌些,但本地方法棧服務(wù)于本地方法(Native method);? ? ? ? ? ? ? ? ? ? ?堆:用于存儲對象本身和數(shù)組(數(shù)組引用存于java棧中)加匈,堆是被所有線程共享的存璃,在jvm中只有一個堆;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 方法區(qū):方法區(qū)被所有線程共享矩动,方法區(qū)用于存儲每個類的信息(類名有巧,方法信息,字段信息等)悲没,靜態(tài)變量,常量男图,編譯器編譯后的代碼等示姿;
(18),JVM方法棧的工作過程逊笆,方法棧和本地方法棧有什么區(qū)別
????????????????JVM方法棧的工作過程:java棧對于每個線程是私有的,java棧中存放著一個個棧幀,每個棧幀對應(yīng)一個方法麦向,當程序執(zhí)行一個方法時就會創(chuàng)建一個棧幀并對其進行壓棧至到方法執(zhí)行完成再出棧祷膳。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?方法棧作用于java方法,本地方法棧功能類似于方法棧乃戈,但卻作用于本地方法(Native Method)
(19)褂痰,JVM的棧中引用如何和堆中的對象產(chǎn)生關(guān)聯(lián)
? ? ? ? ? ? ? ? 在堆中產(chǎn)生一個數(shù)組或?qū)ο蠛螅梢栽跅V卸x一個特殊變量症虑,讓棧中的變量取值等于對象或數(shù)組在堆內(nèi)存中的首地址缩歪,棧中的這個變量就成了堆中對象或數(shù)組的引用變量。
(20)谍憔,jvm中GC回收對象:jvm中匪蝙,程序計數(shù)器主籍,虛擬機(java)棧,本地方法棧都隨線程而生隨線程而滅逛球,棧幀隨著方法的進入和退出做入棧出棧操作千元,實現(xiàn)了自動內(nèi)存清理,因此颤绕,垃圾回收主要集中于java堆和方法區(qū)中诅炉。
(21),GC的常見算法屋厘,CMS以及G1的垃圾回收過程涕烧,CMS的各個階段哪兩個是Stop the world的,CMS會不會產(chǎn)生碎片汗洒,G1的優(yōu)勢
????????????GC常見算法:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?引用計數(shù)法:為對象添加一個引用計數(shù)器议纯,每多一個引用就加一,每少一個引用就減一溢谤,當引用數(shù)為0時將不能被引用瞻凤。實現(xiàn)簡單但不能用于互相循環(huán)引用的問題;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 根搜索算法:以一系列叫“GC Roots”的對象(java棧引用的對象世杀,方法區(qū)中的類靜態(tài)屬性引用的對象阀参,方法區(qū)中常量引用的對象,本地方法棧中引用的對象)作為起點向下搜索瞻坝,走過的路徑稱為引用鏈蛛壳,當一個對象沒有和任何引用鏈相連時,證明此對象不可用(圖論的說法為:不可達)所刀,那么判定對象為可回收對象衙荐;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?標記-清除算法:分為標記和清除兩個階段,先把所有活動的對象標記出來浮创,然后把沒有被標記的對象統(tǒng)一清除掉忧吟。但存在兩個問題:一是效率問題,兩個過程效率都不高斩披,二是空間問題溜族,清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 復制算法:將原有的內(nèi)存空間分成兩塊垦沉,每次只使用其中一塊煌抒。在GC時,將正在使用的內(nèi)存塊中存活的對象復制到未使用的那一塊中乡话,然后清除正在使用的內(nèi)存塊中剩余的所有對象摧玫,并交換兩塊內(nèi)存的角色,完成一次垃圾回收。它比標記-清楚算法高效诬像,但不適用于存活對象較多的內(nèi)存屋群,因為這樣復制時間會消耗太多,同時只有一半內(nèi)存使用將造成極大內(nèi)存浪費坏挠;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????????????????標記整理算法:適用于存活對象較多的場合芍躏,標記階段與標記-清除算法的標記階段一樣,整理階段降狠,將所有存活的對象壓縮到內(nèi)存的一端对竣,之后清理邊界外所有的空間。弊端:效率不高榜配;
? ??????????CMS以及G1的垃圾回收過程否纬,CMS的各個階段哪兩個是Stop the world的,CMS會不會產(chǎn)生碎片蛋褥,G1的優(yōu)勢? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CMS收集器:是一種以獲取最短回收停頓時間為目的的收集器临燃,是基于“標記-清楚”算法實現(xiàn)的,共四個步驟:初始標記<只標記GC Roots直接關(guān)聯(lián)到的對象>烙心;并發(fā)標記<進行GC Roots Tracing的過程>膜廊,重新標記<修正并發(fā)標記期間因程序繼續(xù)運行而導致標記產(chǎn)生變動的一部分對象的標記記錄>,并發(fā)清除<清楚未標記的對象>淫茵。其中初始標記和重新標記任然需要“Stop The World”(在執(zhí)行垃圾收集算法時爪瓜,java應(yīng)用程序中系統(tǒng)只允許GC線程進行運行,其他線程全部被掛起)匙瘪。優(yōu)勢:并發(fā)收集铆铆,低停頓。缺點:產(chǎn)生大量空間碎片辆苔,并發(fā)階段會降低吞吐量算灸。? ? ? ? ? ? ? ? ? G1收集器與CMS相比的優(yōu)勢:1,空間整合驻啤,G1采用標記整理算法,不會產(chǎn)生內(nèi)存空間碎片荐吵。分配大對象是不會因為無法找到連續(xù)空間而提前觸發(fā)下一次GC骑冗;2,可預(yù)測停頓先煎,G1不止降低停頓時間還能建立可預(yù)測的停頓時間模型贼涩,能讓使用者明確指定在一個長度為N毫秒的時間片段內(nèi),消耗在垃圾收集上的時間不得超過N毫秒薯蝎。遥倦,,
(22),靜態(tài)方法中不能調(diào)用非靜態(tài)方法袒哥,非靜態(tài)方法可以調(diào)用靜態(tài)方法和非靜態(tài)方法缩筛。原因:靜態(tài)方法屬于類的,當類加載時就會為其分配內(nèi)存空間堡称;而非靜態(tài)方法屬于對象瞎抛,需要當創(chuàng)建一個對象后才能為其分配內(nèi)存空間。所以當靜態(tài)方法中直接調(diào)用非靜態(tài)方法時却紧,就相當于在調(diào)用一個不存在的方法桐臊。
(23),開放-封閉原則:針對拓展是開放的晓殊,針對修改是封閉的断凶。
?????????????? 里氏替換原則:子類型必須能完全替代父類型。
?????????????? 依賴倒轉(zhuǎn)原則:對抽象進行編程巫俺,不要對實現(xiàn)進行編程认烁。
?????????????? 工廠模式:定義一個創(chuàng)建對象的工廠接口,工廠接口本身不創(chuàng)建對象识藤,而是交給子類或其實現(xiàn)類去創(chuàng)建砚著,將實際創(chuàng)建工作放到子類中去完成。
??????????????? 單例模式:創(chuàng)建對象模式之一痴昧,確保一個類只能創(chuàng)建一個實例對象稽穆。需確保兩點:1、不能讓外界創(chuàng)建對象赶撰,換而言之舌镶,構(gòu)造方法需要為私有;2豪娜、提供可以得到實例對象的接口
(24)餐胀,Math.random()取的是:[0,1)的隨機數(shù)