J2SE基礎(chǔ)~1
開(kāi)心一刻:一輛面包車(chē)載了14個(gè)人丑勤。后面一乘客對(duì)司機(jī)說(shuō):你這是超載敷待,被逮著要扣不少分呢!司機(jī)回頭淡定一笑:扣分和悦,那得有駕照退疫!頓時(shí),無(wú)數(shù)倒吸涼氣的聲音彌漫在車(chē)廂里...乘客問(wèn):沒(méi)有駕照你也敢開(kāi)案胨亍褒繁?司機(jī)說(shuō):沒(méi)事,酒壯人膽付鹿,中午喝了一斤二鍋頭澜汤,老子怕啥蚜迅!大伙緊張的直冒冷汗舵匾。然后又有一乘客說(shuō):為啥不考駕照呢?司機(jī):兩千多度的近視眼谁不,右腿還是假肢坐梯,怎么考!乘客問(wèn)道:你不怕無(wú)證駕駛會(huì)判刑嗎刹帕?司機(jī):老子有精神病怕什么吵血?全車(chē)人鴉雀無(wú)聲!一位乘客膽顫心驚地說(shuō):我要下車(chē)偷溺!司機(jī):下什么車(chē)蹋辅!剎車(chē)早壞了!抓穩(wěn)挫掏,下坡了侦另!
下面正式進(jìn)入干貨區(qū),喜歡的話(huà)尉共、雙擊褒傅、評(píng)論、轉(zhuǎn)發(fā)袄友,動(dòng)一動(dòng)你的小手讓更多的人知道殿托!
1. 九種基本數(shù)據(jù)類(lèi)型的大小,以及他們的封裝類(lèi)剧蚣。
2. Switch能否用string做參數(shù)支竹?
3. equals與==的區(qū)別旋廷。
4. Object有哪些公用方法?
5. Java的四種引用唾戚,強(qiáng)弱軟虛柳洋,用到的場(chǎng)景。
6. Hashcode的作用叹坦。
7. ArrayList熊镣、LinkedList、Vector的區(qū)別募书。
8. String绪囱、StringBuffer與StringBuilder的區(qū)別。
9. Map莹捡、Set鬼吵、List、Queue篮赢、Stack的特點(diǎn)與用法齿椅。
10. HashMap和HashTable的區(qū)別。
11. HashMap和ConcurrentHashMap的區(qū)別启泣,HashMap的底層源碼涣脚。
12. TreeMap、HashMap寥茫、LindedHashMap的區(qū)別遣蚀。
13. Collection包結(jié)構(gòu),與Collections的區(qū)別纱耻。
14. try catch finally芭梯,try里有return,finally還執(zhí)行么弄喘?
15. Excption與Error包結(jié)構(gòu)玖喘。OOM你遇到過(guò)哪些情況,SOF你遇到過(guò)哪些情況蘑志。
16. Java面向?qū)ο蟮娜齻€(gè)特征與含義累奈。
17. Override和Overload的含義及區(qū)別。
18. Interface與abstract類(lèi)的區(qū)別卖漫。
19. Static class 與non static class的區(qū)別费尽。
20. java多態(tài)的實(shí)現(xiàn)原理。
21. 實(shí)現(xiàn)多線(xiàn)程的兩種方法:Thread與Runable羊始。
22. 線(xiàn)程同步的方法:sychronized旱幼、lock、reentrantLock等突委。
23. 鎖的等級(jí):方法鎖柏卤、對(duì)象鎖冬三、類(lèi)鎖。
24. 寫(xiě)出生產(chǎn)者消費(fèi)者模式缘缚。
25. ThreadLocal的設(shè)計(jì)理念與作用勾笆。
26. ThreadPool用法與優(yōu)勢(shì)。
27. Concurrent包里的其他東西:ArrayBlockingQueue桥滨、CountDownLatch等等窝爪。
28. wait()和sleep()的區(qū)別。
29. foreach與正常for循環(huán)效率對(duì)比齐媒。
30. Java IO與NIO蒲每。
31. 反射的作用與原理。
32. 泛型常用特點(diǎn)喻括,List能否轉(zhuǎn)為L(zhǎng)ist邀杏。
33. 解析XML的幾種方式的原理與特點(diǎn):DOM、SAX唬血、PULL望蜡。
34. Java與C++對(duì)比。
35. Java1.7與1.8新特性拷恨。
36. 設(shè)計(jì)模式:?jiǎn)卫甭伞⒐S、適配器挑随、責(zé)任鏈状您、觀察者等等勒叠。
37. JNI的使用兜挨。
基礎(chǔ)解釋及說(shuō)明:
1.? 九種基本數(shù)據(jù)類(lèi)型的大小,以及他們的封裝類(lèi)眯分。
注:基本數(shù)據(jù)類(lèi)型占用的空間是不變的拌汇,這種不變性也是java具有可移植性的原因之一。它是放在棧中直接存儲(chǔ)值弊决,聲明時(shí)系統(tǒng)會(huì)自動(dòng)給它分配存儲(chǔ)空間噪舀,所有的數(shù)值類(lèi)型都有正負(fù)號(hào),而引用類(lèi)型聲明時(shí)只是分配了引用空間飘诗,必須通過(guò)實(shí)例化開(kāi)辟數(shù)據(jù)空間之后才可以賦值与倡。例:數(shù)組對(duì)象是一個(gè)引用對(duì)象,我們將一個(gè)數(shù)組賦值給另一個(gè)數(shù)組只是復(fù)制了一個(gè)引用昆稿,所以通過(guò)某一個(gè)數(shù)組所做的修改在另一個(gè)數(shù)組中也看的見(jiàn)纺座。
引用變量測(cè)試:
String array1[] = {"1","2","3"};
String array2[] = array1;
// array2[1] = "3"; 測(cè)試放開(kāi)我就行
System.out.println(array1[1]);
2. Switch能否用string做參數(shù)?
java7之前溉潭,switch只能支持byte净响、short少欺、char、int或者其對(duì)應(yīng)的封裝類(lèi)以及 Enum類(lèi)型馋贤。在Java7中赞别,String支持被加上了。如在jdk7之前的版本使用, 會(huì)提示如下錯(cuò)誤:
Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted 意為jdk版本太低配乓,不支持仿滔。
java8測(cè)試:
String string = "02";
switch (string) {
case "01":
System.out.println("01");
break;
case "02":
System.out.println("02");
break;
}
3. equals與==的區(qū)別。
/**
* ==:
*? ? 1. 基本類(lèi)型:比較變量對(duì)應(yīng)的值是否相等
*? ? 2. 對(duì)象/引用類(lèi)型:比較變量?jī)?nèi)存地址是否相等!?
* 例:String s = new String("string");
* s變量存儲(chǔ)在棧中犹芹,其對(duì)應(yīng)的值就存儲(chǔ)在堆中
*
* equals:
*? ? 1. 基本類(lèi)型:無(wú)此方法
*? ? 2. 對(duì)象/引用類(lèi)型:比較兩個(gè)對(duì)象的內(nèi)存地址否相等堤撵,請(qǐng)繼續(xù)往下看!
*
* 作者理解~如有問(wèn)題,歡迎拍磚~~
* 默認(rèn)的equals方法比較棧中的內(nèi)存地址是否相等羽莺,也可以狹義的認(rèn)為比較內(nèi)容是否相等(String除外)ps: 內(nèi)存地址存儲(chǔ)在棧中实昨、對(duì)象本身存儲(chǔ)在堆中 。內(nèi)存地址相同對(duì)象內(nèi)容一定相同盐固,但內(nèi)容相同內(nèi)存地址并不一定相同!?
下面是Object類(lèi)中“equals”方法中的源碼荒给,英語(yǔ)好的建議閱讀下文檔。
*/
public boolean equals(Object obj) {
return (this == obj);
}
此代碼中的“==”可以參考上面的“==”理解說(shuō)明刁卜,如有問(wèn)題志电,歡迎私我...
“==”特殊情況看代碼
String s = new String("");
String s1 = new String("");
System.out.println(s==s1);
String s3 = "";
String s4 = "";
System.out.println(s3==s4);
運(yùn)行結(jié)果你會(huì)發(fā)現(xiàn):
true=s3==s4;
false=s==s1;
此時(shí)你要知道String默認(rèn)是有一個(gè)常量池的,它是一個(gè)比較特殊的對(duì)象管理區(qū)域;所以從常量池中直接取出來(lái)的字符串引用內(nèi)存地址是相同的蛔趴,所以true=s3==s4;而s和s1都是使用new關(guān)鍵字新建的對(duì)象挑辆,他們占用著不同的內(nèi)存,是兩個(gè)引用內(nèi)存地址不一樣的對(duì)象所以false=s==s1;
4. Object有哪些公用方法孝情?
1. toString方法
該方法用得比較多鱼蝉,一般子類(lèi)都有覆蓋,懂java的應(yīng)該不用多說(shuō)
2. equals方法
該方法是非常重要的一個(gè)方法箫荡。一般equals和==是不一樣的魁亦,但是在Object中兩者是一樣的。子類(lèi)一般都要重寫(xiě)這個(gè)方法羔挡,上面已經(jīng)提及到兩者的區(qū)別這里不再闡述
3. hashCode方法
該方法用于哈希查找洁奈,可以減少在查找中使用equals的次數(shù),重寫(xiě)了equals方法一般都要重寫(xiě)hashCode方法绞灼。這個(gè)方法在一些具有哈希功能的Collection中用到利术。
例如:HashSet、HashMap以及HashTable
4. wait方法
wait方法就是使當(dāng)前線(xiàn)程等待該對(duì)象的鎖低矮,當(dāng)前線(xiàn)程必須是該對(duì)象的擁有者印叁,也就是具有該對(duì)象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷喉钢。wait(long timeout)設(shè)定一個(gè)超時(shí)間隔姆打,如果在規(guī)定時(shí)間內(nèi)沒(méi)有獲得鎖就返回。
調(diào)用該方法后當(dāng)前線(xiàn)程進(jìn)入睡眠狀態(tài)肠虽,直到以下事件發(fā)生幔戏。
(1)其他線(xiàn)程調(diào)用了該對(duì)象的notify方法。
(2)其他線(xiàn)程調(diào)用了該對(duì)象的notifyAll方法税课。
(3)其他線(xiàn)程調(diào)用了interrupt中斷該線(xiàn)程闲延。
(4)時(shí)間間隔到了。
此時(shí)該線(xiàn)程就可以被調(diào)度了韩玩,如果是被中斷的話(huà)就拋出一個(gè)InterruptedException異常垒玲。
5. notify方法
該方法喚醒在該對(duì)象上等待的某個(gè)線(xiàn)程。
6. notifyAll方法
該方法喚醒在該對(duì)象上等待的所有線(xiàn)程
5. Java的四種引用找颓,強(qiáng)弱軟虛合愈,用到的場(chǎng)景。
⑴強(qiáng)引用(StrongReference)
強(qiáng)引用是使用最普遍的引用击狮。如果一個(gè)對(duì)象具有強(qiáng)引用佛析,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足彪蓬,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤寸莫,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題档冬。?
ps:強(qiáng)引用:String s = new String()膘茎; s代表的對(duì)象其實(shí)就是強(qiáng)引用;
⑵軟引用(SoftReference)
如果一個(gè)對(duì)象具有軟引用且內(nèi)存空間足夠酷誓,垃圾回收器就不會(huì)回收它披坏;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存呛牲。只要垃圾回收器沒(méi)有回收它刮萌,該對(duì)象就可以被程序使用驮配。軟引用可用來(lái)實(shí)現(xiàn)內(nèi)存敏感的高速緩存娘扩。
軟引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對(duì)象被垃圾回收器回收壮锻,Java虛擬機(jī)就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中琐旁。
⑶弱引用(WeakReference)
弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。在垃圾回收器線(xiàn)程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中猜绣,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象灰殴,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存掰邢。不過(guò)牺陶,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線(xiàn)程伟阔,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。
弱引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用掰伸,如果弱引用所引用的對(duì)象被垃圾回收皱炉,Java虛擬機(jī)就會(huì)把這個(gè)弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
⑷虛引用(PhantomReference)
“虛引用”顧名思義狮鸭,就是形同虛設(shè)合搅,與其他幾種引用都不同,虛引用并不會(huì)決定對(duì)象的生命周期歧蕉。如果一個(gè)對(duì)象僅持有虛引用灾部,那么它就和沒(méi)有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收惯退。
具體的用法和場(chǎng)景可以參考這篇文章:http://blog.csdn.net/aitangyong/article/details/39453365
6. Hashcode的作用赌髓。
hashcode方法返回該對(duì)象的哈希碼值。支持該方法是為哈希表提供一些優(yōu)點(diǎn)催跪,例如春弥,java.util.Hashtable 提供的哈希表。
hashCode 的常規(guī)協(xié)定是:
1.在 Java 應(yīng)用程序執(zhí)行期間叠荠,在同一對(duì)象上多次調(diào)用 hashCode 方法時(shí)匿沛,必須一致地返回相同的整數(shù),前提是對(duì)象上 equals 比較中所用的信息沒(méi)有被修改榛鼎。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行逃呼,該整數(shù)無(wú)需保持一致。
2.如果根據(jù) equals(Object) 方法者娱,兩個(gè)對(duì)象是相等的抡笼,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。
3.以下情況不是必需的:如果根據(jù) equals(java.lang.Object) 方法黄鳍,兩個(gè)對(duì)象不相等推姻,那么在兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法必定會(huì)生成不同的整數(shù)結(jié)果。但是框沟,程序員應(yīng)該知道藏古,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。
4.實(shí)際上忍燥,由 Object 類(lèi)定義的 hashCode 方法確實(shí)會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù)拧晕。(這一般是通過(guò)將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來(lái)實(shí)現(xiàn)的,但是 JavaTM 編程語(yǔ)言不需要這種實(shí)現(xiàn)技巧梅垄。)
5.當(dāng)equals方法被重寫(xiě)時(shí)厂捞,通常有必要重寫(xiě) hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼靡馁。
7. ArrayList欲鹏、LinkedList、Vector的區(qū)別臭墨。
ArrayList 和Vector是采用數(shù)組方式存儲(chǔ)數(shù)據(jù)貌虾,此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,都允許直接序號(hào)索引元素裙犹,但是插入數(shù)據(jù)要設(shè)計(jì)到數(shù)組元素移動(dòng)等內(nèi)存操作尽狠,所以索引數(shù)據(jù)快插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線(xiàn)程安全)所以性能上比ArrayList要差叶圃,LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ)袄膏,按序號(hào)索引數(shù)據(jù)需要進(jìn)行向前或向后遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可掺冠,所以插入數(shù)度較快
8. String沉馆、StringBuffer與StringBuilder的區(qū)別。
特性:都是final類(lèi),沒(méi)有子類(lèi)即不能被繼承德崭。
String
字符串常量斥黑,為不可變對(duì)象,一旦被創(chuàng)建就不能修改它的值。對(duì)于已經(jīng)存在的String對(duì)象的修改都是重新創(chuàng)建一個(gè)新的對(duì)象,然后把新的值保存進(jìn)去(比較占內(nèi)存)眉厨。
StringBuffer/StringBuilder
對(duì)象構(gòu)建:只能通過(guò)構(gòu)造函數(shù)進(jìn)行構(gòu)建锌奴。
例:StringBuilder stringBuilder = new StringBuilder();
? ? ? ? StringBuffer stringBuffer = new StringBuffer();
都是一個(gè)可變對(duì)象,當(dāng)對(duì)它們進(jìn)行修改的時(shí)候不會(huì)像String那樣重新建立對(duì)象,性能區(qū)別在于String是不可變的,因此在每次對(duì)String類(lèi)型進(jìn)行改變的時(shí)候其實(shí)都等同于生成了一個(gè)新的String對(duì)象憾股,然后將指針指向新的String對(duì)象鹿蜀,所以經(jīng)常改變內(nèi)容的字符串最好不要用String,因?yàn)槊看紊蓪?duì)象都會(huì)對(duì)系統(tǒng)性能產(chǎn)生影響服球,特別當(dāng)內(nèi)存中無(wú)引用對(duì)象多了以后茴恰,JVM的GC就會(huì)開(kāi)始工作,那速度是一定會(huì)相當(dāng)慢的斩熊。而如果是使用StringBuffer/StringBuilder每次結(jié)果都會(huì)對(duì)其對(duì)象本身進(jìn)行操作往枣,而不是生成新的對(duì)象。所以在字符串對(duì)象經(jīng)常改變的情況下推薦使用StringBuffer/StringBuilder粉渠。
StringBuffer和StringBuilder的區(qū)別主要在于StringBuilder線(xiàn)程不安全StringBuffer線(xiàn)程安全分冈,排除線(xiàn)程問(wèn)題項(xiàng)目中應(yīng)用建議使用StringBuilder,因?yàn)槠湫阅軙?huì)更高(因?yàn)闆](méi)有使用同步鎖)渣叛。
9. Map丈秩、Set、List淳衙、Queue、Stack的特點(diǎn)與用法。
/**
* Map
*
* 1> Map是鍵值對(duì)箫攀,鍵Key是唯一不能重復(fù)的肠牲,一個(gè)鍵對(duì)應(yīng)一個(gè)值,值可以重復(fù)靴跛。
* 實(shí)現(xiàn)類(lèi):TreeMap有序缀雳,鍵不可以為null值允許,內(nèi)部實(shí)現(xiàn)使用紅黑樹(shù)實(shí)現(xiàn)的梢睛;HashMap無(wú)序肥印,鍵、值 都可以為null绝葡,內(nèi)部實(shí)現(xiàn)使用數(shù)組和鏈表構(gòu)成深碱。
*/
/**
* Set
*
* 1> 不包含重復(fù)元素的集合,Set中最多包含一個(gè)null元素藏畅,支持Iterator/for-earch遍歷
* 實(shí)現(xiàn)類(lèi):TreeSet有序敷硅,數(shù)據(jù)不允許重復(fù),不允許null值; HashSet無(wú)序愉阎,數(shù)據(jù)不允許重復(fù)绞蹦,允許null值
*/
/**
* List
*
*1> 有序的可重復(fù)集合。 可以在任意位置增加刪除元素榜旦。用Iterator實(shí)現(xiàn)單向遍歷幽七,
* 也可用ListIterator實(shí)現(xiàn)雙向遍歷;
* 實(shí)現(xiàn)類(lèi):ArrayList基于數(shù)組實(shí)現(xiàn)溅呢,內(nèi)部值無(wú)序锉走、允許null值,訪(fǎng)問(wèn)數(shù)據(jù)性能比較高藕届;LinkedList
* 的儲(chǔ)結(jié)構(gòu)是鏈?zhǔn)降呐膊洌沁B續(xù)存儲(chǔ),插入刪除的效率比較高休偶;
*/
/**
* Queue
*
* 1> Queue遵從先進(jìn)先出原則梁厉。使用時(shí)盡量避免add()和remove()方法,而是使用offer()來(lái)
* 添加元素,使用poll()來(lái)移除元素踏兜,它的優(yōu)點(diǎn)是可以通過(guò)返回值來(lái)判斷是否成功词顾。
* LinkedList實(shí)現(xiàn)了Queue接口。Queue通常不允許插入null元素碱妆。
*/
/**
* Stack
*
* 1> Stack遵從后進(jìn)先出原則肉盹。Stack繼承自Vector。它通過(guò)五個(gè)操作對(duì)類(lèi)Vector進(jìn)行擴(kuò)
* 展疹尾,允許將向量視為堆棧上忍,它提供了通常的push和pop操作骤肛,以及取堆棧頂點(diǎn)的peek()
* 方法、測(cè)試堆棧是否為空的empty方法等
*/
實(shí)現(xiàn)類(lèi)總結(jié):如果涉及堆棧窍蓝,隊(duì)列等操作腋颠,建議使用List(例:ArrayList、LinkedList)吓笙。對(duì)于快速插入和刪除元素的淑玫,建議使用LinkedList,如果需要快速隨機(jī)訪(fǎng)問(wèn)元素的面睛,建議使用
ArrayList絮蒿。
10. HashMap和HashTable的區(qū)別。
1> Hashtable默認(rèn)方法是同步的叁鉴,HashMap默認(rèn)方法是非同步的土涝。在多線(xiàn)程并發(fā)的環(huán)境下
,可以直接使用Hashtable亲茅,而HashMap則需要自己增加同步處理回铛。
2> Hashtable鍵值不允許為null,否則拋出空指針異常克锣,HashMap鍵值允許為null茵肃。
3> HashTable中的hash數(shù)組初始大小是11,增加的方式是 old*2+1袭祟。HashMap中hash
數(shù)組的默認(rèn)大小是16验残,而且一定是2的指數(shù)。
由于篇幅問(wèn)題此文章暫時(shí)更新到這里巾乳,后期我會(huì)持續(xù)更新您没!喜歡的話(huà)、雙擊胆绊、評(píng)論氨鹏、轉(zhuǎn)發(fā),加關(guān)注压状!動(dòng)一動(dòng)你的小手讓更多的人知道仆抵!喜歡就關(guān)注 帥比-Yang