Java相關(guān)
1.靜態(tài)內(nèi)部類、內(nèi)部類公条、匿名內(nèi)部類拇囊,為什么內(nèi)部類會(huì)持有外部類的引用?持有的引用是this?還是其它?
靜態(tài)內(nèi)部類:使用static修飾的內(nèi)部類
內(nèi)部類:就是在某個(gè)類的內(nèi)部又定義了一個(gè)類,內(nèi)部類所嵌入的類稱為外部類
匿名內(nèi)部類:使用new生成的內(nèi)部類
因?yàn)閮?nèi)部類的產(chǎn)生依賴于外部類靶橱,持有的引用是類名.this
2.Java中try catch finally的執(zhí)行順序
先執(zhí)行try中代碼寥袭,如果發(fā)生異常執(zhí)行catch中代碼,最后一定會(huì)執(zhí)行finally中代碼
3.equals與==的區(qū)別:
==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間 equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相等
使用==比較有兩種情況:
比較基礎(chǔ)數(shù)據(jù)類型(Java中基礎(chǔ)數(shù)據(jù)類型包括八中:short,int,long,float,double,char,byte,boolen):這種情況下关霸,==比較的是他們的值是否相等纠永。
使用equals進(jìn)行比較:
equals追根溯源,是Object類中的一個(gè)方法谒拴,在該類中尝江,equals的實(shí)現(xiàn)也僅僅只是比較兩個(gè)對(duì)象的內(nèi)存地址是否相等,但在一些子類中英上,如:String炭序、Integer 等,該方法將被重寫苍日。
引用間的比較:在這種情況下惭聂,==比較的是他們?cè)趦?nèi)存中的地址,也就是說相恃,除非引用指向的是同一個(gè)new出來的對(duì)象辜纲,此時(shí)他們使用==
去比較得到true,否則拦耐,得到false耕腾。
4.Object有哪些公用方法?
方法equals測(cè)試的是兩個(gè)對(duì)象是否相等
方法clone進(jìn)行對(duì)象拷貝
方法getClass返回和當(dāng)前對(duì)象相關(guān)的Class對(duì)象
方法notify,notifyall,wait都是用來對(duì)給定對(duì)象進(jìn)行線程同步的
5.String、StringBuffer與StringBuilder的區(qū)別
String 類型和 StringBuffer 類型的主要性能區(qū)別其實(shí)在于 String 是不可變的對(duì)象 StringBuffer和StringBuilder底層是 char[]數(shù)組實(shí)現(xiàn)的 StringBuffer是線程安全的杀糯,而StringBuilder是線程不安全的
6.Java的四種引用的區(qū)別
強(qiáng)引用:如果一個(gè)對(duì)象具有強(qiáng)引用扫俺,它就不會(huì)被垃圾回收器回收。即使當(dāng)前內(nèi)存空間不足固翰,JVM 也不會(huì)回收它狼纬,而是拋出 OutOfMemoryError 錯(cuò)誤羹呵,使程序異常終止。如果想中斷強(qiáng)引用和某個(gè)對(duì)象之間的關(guān)聯(lián)疗琉,可以顯式地將引用賦值為null冈欢,這樣一來的話,JVM在合適的時(shí)間就會(huì)回收該對(duì)象
軟引用:在使用軟引用時(shí)盈简,如果內(nèi)存的空間足夠凑耻,軟引用就能繼續(xù)被使用,而不會(huì)被垃圾回收器回收送火,只有在內(nèi)存不足時(shí)拳话,軟引用才會(huì)被垃圾回收器回收。
弱引用:具有弱引用的對(duì)象擁有的生命周期更短暫种吸。因?yàn)楫?dāng) JVM 進(jìn)行垃圾回收弃衍,一旦發(fā)現(xiàn)弱引用對(duì)象,無論當(dāng)前內(nèi)存空間是否充足坚俗,都會(huì)將弱引用回收镜盯。不過由于垃圾回收器是一個(gè)優(yōu)先級(jí)較低的線程,所以并不一定能迅速發(fā)現(xiàn)弱引用對(duì)象
虛引用:顧名思義猖败,就是形同虛設(shè)速缆,如果一個(gè)對(duì)象僅持有虛引用,那么它相當(dāng)于沒有引用恩闻,在任何時(shí)候都可能被垃圾回收器回收艺糜。
7.介紹垃圾回收機(jī)制
標(biāo)記回收法:遍歷對(duì)象圖并且記錄可到達(dá)的對(duì)象,以便刪除不可到達(dá)的對(duì)象幢尚,一般使用單線程工作并且可能產(chǎn)生內(nèi)存碎片
標(biāo)記-壓縮回收法:前期與第一種方法相同破停,只是多了一步,將所有的存活對(duì)象壓縮到內(nèi)存的一端尉剩,這樣內(nèi)存碎片就可以合成一大塊可再利用的內(nèi)存區(qū)域真慢,提高了內(nèi)存利用率
復(fù)制回收法:把現(xiàn)有內(nèi)存空間分成兩部分,gc運(yùn)行時(shí)理茎,它把可到達(dá)對(duì)象復(fù)制到另一半空間黑界,再清空正在使用的空間的全部對(duì)象。這種方法適用于短生存期的對(duì)象皂林,持續(xù)復(fù)制長(zhǎng)生存期的對(duì)象則導(dǎo)致效率降低朗鸠。
分代回收發(fā):把內(nèi)存空間分為兩個(gè)或者多個(gè)域,如年輕代和老年代式撼,年輕代的特點(diǎn)是對(duì)象會(huì)很快被回收童社,因此在年輕代使用效率比較高的算法。當(dāng)一個(gè)對(duì)象經(jīng)過幾次回收后依然存活著隆,對(duì)象就會(huì)被放入稱為老年的內(nèi)存空間扰楼,老年代則采取標(biāo)記-壓縮算法
集合中燥、數(shù)據(jù)結(jié)構(gòu)相關(guān)
1哈蝇、數(shù)據(jù)結(jié)構(gòu)中用于存儲(chǔ)數(shù)據(jù)的有哪些
數(shù)組、鏈表
數(shù)組存儲(chǔ)區(qū)間是連續(xù)的裸诽,占用內(nèi)存嚴(yán)重浦辨,故空間復(fù)雜的很大蹬竖。但數(shù)組的二分查找時(shí)間復(fù)雜度小,為O(1);數(shù)組的特點(diǎn)是:尋址容易流酬,插入和刪除困難;
鏈表存儲(chǔ)區(qū)間離散币厕,占用內(nèi)存比較寬松,故空間復(fù)雜度很小芽腾,但時(shí)間復(fù)雜度很大旦装,達(dá)O(N)。鏈表的特點(diǎn)是:尋址困難摊滔,插入和刪除容易阴绢。
2.說說hashMap是怎樣實(shí)現(xiàn)的
哈希表:由數(shù)組+鏈表組成的
當(dāng)我們往HashMap中put元素的時(shí)候,先根據(jù)key的hashCode重新計(jì)算hash值艰躺,根據(jù)hash值得到這個(gè)元素在數(shù)組中的位置(即下標(biāo))呻袭,如果數(shù)組該位置上已經(jīng)存放有其他元素了,那么在這個(gè)位置上的元素將以鏈表的形式存放腺兴,新加入的放在鏈頭左电,最先加入的放在鏈尾。如果數(shù)組該位置上沒有元素页响,就直接將該元素放到此數(shù)組中的該位置上篓足。
3.ArrayList,LinkedList的區(qū)別
ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)拘泞。
對(duì)于隨機(jī)訪問get和set纷纫,ArrayList覺得優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針陪腌。
對(duì)于新增和刪除操作add和remove辱魁,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)诗鸭。
4.ArrayList和Vector的主要區(qū)別是什么?
ArrayList 和Vector底層是采用數(shù)組方式存儲(chǔ)數(shù)據(jù)
Vector:
線程同步
當(dāng)Vector中的元素超過它的初始大小時(shí)染簇,Vector會(huì)將它的容量翻倍,
ArrayList:
線程不同步强岸,但性能很好
當(dāng)ArrayList中的元素超過它的初始大小時(shí)锻弓,ArrayList只增加50%的大小
5.HashMap和 HashTable 的區(qū)別:
HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn))他們都完成了Map接口
HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable
Hashtable繼承自Dictionary類,Hashtable的方法是Synchronize的
在多個(gè)線程訪問Hashtable時(shí)蝌箍,不需要自己為它的方法實(shí)現(xiàn)同步青灼,而HashMap 必須為之提供外同步
6暴心、String是最基本的數(shù)據(jù)類型嗎?
基本數(shù)據(jù)類型包括byte、int杂拨、short专普、long、float弹沽、double檀夹、char、boolean
7策橘、int 和 Integer 有什么區(qū)別炸渡?
Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)。Int是java的原始數(shù)據(jù)類型丽已,Integer是java為int提供的封裝類
8蚌堵、 String、StringBuffer與StringBuilder的區(qū)別促脉。###
它們可以儲(chǔ)存和操作字符串辰斋。
這個(gè)String類提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer StringBuilder類提供的字符串進(jìn)行修改瘸味。
StringBuilder是JDK1.5引入的宫仗,它和StringBuffer的方法完全相同,區(qū)別在于它是單線程環(huán)境下使用的旁仿,因?yàn)樗乃蟹矫娑紱]有被synchronized修飾藕夫,因此它的效率也比StringBuffer略高。
9枯冈、運(yùn)行時(shí)異常與一般異常有何異同
運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常毅贮,是一種常見運(yùn)行錯(cuò)誤。
10尘奏、 說出ArrayList,Vector, LinkedList的存儲(chǔ)性能和特性
ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù)滩褥。允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作索引數(shù)據(jù)快而插入數(shù)據(jù)慢
LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ)炫加。按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可瑰煎,插入速度較快
11、Collection 和 Collections的區(qū)別俗孝?
Collection是集合類的上級(jí)接口酒甸,繼承與他的接口主要有Set 和List.
Collections是針對(duì)集合類的一個(gè)幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索赋铝、排序插勤、線程安全化等操作
12、final, finally, finalize的區(qū)別?
final 用于聲明屬性农尖,方法和類析恋,分別表示屬性不可變,方法不可覆蓋卤橄,類不可繼承绿满。
finally是異常處理語句結(jié)構(gòu)的一部分臂外,表示總是執(zhí)行窟扑。
finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法漏健,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收嚎货,例如關(guān)閉文件等。
13蔫浆、sleep() 和 wait() 有什么區(qū)別?
sleep是線程類(Thread)的方法殖属,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程瓦盛,但是監(jiān)控狀態(tài)依然保持洗显,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖原环。
wait是Object類的方法挠唆,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池嘱吗,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)玄组。
14、Overload和Override的區(qū)別谒麦?Overloaded的方法是否可以改變返回值的類型?
方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)
重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn)
重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)
16俄讹、同步和異步有何異同,在什么情況下分別使用他們绕德?舉例說明患膛。
如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到耻蛇,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了踪蹬,那么這些數(shù)據(jù)是共享數(shù)據(jù),必須進(jìn)行同步存取城丧。
17延曙、Static Nested Class 和 Inner Class的不同?
Static Nested Class是被聲明為靜態(tài)(static)的內(nèi)部類亡哄,它可以不依賴于外部類實(shí)例被實(shí)例化枝缔。而通常的內(nèi)部類需要在外部類實(shí)例化后才能實(shí)例化。
18、Set里的元素是不能重復(fù)的愿卸,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?
Set里的元素是不能重復(fù)的灵临,那么用iterator()方法來區(qū)分重復(fù)與否。equals()是判讀兩個(gè)Set是否相等趴荸。
equals()和==方法決定引用值是否指向同一對(duì)象equals()在類中被覆蓋儒溉,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類型相配的話,返回真值
19发钝、構(gòu)造器Constructor是否可被override?
構(gòu)造器Constructor不能被繼承顿涣,因此不能重寫Overriding,但可以被重載Overloading酝豪。
20涛碑、是否可以繼承String類?
String類是final類故不可以繼承。
21孵淘、try {}里有一個(gè)return語句蒲障,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,在return前還是后?
會(huì)執(zhí)行瘫证,在return前執(zhí)行揉阎。
22、編程題: 寫一個(gè)Singleton出來
public class Singleton {
private Singleton(){}
//在自己內(nèi)部定義自己一個(gè)實(shí)例背捌,是不是很奇怪毙籽?
//注意這是private 只供內(nèi)部調(diào)用
private static Singleton instance = new Singleton();
//這里提供了一個(gè)供外部訪問本class的靜態(tài)方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個(gè)方法比上面有所改進(jìn)载萌,不用每次都進(jìn)行生成對(duì)象惧财,只是次
//使用時(shí)生成實(shí)例,提高了效率扭仁!
if (instance==null)
instance=new Singleton();
return instance; }
}
24垮衷、你所知道的集合類都有哪些?主要方法乖坠?
最常用的集合類是 List 和 Map搀突。 List 的具體實(shí)現(xiàn)包括 ArrayList 和 Vector,它們是可變大小的列表熊泵,比較適合構(gòu)建仰迁、存儲(chǔ)和操作任何類型對(duì)象的元素列表。 List 適用于按數(shù)值索引訪問元素的情形顽分。
Map 提供了一個(gè)更通用的元素存儲(chǔ)方法徐许。 Map 集合類用于存儲(chǔ)元素對(duì)(稱作“鍵”和“值”),其中每個(gè)鍵映射到一個(gè)值卒蘸。
26雌隅、集合詳解
set HashSet Treeset Set中不包含重復(fù)的元素
List ArrayList LinkedList Vector 允許重復(fù)項(xiàng)的有序集合
以上都是Collection接口派生
Map HashMap TreeMap()
27翻默、Switch能否用string做參數(shù)?
在Java 5以前恰起,switch(expr)中修械,expr只能是byte、short检盼、char肯污、int。
從Java 5開始吨枉,Java中引入了枚舉類型蹦渣,expr也可以是enum類型,從Java 7開始东羹,expr還可以是字符串(String)剂桥,但是長(zhǎng)整型(long)在目前所有的版本中都是不可以的。
28属提、Hashcode的作用。
以Java.lang.Object來理解,JVM每new一個(gè)Object,它都會(huì)將這個(gè)Object丟到一個(gè)Hash哈希表中去,這樣的話,下次做Object的比較或者取這個(gè)對(duì)象的時(shí)候,它會(huì)根據(jù)對(duì)象的hashcode再從Hash表中取這個(gè)對(duì)象美尸。這樣做的目的是提高取對(duì)象的效率冤议。具體過程是這樣:
new Object(),JVM根據(jù)這個(gè)對(duì)象的Hashcode值,放入到對(duì)應(yīng)的Hash表對(duì)應(yīng)的Key上,如果不同的對(duì)象確產(chǎn)生了相同的hash值,也就是發(fā)生了Hash key相同導(dǎo)致沖突的情況,那么就在這個(gè)Hash key的地方產(chǎn)生一個(gè)鏈表,將所有產(chǎn)生相同hashcode的對(duì)象放到這個(gè)單鏈表上去,串在一起。
比較兩個(gè)對(duì)象的時(shí)候,首先根據(jù)他們的hashcode去hash表中找他的對(duì)象,當(dāng)兩個(gè)對(duì)象的hashcode相同,那么就是說他們這兩個(gè)對(duì)象放在Hash表中的同一個(gè)key上,那么他們一定在這個(gè)key上的鏈表上师坎。那么此時(shí)就只能根據(jù)Object的equal方法來比較這個(gè)對(duì)象是否equal恕酸。當(dāng)兩個(gè)對(duì)象的hashcode不同的話,肯定他們不能equal.