標(biāo)簽:【每日一題】
到目前為止皂甘,整理了Android四大組件、Android基本常識(shí)悼凑、還有這個(gè)Java基礎(chǔ)面試題偿枕,準(zhǔn)備先到這里,
起初目的是為了每天過(guò)一眼面試題户辫,有個(gè)印象渐夸,也不至于不用的東西全忘了,后面找工作需要時(shí)也方便渔欢,
但其實(shí)墓塌,面對(duì)面試題,更重要的還是對(duì)問(wèn)題本身的理解與掌握奥额,死記硬背是下下策
所以苫幢,以后會(huì)更有針對(duì)性的學(xué)習(xí)記錄知識(shí)點(diǎn)
71. String,Stringbuffer,Stringbuilder的區(qū)別【2018.4.18】
String 的長(zhǎng)度是不可變的;
StringBuffer的長(zhǎng)度是可變的垫挨,如果對(duì)字符串中的內(nèi)容經(jīng)常操作韩肝,特別是內(nèi)容要修改時(shí),則用StringBuffer九榔,如果最后需要String哀峻,那么使用StringBuffer的toString()方法轉(zhuǎn)換成String類型的數(shù)據(jù)涡相;StringBuffer是線程安全的;
StringBuilder是從JDK5開(kāi)始剩蟀,為StringBuffer類補(bǔ)充了一個(gè)單線程使用的等價(jià)類催蝗;通常應(yīng)該優(yōu)先使用StringBuilder類,因?yàn)樗С炙邢嗤牟僮饔兀捎谒粓?zhí)行同步生逸,所以速度更快。
70. 數(shù)組有沒(méi)有l(wèi)ength()方法且预?String有沒(méi)有l(wèi)ength()方法槽袄?【2018.4.17】
數(shù)組只有l(wèi)ength屬性;String有l(wèi)ength()方法
69. == 和 equals() 方法在字符串變量比較中的不同
== 比較的是引用锋谐,相當(dāng)于比較兩個(gè)字符串是不是同一個(gè)對(duì)象
equals()比較的是字符串的內(nèi)容
68. Java中的流【2018.4.16】
1遍尺、流分類
字節(jié)流:InputStream,OutputStream
字符流:Reader涮拗,Writer
Reader:讀取字符流的抽象類
BufferedReader:將字符存入緩沖區(qū)乾戏,再讀取
LineNumberReader:帶行號(hào)的字符緩沖輸入流
InputStreamReader:轉(zhuǎn)換流,字節(jié)流和字符流的橋梁三热,多在編碼的地方使用
FileReader:讀取字符文件的便捷類鼓择。
Writer:寫(xiě)入字符流的抽象類
BufferedWriter:將字符存入緩沖區(qū),再寫(xiě)入
OutputStreamWriter:轉(zhuǎn)換流就漾,字節(jié)流和字符流的橋梁呐能,多在編碼的地方使用
FileWriter:寫(xiě)入字符文件的便捷類。
InputStream:字節(jié)輸入流的所有類的超類
ByteArrayInputStream:含緩沖數(shù)組抑堡,讀取內(nèi)存中字節(jié)數(shù)組的數(shù)據(jù)摆出,未涉及流
FileInputStream:從文件中獲取輸入字節(jié)。媒體文件
BufferedInputStream:帶有緩沖區(qū)的字節(jié)輸入流
DataInputStream:數(shù)據(jù)輸入流首妖,讀取基本數(shù)據(jù)類型的數(shù)據(jù)
ObjectInputStream:用于讀取對(duì)象的輸入流
PipedInputStream:管道流偎漫,線程間通信,與PipedOutputStream配合使用
SequenceInputStream:合并流有缆,將多個(gè)輸入流邏輯串聯(lián)象踊。
OutputStream:此抽象類是表示輸出字節(jié)流的所有類的超類
ByteArrayOutputStream:含緩沖數(shù)組,將數(shù)據(jù)寫(xiě)入內(nèi)存中的字節(jié)數(shù)組棚壁,未涉及流
FileOutStream:文件輸出流杯矩,將數(shù)據(jù)寫(xiě)入文件
BufferedOutputStream:帶有緩沖區(qū)的字節(jié)輸出流
PrintStream:打印流,作為輸出打印
DataOutputStream:數(shù)據(jù)輸出流灌曙,寫(xiě)入基本數(shù)據(jù)類型的數(shù)據(jù)
ObjectOutputStream:用于寫(xiě)入對(duì)象的輸出流
PipedOutputStream:管道流菊碟,線程間通信节芥,與PipedInputStream配合使用
2在刺、流操作規(guī)律:
明確源和目的:
數(shù)據(jù)源:讀取逆害,InputStream和Reader
目的:寫(xiě)入:OutStream和Writer
數(shù)據(jù)是否是純文本:
是:字符流,Reader蚣驼,Writer
否:字節(jié)流魄幕,InputStream,OutStream
明確數(shù)據(jù)設(shè)備:
源設(shè)備:內(nèi)存颖杏、硬盤(pán)纯陨、鍵盤(pán)
目的設(shè)備:內(nèi)存、硬盤(pán)留储、控制臺(tái)
是否提高效率:用BufferedXXX
3翼抠、轉(zhuǎn)換流:將字節(jié)轉(zhuǎn)換為字符,可通過(guò)相應(yīng)的編碼表獲得
轉(zhuǎn)換流都涉及到字節(jié)流和編碼表
67. Java中的序列化获讳?【2018.4.13】
序列化就是一種用來(lái)處理對(duì)象流的機(jī)制阴颖,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化∝はィ可以對(duì)流化后的對(duì)象進(jìn)行讀寫(xiě)操作量愧,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫(xiě)操作時(shí)所引發(fā)的問(wèn)題帅矗;序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口偎肃,該接口沒(méi)有需要實(shí)現(xiàn)的方法,實(shí)現(xiàn)Serializable只是為了標(biāo)注該對(duì)象是可以被序列化的浑此,然后使用一個(gè)輸出流(如FileOutputStream)來(lái)構(gòu)造一個(gè)ObjectOutStream(對(duì)象流)對(duì)象累颂,接著,使用ObjectOutputStream對(duì)象的writeObject(Object obj)方法就可以將參數(shù)為obj的對(duì)象寫(xiě)出(即保存其狀態(tài))凛俱,要恢復(fù)的話則用輸入流喘落。
66.線程池是什么?【2018.4.12】
當(dāng)一個(gè)程序中創(chuàng)建大量線程最冰,并在任務(wù)結(jié)束后銷毀瘦棋,會(huì)給系統(tǒng)帶來(lái)過(guò)度消耗資源,以及過(guò)度切換線程的危險(xiǎn)暖哨,從而可能導(dǎo)致系統(tǒng)崩潰赌朋。為此我們應(yīng)使用線程池來(lái)解決這個(gè)問(wèn)題。
首先創(chuàng)建一些線程篇裁,他們的集合稱為線程池沛慢,當(dāng)服務(wù)器接受到一個(gè)客戶請(qǐng)求后,就從線程池中取出一個(gè)空閑的線程為之服務(wù)达布,服務(wù)結(jié)束后不關(guān)閉該線程团甲,而是將該線程還回到線程池中。在線程池的編程模式下黍聂,任務(wù)是提交給整個(gè)線程池躺苦,而不是直接交給某個(gè)線程身腻,線程池在拿到任務(wù)后,它就在內(nèi)部查找空閑的線程匹厘,把任務(wù)交給它嘀趟。一個(gè)線程只能執(zhí)行一個(gè)任務(wù),但是可以同時(shí)向一個(gè)線程池提交多個(gè)任務(wù)愈诚。
65. 簡(jiǎn)述synchronized 和 java.util.concurrent.locks.Lock的異同【2018.4.11】
相同點(diǎn):Lock和synchronized都可以實(shí)現(xiàn)線程同步
不同點(diǎn):Lock有比synchronized更精確的線程語(yǔ)義和更好的性能她按。synchronized會(huì)自動(dòng)釋放鎖,而Lock一定要求程序員手動(dòng)釋放炕柔,并且必須在finally從句中釋放
64. 同步和異步有何異同酌泰,分別在什么情況下使用?
如果數(shù)據(jù)將在線程間共享匕累,使用同步編程宫莱。例如正在寫(xiě)的數(shù)據(jù)可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能正在被另一個(gè)線程寫(xiě)入哩罪,那么這些數(shù)據(jù)就是共享數(shù)據(jù)授霸,必須進(jìn)行同步存取。
當(dāng)應(yīng)用程序調(diào)用了一個(gè)需要花費(fèi)很長(zhǎng)時(shí)間來(lái)執(zhí)行的方法际插,并且不希望讓程序等待方法返回時(shí)碘耳,則使用異步編程,在很多情況下采用異步途徑往往更有效率框弛。
63. 線程同步的方法辛辨? 【2018.4.10】
實(shí)現(xiàn)同步的方法為使用synchronized關(guān)鍵字,實(shí)現(xiàn)方式:
- 同步方法瑟枫《犯悖可以是靜態(tài)和非靜態(tài)方法,不可以是抽象和接口方法慷妙。當(dāng)一個(gè)線程調(diào)用這個(gè)對(duì)象的同步方法僻焚,則這個(gè)對(duì)象的其他所有同步方法將被鎖定,不能調(diào)用膝擂,但可以調(diào)用非同步方法虑啤。非靜態(tài)同步方法鎖定的是方法所屬的主題對(duì)象自身。靜態(tài)同步方法鎖定的是主體類對(duì)應(yīng)的Class類型的對(duì)象架馋,所以靜態(tài)同步方法只跟所屬類的其他靜態(tài)方法相互制約狞山。
- 同步塊。鎖定一個(gè)指定的對(duì)象叉寂,來(lái)對(duì)同步塊中的代碼進(jìn)行同步
62. 當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后萍启,其它線程是否可進(jìn)入此對(duì)象的其它方法?
其它線程只能訪問(wèn)該對(duì)象的其它非同步方法屏鳍,同步方法不能進(jìn)入
61. sleep和yield的區(qū)別勘纯?
yield方法只是讓出分配給自己的CPU時(shí)間片局服,并且會(huì)立刻進(jìn)入Runnable狀態(tài)參與CPU時(shí)間的競(jìng)爭(zhēng),若程序中沒(méi)有其它線程屡律,那么該線程馬上就會(huì)開(kāi)始往下執(zhí)行腌逢;sleep會(huì)進(jìn)入Blocked狀態(tài)降淮,等待時(shí)間結(jié)束事件的發(fā)生超埋,然后進(jìn)入Runnable狀態(tài)參與CPU時(shí)間的競(jìng)爭(zhēng)
60. sleep()和wait()的區(qū)別?【2018.4.9】
sleep() 方法是線程類(Thread)的靜態(tài)方法佳鳖,讓調(diào)用線程進(jìn)入睡眠狀態(tài)霍殴,讓出執(zhí)行機(jī)會(huì)給其他線程,等到休眠時(shí)間結(jié)束后系吩,線程進(jìn)入就緒狀態(tài)和其他線程一起競(jìng)爭(zhēng)cpu的執(zhí)行時(shí)間来庭。
因?yàn)閟leep() 是static靜態(tài)的方法,他不能改變對(duì)象的機(jī)鎖穿挨,當(dāng)一個(gè)synchronized塊中調(diào)用了sleep()方法月弛,線程雖然進(jìn)入休眠,但是對(duì)象的機(jī)鎖沒(méi)有被釋放科盛,其他線程依然無(wú)法訪問(wèn)這個(gè)對(duì)象帽衙。
wait是object類的方法,對(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)
59. 啟動(dòng)一個(gè)線程使用run()還是start()?【2018.4.4】
啟動(dòng)一個(gè)線程是調(diào)用start()方法榨崩,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài)谴垫,這意味著它可以由JVM調(diào)度并執(zhí)行。但這并不意味著線程就會(huì)立即運(yùn)行母蛛。
58. 為什么要使用多線程編程翩剪?
多線程就像是人體一樣,一直在并行的做許多工作彩郊,例如肢专,人可以同時(shí)呼吸,血液循環(huán)焦辅,消化食物等博杖。多線程可以將一個(gè)程序劃分成多個(gè)任務(wù),他們彼此獨(dú)立的工作筷登,以方便有效的使用處理器和用戶的時(shí)間
57. 請(qǐng)說(shuō)明什么是線程安全剃根?【2018.4.3】
如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼前方;如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的狈醉,而且其他的變量的值也和預(yù)期的是一樣的廉油,就是線程安全的。
或者說(shuō):一個(gè)類或者程序所提供的接口對(duì)于線程來(lái)說(shuō)是原子操作或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性苗傅,也就是說(shuō)我們不用考慮同步的問(wèn)題抒线。
線程安全問(wèn)題都是有全局變量及靜態(tài)變量引起的。若每個(gè)線程中對(duì)全局變量渣慕、靜態(tài)變量只有讀取操作嘶炭,而無(wú)寫(xiě)操作,一般來(lái)說(shuō)這個(gè)全局變量是線程安全的逊桦;若有多個(gè)線程同時(shí)執(zhí)行寫(xiě)操作眨猎,一般都需要考慮線程同步,否則的話就可能影響線程安全强经。
56. Set集合不能存放相同的元素睡陪,使用什么方法區(qū)分重復(fù)與否?
Set里的元素事不能重復(fù)的匿情,使用equals方法和hashCode方法來(lái)區(qū)分重復(fù)與否兰迫。覆蓋equals方法、hashCode方法用來(lái)判斷兩個(gè)對(duì)象是否為同一對(duì)象
55. ArrayList炬称,Vector汁果,LinkedList的存儲(chǔ)性能和特性?【2018.4.2】
ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù)转砖,此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素须鼎,它們都允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)據(jù)元素移動(dòng)等內(nèi)存操作府蔗,所以索引數(shù)據(jù)快晋控,插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全)姓赤,通常性能上比ArrayList差赡译,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快
54. List底層是怎么實(shí)現(xiàn)的喜喂?雙向鏈表和數(shù)組的區(qū)別?
在Java中List是一個(gè)接口只洒,繼承于Collection接口,并定義了添加劳坑、刪除毕谴、取出元素等對(duì)集合操作的抽象方法。
雙向鏈表和數(shù)組區(qū)別為:
- 數(shù)組必須事先定義固定的長(zhǎng)度(元素的個(gè)數(shù)),不能適應(yīng)數(shù)據(jù)動(dòng)態(tài)的增減的情況涝开。當(dāng)數(shù)據(jù)增加時(shí)循帐,可能超出原先定義的元素個(gè)數(shù);當(dāng)數(shù)據(jù)減少時(shí)舀武,造成內(nèi)存浪費(fèi)拄养;數(shù)組可以根據(jù)下標(biāo)直接存取。
- 鏈表動(dòng)態(tài)的進(jìn)行存儲(chǔ)分配银舱,可以適應(yīng)數(shù)據(jù)動(dòng)態(tài)的增減情況瘪匿,且可以方便的插入、刪除數(shù)據(jù)項(xiàng)纵朋,而數(shù)組中插入柿顶、刪除數(shù)據(jù)項(xiàng)時(shí)茄袖,需要移動(dòng)其它數(shù)據(jù)項(xiàng)操软,非常繁瑣。
53. List宪祥,Set聂薪,Map是否繼承自Collection接口?【2018.3.30】
List蝗羊,Set繼承自Collection接口藏澳,而Map沒(méi)有繼承自Collection接口
52. Vector和ArrayList有什么差異?
- 同步性:Vector是線程安全的(同步)耀找,而ArrayList是線程不安全的
- 擴(kuò)容:當(dāng)需要擴(kuò)容時(shí)翔悠,Vector默認(rèn)增長(zhǎng)一倍,而ArrayList卻是一半
51. HashMap和HashSet有什么關(guān)系野芒?【2018.3.29】
HashSet底層采用HashMap實(shí)現(xiàn)的蓄愁,請(qǐng)看如下代碼:
private transient HashMap<E,Object> map;
上述代碼是HashSet類里面定義的一個(gè)私有的 成員變量。放進(jìn)HashSet中對(duì)象狞悲,其實(shí)使用這個(gè)HashMap的key來(lái)存儲(chǔ)的撮抓。當(dāng)調(diào)用HashSet的add方法時(shí),實(shí)際上是向HashMap中增加了一行(key-value對(duì))摇锋,該行的key就是向HashSet增加的那個(gè)對(duì)象丹拯,該行的value就是一個(gè)Object類型的常量
50. 簡(jiǎn)述HashTable原理,并說(shuō)明它和HashMap區(qū)別【2018.3.28】
HashTable原理:
HashTable是基于哈希表的實(shí)現(xiàn)荸恕。通過(guò)使用put(Object key,Object value)方法把兩個(gè)對(duì)象進(jìn)行關(guān)聯(lián)乖酬,需要時(shí)用get(Object key)取得與key關(guān)聯(lián)的值對(duì)象。還可以查詢某個(gè)對(duì)象的索引值等融求。這里的get方法查找一個(gè)對(duì)象時(shí)與Vector中的get方法再內(nèi)部實(shí)現(xiàn)時(shí)有很大不同咬像,在一個(gè)Hashtable中查找一個(gè)鍵對(duì)象要比在一個(gè)Vector中快的多。這是因?yàn)镠ashtable使用了一種哈希表的技術(shù),在java每個(gè)對(duì)象缺省都有一個(gè)通過(guò)Object的hashCode()方法獲得的哈希碼施掏,Hashtable就是利用這個(gè)哈希實(shí)現(xiàn)快速查找鍵對(duì)象的钮惠。
二者都實(shí)現(xiàn)了Map接口,是將唯一鍵映射到特定的值上七芭,主要區(qū)別是:
- HashMap沒(méi)有排序素挽,允許一個(gè)null鍵和多個(gè)null值,而Hashtable不允許
- HashMap把Hashtable的contains方法去掉了狸驳,改成containsvalue和containsKey,因?yàn)閏ontains方法容易引起誤解
- Hashtable繼承自Dictionary類预明,HashMap是java1.2引進(jìn)的Map接口的實(shí)現(xiàn)
- Hashtable的方法是Synchronize的,而HashMap不是耙箍,在多個(gè)線程訪問(wèn)Hashtable時(shí)撰糠,不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必須為之提供外同步辩昆。Hashtable和HashMap采用hash阅酪、rehash算法大致一樣,所以性能不會(huì)有很大的差異汁针。
49. HashMap是如何設(shè)計(jì)的术辐?是如何解決沖突的?【2018.3.27】
- HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)施无。在Java編程語(yǔ)言中辉词,最基本的結(jié)構(gòu)就是兩種,一個(gè)是數(shù)組猾骡,另外一個(gè)是模擬指針(引用)瑞躺,所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個(gè)基本結(jié)構(gòu)來(lái)構(gòu)造的,HashMap也不例外兴想。HashMap實(shí)際是一個(gè)“鏈表的數(shù)組”的數(shù)據(jù)結(jié)構(gòu)幢哨,每個(gè)元素存放鏈表頭結(jié)點(diǎn)的數(shù)組,即數(shù)組和鏈表的街個(gè)體襟企。HashMap底層就是一個(gè)數(shù)組結(jié)構(gòu)嘱么,數(shù)組中的每一項(xiàng)又是一個(gè)鏈表。當(dāng)新建一個(gè)HashMap的時(shí)候顽悼,就會(huì)初始化一個(gè)數(shù)組曼振。Entry就是數(shù)組中的元素,每個(gè)Map.Entry其實(shí)就是一個(gè)key-value對(duì)蔚龙,它持有一個(gè)指向下一個(gè)元素的引用冰评,就構(gòu)成了鏈表
- HashMap的存儲(chǔ)。當(dāng)我們往HashMap中put元素的時(shí)候木羹,先根據(jù)Key的hashCode重新計(jì)算hash值甲雅,根據(jù)hash值得到這個(gè)元素在數(shù)組中的位置(即下標(biāo))解孙,如果數(shù)組該位置上已經(jīng)存放有其他元素了,那么在這個(gè)位置上的元素將以鏈表的形式存放抛人,新加入的放在鏈頭弛姜,最先加入的放在鏈尾。如果數(shù)組該位置上沒(méi)有元素妖枚,就直接將該元素放到此數(shù)組中的該位置上廷臼。
- HashMap的讀取。從HashMap中g(shù)et元素時(shí)绝页,首先計(jì)算key的HashCode荠商,找到數(shù)組中對(duì)應(yīng)位置的某一元素,然后通過(guò)key的equals方法在對(duì)應(yīng)位置的鏈表中找到需要的元素
- HashMap的resize(rehash)续誉。當(dāng)HashMap中的元素越來(lái)越多的時(shí)候莱没,hash沖突的幾率也就越來(lái)越高,因?yàn)閿?shù)組的長(zhǎng)度是固定的酷鸦。所以為了提高查詢的效率饰躲,就要對(duì)HashMap的數(shù)組進(jìn)行擴(kuò)容,數(shù)組擴(kuò)容這個(gè)操作也會(huì)出現(xiàn)在ArrayList中井佑,這是一個(gè)常用的操作属铁,而在HashMap數(shù)組擴(kuò)容之后眠寿,最消耗性能的點(diǎn)就出現(xiàn)了:原數(shù)組中的數(shù)據(jù)必須重新計(jì)算其在新數(shù)組中的位置躬翁,并放進(jìn)去,這就是resize盯拱。那么HashMap什么時(shí)候進(jìn)行擴(kuò)容呢盒发?當(dāng)HashMap中的元素個(gè)數(shù)超過(guò)數(shù)組大小loadFactor時(shí),就會(huì)進(jìn)行數(shù)組擴(kuò)容狡逢,loadFactor的默認(rèn)值為0.75宁舰,這是一個(gè)折中的取值。也就是說(shuō)奢浑,默認(rèn)情況下蛮艰,數(shù)組大小為16,那么當(dāng)HashMap中元素個(gè)數(shù)超過(guò)160.75=12的時(shí)候雀彼,就把數(shù)組的大小擴(kuò)展為2*16=32壤蚜,即擴(kuò)大一倍,然后重新計(jì)算每個(gè)元素在數(shù)組中的位置徊哑,擴(kuò)容是需要進(jìn)行數(shù)組復(fù)制的袜刷,復(fù)制數(shù)組是非常消耗性能的操作,所以如果我們已經(jīng)預(yù)知HashMap中元素的個(gè)數(shù)莺丑,那么預(yù)設(shè)元素的個(gè)數(shù)能夠有效的提高HashMap的性能著蟹。
48. Collection 和 Collections的區(qū)別墩蔓?【2018.3.26】
Collection是Java.util 下的接口,它是各種集合的父接口萧豆,繼承于它的接口主要有Set 和 List奸披;
Collections是個(gè)java.util 下的類,是針對(duì)集合的幫助類涮雷,提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索源内、排序、線程安全化等操作
47. 集合關(guān)系圖
46. final,finally,finalize的區(qū)別【2018.3.23】
final 是一個(gè)修飾符份殿,表示不可變膜钓。如果一個(gè)類被聲明為final,則它不能再派生出新類卿嘲,不能作為父類被繼承颂斜,所以一個(gè)類不能既是abstract的又是final的;被聲明為final的變量必須在聲明時(shí)給定初始值拾枣,而以后的引用中只能讀取沃疮,不可修改;被聲明為final的方法同樣只能使用梅肤,不能重載
finalize 是方法名司蔬。java技術(shù)允許使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用姨蝴。它是在Object類中定義的俊啼,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作
finally 異常處理左医。用在異常處理時(shí)提供finally塊來(lái)執(zhí)行任何清除操作授帕;如果拋出一個(gè)異常,那么相匹配catch子句就會(huì)執(zhí)行浮梢,然后控制就會(huì)進(jìn)入finally塊(如果有的話)跛十,在return前執(zhí)行。
45. try{}里有個(gè)return語(yǔ)句秕硝,那么最后的finally{}里的代碼會(huì)不會(huì)執(zhí)行芥映,何時(shí)執(zhí)行? 【2018.3.22】
會(huì)執(zhí)行远豺,在try里的return前執(zhí)行
44. java中的異常處理機(jī)制的簡(jiǎn)單原理
當(dāng)Java程序違反了java的語(yǔ)義規(guī)則時(shí)奈偏,java虛擬機(jī)就會(huì)將發(fā)生的錯(cuò)誤表示為一個(gè)異常。違反語(yǔ)義規(guī)則包括2種情況憋飞,一種是java類庫(kù)內(nèi)置的語(yǔ)義檢查霎苗,例如:角標(biāo)越界,會(huì)引發(fā)IndexOutOfBoundsException榛做;另一種情況是java允許程序員擴(kuò)展這種語(yǔ)義檢查唁盏,程序員可以創(chuàng)建自己的異常内狸,并自由選擇在何時(shí)用throw關(guān)鍵字引發(fā)異常
43. 異常(Exception)分幾種類型?有什么區(qū)別厘擂?寫(xiě)出幾個(gè)常見(jiàn)異忱サ【2018.3.21】
分類:
運(yùn)行時(shí)異常、非運(yùn)行時(shí)異常刽严。
區(qū)別:
- 運(yùn)行時(shí)異常(RuntimeException)又稱為非檢查異常(Unchecked Exception), 非運(yùn)行時(shí)異常指的是檢查異常(Checked Exception)昂灵。
- 運(yùn)行時(shí)異常直接或間接的繼承RuntimeException的異常。非運(yùn)行時(shí)異常是除了運(yùn)行時(shí)異常以外的其他異常舞萄。
- 運(yùn)行時(shí)異常不需要捕獲眨补,非運(yùn)行時(shí)異常需要通過(guò)try-catch或throws進(jìn)行處理
常見(jiàn)異常:
- RuntimeException
- NullPointerException:空指針異常,操作空引用時(shí)引發(fā)
- ClassCastException:類型轉(zhuǎn)換異常倒脓,強(qiáng)制類型轉(zhuǎn)換不匹配時(shí)引發(fā)
- ArrayIndexOutOfBoundsException:角標(biāo)越界異常撑螺,使用一個(gè)不存在的數(shù)組下標(biāo)時(shí)引發(fā)
- 非RuntimeException
- SQLException:提供關(guān)于數(shù)據(jù)庫(kù)訪問(wèn)出錯(cuò)的異常
- IOException:當(dāng)發(fā)生某種I/O異常時(shí),拋出此異常
- ClassNotFoundException:當(dāng)應(yīng)用試圖使用Class類中的forName方法崎弃、loadClass方法時(shí)甘晤,拋出該異常
42. 在java中如何引發(fā)異常?如何處理饲做?
在java中线婚,可以通過(guò)throw關(guān)鍵字來(lái)引發(fā)異常。
處理異常:
- 使用try-catch捕獲異常
- 使用throws拋出異常
41. Checked Exception 和 Unchecked Exception是什么以及他們的區(qū)別盆均?【2018.3.20】
首先塞弊,java的異常分為Error和Exception。這兩類都是接口Throwable的子類缀踪。Error及Exception及其子類之間的關(guān)系居砖,大致可以用下圖簡(jiǎn)述。
注意事項(xiàng):
1驴娃。 Error僅在java的虛擬機(jī)中發(fā)生,用戶無(wú)需在程序中捕捉或者拋出Error循集。
2唇敞。 Exception分為一般的Exception和RuntimeException兩類。這里有點(diǎn)讓人覺(jué)得別扭的是RuntimeException(Unchecked)繼承于Exception(Checked)的父類咒彤。
PS: checked與unchecked的概念理解:
checked: 一般是指程序不能直接控制的外界情況疆柔,是指在編譯的時(shí)候就需要檢查的一類exception,用戶程序中必須采用try catch機(jī)制處理或者通過(guò)throws交由調(diào)用者來(lái)處理镶柱。這類異常旷档,主要指除了Error以及RuntimeException及其子類之外的異常。
unchecked:是指那些不需要在編譯的時(shí)候就要處理的一類異常歇拆。在java體系里鞋屈,所有的Error以及RuntimeException及其子類都是unchecked異常范咨。再形象直白的理解為不需要try catch等機(jī)制處理的異常,可以認(rèn)為是unchecked的異常厂庇。
checked與unchecked在throwable的繼承關(guān)系中體現(xiàn)為下圖:
+-----------+
| Throwable |
+-----------+
/ \
/ \
+-------+ +-----------+
| Error | | Exception |
+-------+ +-----------+
/ | \ / | \ \
\________/ \______/ \
+------------------+
unchecked checked | RuntimeException |
+------------------+
/ | | \
\_________________/
unchecked
40. 內(nèi)部類可以引用它的包含類的成員嗎渠啊?有什么限制?【2018.3.19】
如果是靜態(tài)內(nèi)部類权旷,只能引用包含類的靜態(tài)成員替蛉。
不是靜態(tài)內(nèi)部類,都可以引用拄氯。
39. 請(qǐng)解釋下面的兩個(gè)Syatem.out.println輸出不同躲查?【2018.3.16】
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1==s2); // 輸出:true
String s3 = new String("Hello");
String s4 = new String("Hello");
System.out.println(s3==s4); // 輸出:false
"Hello"是一個(gè)字符串常量,它存放在內(nèi)存的常量池中译柏。在第一行代碼執(zhí)行后創(chuàng)建此對(duì)象熙含,而創(chuàng)建s2對(duì)象的時(shí)候首先會(huì)到常量池中檢查是否存在字符串“Hello”,如果存在艇纺,則直接引用已存在的對(duì)象怎静。
s3和s4所應(yīng)用的對(duì)象都是通過(guò)new關(guān)鍵字創(chuàng)建的,會(huì)在堆中分別創(chuàng)建黔衡。這兩個(gè)引用分別指向不同的兩個(gè)對(duì)象蚓聘。“==”只有在兩個(gè)變量引用指向同一個(gè)對(duì)象時(shí)才返回true因此出現(xiàn)如上結(jié)果盟劫。
38. int 和 Integer 的區(qū)別 【2018.3.15】
java語(yǔ)言是一個(gè)面向?qū)ο蟮恼Z(yǔ)言夜牡,但是java中的基本數(shù)據(jù)類型卻不是面向?qū)ο蟮模@在實(shí)際使用時(shí)存在很多的不便侣签,為了解決這個(gè)不足塘装,在設(shè)計(jì)類時(shí)為每個(gè)基本數(shù)據(jù)類型設(shè)計(jì)了一個(gè)對(duì)應(yīng)的類進(jìn)行代表,這樣八個(gè)基本數(shù)據(jù)類型對(duì)應(yīng)的類統(tǒng)稱為包裝類(Wrapper Class)影所。
java語(yǔ)言提供了兩種不同的類型:引用類型和基本數(shù)據(jù)類型蹦肴,int是JAVA語(yǔ)言的基本數(shù)據(jù)類型,Integer是java為int提供的包裝類猴娩,是引用數(shù)據(jù)類型阴幌。
java中的八個(gè)基本數(shù)據(jù)類型是:byte,short,int,long,float,double,char,boolean
對(duì)應(yīng)的包裝類:Byte,Short,Integer,Long,Float,Double,Character,Boolean.
包裝類的主要用途:
- 作為和基本數(shù)據(jù)類型對(duì)應(yīng)的類類型存在,方便涉及到對(duì)象的操作
- 包含每種基本數(shù)據(jù)類型的相關(guān)屬性如最大值卷中,最小值等矛双,以及相關(guān)的操作方法。
37. heap 和 stack 的區(qū)別【2018.3.14】
棧(stack)和堆(heap)都是java用來(lái)在內(nèi)存中存放數(shù)據(jù)的地方蟆豫,二者區(qū)別在于:
- 棧存放基本類型變量和對(duì)象引用议忽,當(dāng)超出作用域后釋放;堆存放new出來(lái)的對(duì)象和數(shù)組
- 堆可以動(dòng)態(tài)的分配內(nèi)存大小十减,生存期也不必事先告訴編譯器栈幸,java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)愤估。存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性侦镇。棧的存取速度比堆要快灵疮,僅次于直接位于CPU中的寄存器。堆由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存壳繁,存取速度較慢震捣。
- 棧數(shù)據(jù)可以共享;堆不可以
- 棧是一種線形集合闹炉,其添加和刪除元素的操作應(yīng)在同一段完成蒿赢,棧按照后進(jìn)先出方式進(jìn)行處理;堆地址是不連續(xù)的渣触,可隨機(jī)訪問(wèn)
36. 簡(jiǎn)述類(class)羡棵、類庫(kù)(class library)、包(package)嗅钻、jar文件這四個(gè)概念間的聯(lián)系【2018.3.13】
- 類皂冰,實(shí)際上是對(duì)某種類型的對(duì)象定義變量和方法的原型。它標(biāo)識(shí)對(duì)象是生活中一類具有共同特征的事物的抽象养篓。
- 包秃流,為了更好的組織類,java提供了包機(jī)制柳弄。包是類的容器舶胀,用于分隔類名空間。
- 類庫(kù)碧注,是用來(lái)實(shí)現(xiàn)各種功能的類的集合嚣伐。
- jar,用于發(fā)布和使用類庫(kù)萍丐,可 被編譯器和jvm直接使用
35. 子類A繼承父類B轩端,A a = new A();則父類B構(gòu)造函數(shù)、父類B靜態(tài)代碼塊碉纺、父類B非靜態(tài)代碼塊船万、以及子類的各個(gè)部分執(zhí)行的先后順序?
父類B靜態(tài)代碼塊--->子類A靜態(tài)代碼塊--->父類B非靜態(tài)代碼塊--->父類B構(gòu)造函數(shù)--->子類A非靜態(tài)代碼塊--->子類A構(gòu)造函數(shù)
34. 接口是否可繼承接口骨田?抽象類是否可以實(shí)現(xiàn)接口?抽象類是否可繼承具體類声怔?【2018.3.12】
相關(guān)概念:
接口:接口是一種約束形式态贤,其中只包括成員定義,不包含成員實(shí)現(xiàn)的內(nèi)容醋火。
抽象類:抽象類往往用來(lái)表征對(duì)問(wèn)題領(lǐng)域進(jìn)行分析悠汽、設(shè)計(jì)中得出的抽象概念箱吕,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象柿冲。
抽象方法:抽象方法指一些只有方法聲明茬高,而沒(méi)有具體方法體的方法。抽象方法一般存在于抽象或接口中假抄。
答案:
- 接口可以繼承接口 extands
- 抽象類可以實(shí)現(xiàn)接口
- 抽象類可以繼承具體類
- 抽象類中可以有靜態(tài)的main方法
關(guān)于為什么接口不能繼承抽象類怎栽,我想是因?yàn)槌橄箢惪梢杂蟹椒w,而接口不行宿饱,如果繼承的話熏瞄,這一點(diǎn)會(huì)沖突
33. 簡(jiǎn)述垃圾回收的有點(diǎn)和原理。并例舉2種回收機(jī)制【2018.3.9】
java語(yǔ)言中一個(gè)顯著的特點(diǎn)就是引入了垃圾回收機(jī)制谬以,使c++程序員最頭疼的內(nèi)存問(wèn)題迎刃而解强饮,它使得java程序員在編寫(xiě)程序時(shí)不在需要考慮內(nèi)存管理。由于有個(gè)垃圾回收機(jī)制为黎,java中的對(duì)象不再有“作用域”的概念邮丰,只有對(duì)象的引用才有“作用域”。垃圾回收可以有效的防止內(nèi)存泄漏铭乾,有效的使用可以使用的內(nèi)存剪廉。
垃圾回收器通常是作為一個(gè)單獨(dú)的低級(jí)別的線程運(yùn)行,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡或長(zhǎng)時(shí)間沒(méi)有使用的對(duì)象進(jìn)行清除和回收片橡,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收妈经。
兩種垃圾回收機(jī)制如下:
- 增量收集器
增量收集器把堆棧分為多個(gè)域,每次僅從一個(gè)域回收垃圾捧书。這會(huì)造成較小的應(yīng)用程序中斷吹泡。 - 分代收集器
這種收集器把堆棧分為兩個(gè)或多個(gè)域,用以存放不同壽命的對(duì)象经瓷。jvm生成的新對(duì)象一般放在其中的某個(gè)域中爆哑。過(guò)一段時(shí)間,繼續(xù)存在的對(duì)象將獲得使用期并轉(zhuǎn)入更長(zhǎng)壽命的域中舆吮。分代收集器對(duì)不同的域使用不同的算法以優(yōu)化性能揭朝。
32. GC是什么?為什么要有GC色冀?
GC是垃圾收集的意思潭袱,內(nèi)存處理是編程人員容易出現(xiàn)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰锋恬,java提供的GC功能可以自動(dòng)檢測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的屯换。java程序員編程的時(shí)候不用考慮變量不用時(shí)釋放內(nèi)存,java虛擬機(jī)可以自動(dòng)判斷出并收集到垃圾。
31. 靜態(tài)變量和實(shí)例變量的區(qū)別
靜態(tài)變量也稱為類變量彤悔,歸全類共有嘉抓,它不依賴某個(gè)對(duì)象,可通過(guò)類名直接訪問(wèn)晕窑,而實(shí)例變量必須依存于某一實(shí)例抑片,只能通過(guò)對(duì)象才能訪問(wèn)到它
30. 簡(jiǎn)述一下static關(guān)鍵字的作用?【2018.3.8】
static表示“靜態(tài)”的意思杨赤,用來(lái)修飾成員變量和成員方法敞斋,亦可以形成靜態(tài)代碼塊。只要這個(gè)類被加載望拖,java虛擬機(jī)就能根據(jù)類名在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)找到它們渺尘。因此,static成員可以再它的任何對(duì)象創(chuàng)建之前訪問(wèn)说敏,無(wú)需引用任何對(duì)象鸥跟。
- 修飾成員變量。用static修飾的成員變量不屬于對(duì)象的數(shù)據(jù)結(jié)構(gòu)盔沫;static變量是屬于類的變量医咨,通常可以通過(guò)類名來(lái)引用static成員架诞;static成員變量和類的信息一起存儲(chǔ)在方法區(qū)拟淮,而不是在堆中,一個(gè)類的static成員變量只有“一份”谴忧,無(wú)論該類創(chuàng)建了多少對(duì)象很泊。
- 修飾成員方法。static修飾的方法則不需要針對(duì)某些對(duì)象進(jìn)行操作沾谓,其運(yùn)行結(jié)果僅與輸入的參數(shù)有關(guān)委造,調(diào)用時(shí)直接用類名引用。由于static在調(diào)用時(shí)沒(méi)有具體的對(duì)象均驶,因此在static方法中不能對(duì)非static成員(對(duì)象成員)進(jìn)行訪問(wèn)昏兆。static方法的作用在于提供一些“工具方法”和“工廠方法”等。
- static代碼塊:屬于類的代碼塊妇穴,在類加載期間執(zhí)行的代碼塊爬虱,只執(zhí)行一次,可以用來(lái)在軟件中加載靜態(tài)資源腾它。
29. String類可否被繼承跑筝?【2018.3.7】
String類是final類,所以不可被繼承瞒滴。
String的本質(zhì)是一個(gè)char數(shù)組,而且被final修飾的字段創(chuàng)建后不可改變
private final char value[];
好處是:
線程安全继蜡,字符串常量池?cái)?shù)據(jù)共享,提高效率逛腿,節(jié)省內(nèi)存
28. 構(gòu)造器Constructor是否可被override稀并?
構(gòu)造器不能被繼承,所以談不上重寫(xiě)override单默,但是可以重載overload碘举。
27. 一個(gè)subClass怎樣調(diào)用superclass中的方法(myMethod)和構(gòu)造方法?【2018.3.6】
子類subclass實(shí)例可以直接調(diào)用父類superclass未被重寫(xiě)的方法搁廓;若子類重寫(xiě)了父類的方法引颈,可以在子類內(nèi)通過(guò)super.方法名()的形式調(diào)用父類方法,如:super.myMethod()
創(chuàng)建子類實(shí)例時(shí)境蜕,默認(rèn)調(diào)用父類無(wú)參構(gòu)造方法蝙场,若調(diào)用父類有參構(gòu)造方法,可以再子類構(gòu)造方法中通過(guò)super(參數(shù))形式調(diào)用
26. abstract class 和 interface有什么區(qū)別粱年?【2018.3.5】
從語(yǔ)法角度來(lái)說(shuō):abstract class方法中可以有自己的數(shù)據(jù)成員售滤,也可以有非abstract的成員方法,并賦予方法的默認(rèn)行為台诗,而在interface中一般不定義數(shù)據(jù)變量完箩,所有方法都是abstract,方法不能擁有默認(rèn)行為拉队。
從編程角度來(lái)說(shuō):abstract class在java語(yǔ)言中表示的是一種繼承關(guān)系弊知,一個(gè)類只能使用一次繼承關(guān)系,而一個(gè)類可以實(shí)現(xiàn)多個(gè)interface粱快。
從問(wèn)題域角度來(lái)書(shū):abstract class在java語(yǔ)言中體現(xiàn)了一種繼承關(guān)系秩彤,要想使得繼承關(guān)系合理,父類和派生類之間必須存在“is a”關(guān)系事哭,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的漫雷。對(duì)于interface來(lái)說(shuō)則不然,并不要求interface的實(shí)現(xiàn)者和interface定義在概念本質(zhì)上一致慷蠕,僅僅是實(shí)現(xiàn)了interface定義的契約而已珊拼。
25. java權(quán)限修飾符 【2018.3.2】
修飾符/作用域 | 當(dāng)前類 | 同一package | 子類 | 其它 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | x |
default | √ | √ | x | x |
private | √ | x | x | x |
24. 繼承和重載的區(qū)別?【2018.3.1】
java的繼承是子類對(duì)象繼承父類對(duì)象的成員屬性和成員方法流炕,只允許單繼承澎现。
在繼承的過(guò)程中可以實(shí)現(xiàn)方法的重寫(xiě)(也稱為覆蓋),即子類定義一個(gè)方法每辟,覆蓋從父類那里繼承來(lái)的同名的方法剑辫。每當(dāng)子類對(duì)象調(diào)用該方法時(shí)都是子類自己定義的方法,只有使用super關(guān)鍵字或父類名為前綴時(shí)渠欺,才會(huì)調(diào)用父類原來(lái)的方法妹蔽。方法覆蓋是,子類應(yīng)與父類有完全相同的方法名,返回值類型和參數(shù)列表胳岂,子類中的覆蓋方法不能使用比父類中被覆蓋的方法更嚴(yán)格的訪問(wèn)權(quán)限编整。
方法重載要求的是同一個(gè)類中,方法名相同乳丰,參數(shù)列表不同的方法掌测,對(duì)返回值沒(méi)限定
23. 什么時(shí)候需要改寫(xiě)hashCode方法?為什么产园?【2018.2.28】
在改寫(xiě)equals方法的時(shí)候總是要改寫(xiě)hashCode方法汞斧。如果不這樣的話,就會(huì)違反Object類的hashCode方法的通用約定什燕,導(dǎo)致這個(gè)類無(wú)法與所有基于散列值的集合類結(jié)合一起正常工作粘勒,包括HashMap,HashSet和HashTable屎即。
22. 請(qǐng)分述類及對(duì)象的創(chuàng)建模式【2018.2.27】
總共有五種創(chuàng)建模式庙睡,分別是單例模式,工廠方法模式剑勾,抽象工廠模式埃撵,建造者模式,原型模式虽另,其中工廠方法模式為類創(chuàng)建模式暂刘,其余四種為對(duì)象創(chuàng)建模式。
工廠方法模式(Factory Method捂刺,類創(chuàng)建模式):核心工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建谣拣,而是將具體創(chuàng)建的工作交個(gè)子類去做,成為一個(gè)抽象工廠角色族展,僅負(fù)責(zé)給出具體工廠類必須實(shí)現(xiàn)的接口森缠,而不接觸哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。
單例模式(Singleton仪缸,對(duì)象創(chuàng)建模式 ):?jiǎn)卫J酱_保某一個(gè)類只有一個(gè)實(shí)例贵涵,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
抽象工廠模式(Abstract Factory恰画,對(duì)象創(chuàng)建模式):抽象工廠模式是指當(dāng)有多個(gè)抽象角色時(shí)宾茂,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個(gè)接口拴还,使客戶端在不必指定產(chǎn)品的具體的情況下跨晴,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象。簡(jiǎn)單說(shuō)是創(chuàng)建一組相關(guān)或相互依賴的復(fù)雜對(duì)象片林。
建造模式(Builder端盆,對(duì)象創(chuàng)建模式):將產(chǎn)品的內(nèi)部表象和產(chǎn)品的生成過(guò)程分割開(kāi)來(lái)怀骤,從而使一個(gè)建造過(guò)程生成具有不同的內(nèi)部表象的產(chǎn)品對(duì)象。建造模式使得產(chǎn)品內(nèi)部表象可以獨(dú)立的變化焕妙,客戶不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)蒋伦。建造模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過(guò)程。
原型模式(Prototype访敌,對(duì)象創(chuàng)建模式):通過(guò)給出一個(gè)原型對(duì)象來(lái)指明所要?jiǎng)?chuàng)建的對(duì)象的類型凉敲,然后用復(fù)制這個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象。原始模型模式允許動(dòng)態(tài)的增加或減少產(chǎn)品類寺旺,產(chǎn)品類不需要非得有任何事先確定的等級(jí)結(jié)構(gòu),原始模型模式適用于任何的等級(jí)結(jié)構(gòu)势决。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法阻塑。
21. 什么是OOAD?OOAD怎么實(shí)現(xiàn)果复?【2018.2.26】
OOAD(Object Orient Analysis Design陈莽,面向?qū)ο蟮姆治雠c設(shè)計(jì))是現(xiàn)代軟件企業(yè)廣為采用的一項(xiàng)有效技術(shù)。OOAD方法要求在設(shè)計(jì)中要映射現(xiàn)實(shí)世界中指定問(wèn)題域中的對(duì)象和實(shí)體锈至,例如:顧客奔穿、汽車和銷售人員等扇住。這就需要設(shè)計(jì)要盡可能的接近現(xiàn)實(shí)世界,即以最自然的方式表述實(shí)體私植。
使用UML建模語(yǔ)言創(chuàng)建系統(tǒng)的分析模型與設(shè)計(jì)模型是OOAD實(shí)現(xiàn)的主要手段。
20. 排序有哪些方法车酣?【2018.2.24】
- 插入排序(直接插入排序曲稼、希爾排序)
- 交換排序(冒泡排序、快速排序)
- 選擇排序(直接選擇排序湖员、堆排序)
- 歸并排序
- 分配排序(箱排序贫悄、基數(shù)排序)
19. 簡(jiǎn)單說(shuō)下什么是遞歸?什么情況會(huì)使用娘摔?
- 遞歸作為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用窄坦,是指函數(shù)在運(yùn)行過(guò)程中直接或間接調(diào)用自身而產(chǎn)生的重入現(xiàn)象
- 遞歸算法一般用于解決三類問(wèn)題:
- 數(shù)據(jù)的定義是按遞歸定義的(斐波那契函數(shù))
- 問(wèn)題解法按遞歸算法實(shí)現(xiàn)(回溯)
- 數(shù)據(jù)的結(jié)構(gòu)形式是按遞歸定義的(樹(shù)的遍歷,圖的搜索)
18. 列出自己常用的jdk包 【2018.2.23】
常用的jdk包如下:
- java.lang:這個(gè)包中包含了JDK提供的基礎(chǔ)類凳寺,如String等都是這里面的鸭津,這個(gè)包是唯一一個(gè)可以不用導(dǎo)入就可以使用的包
- java.io:這個(gè)包中包含了與輸入輸出相關(guān)的類,如文件操作等
- java.net:這個(gè)包中包含了與網(wǎng)絡(luò)有關(guān)的類读第,如URL曙博,URLConnection等
- java.util:系統(tǒng)輔助類,特別是集合類Collection怜瞒,list父泳,map等
- java.sql:數(shù)據(jù)庫(kù)操作的類
17. java源文件中是否可以包含多個(gè)類般哼,有什么限制?【2018.2.9】
一個(gè)java源文件中可以包含多個(gè)類惠窄,每個(gè)源文件中至多有一個(gè)public類蒸眠,如果有的話,那么源文件的名字必須與之相同杆融。如果源文件中沒(méi)有public類楞卡,則源文件用什么名字都可以,但最好還是具有的定的意脾歇。一般建議一個(gè)源文件中只寫(xiě)一個(gè)java類
16. java中會(huì)存在內(nèi)存泄漏嗎蒋腮?簡(jiǎn)單描述【2018.2.8】
會(huì)出現(xiàn)內(nèi)存泄漏
一般來(lái)說(shuō)內(nèi)存泄漏有兩種情況。一是在堆中分配的內(nèi)存藕各,在沒(méi)有將其釋放掉的時(shí)候池摧,就將所有能訪問(wèn)這塊內(nèi)存的方式都刪掉;另一種情況則是在內(nèi)存對(duì)象已經(jīng)不需要的時(shí)候激况,還仍然保留這這塊內(nèi)存和它的訪問(wèn)方式(引用)作彤。第一種情況,在java中已經(jīng)由于垃圾回收機(jī)制的引入乌逐,得到了很好的解決竭讳。所以,java中的內(nèi)存泄漏浙踢,主要指的是第二種情況
15. 什么是垃圾回收绢慢?什么時(shí)候觸發(fā)垃圾回收?如何降低垃圾回收的觸發(fā)頻率成黄?它能保證程序有足夠的可用內(nèi)存嗎呐芥? 【2018.2.7】
- 垃圾回收(GC)是Java語(yǔ)言的一個(gè)重要特性,作用是釋放不在被使用的內(nèi)存
- 垃圾回收由系統(tǒng)進(jìn)行管理奋岁,在系統(tǒng)認(rèn)為需要的時(shí)候自動(dòng)啟動(dòng)一個(gè)線程進(jìn)行處理
- 盡量減少垃圾內(nèi)存思瘟,也就是新建對(duì)象的數(shù)量,可以降低垃圾回收的頻率
- 垃圾回收無(wú)法保證有足夠的內(nèi)存
14. 什么是進(jìn)程闻伶?
進(jìn)程是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)滨攻,是一個(gè)計(jì)算機(jī)中正在運(yùn)行的程序?qū)嵗蓝翰?梢苑峙浣o處理器并由處理器執(zhí)行的一個(gè)實(shí)體光绕,由單一順序的執(zhí)行顯示,一個(gè)當(dāng)前狀態(tài)和一組相關(guān)的系統(tǒng)資源所描述的活動(dòng)單元畜份。
13. 你對(duì)軟件開(kāi)發(fā)中的迭代的理解 【2018.2.6】
軟件開(kāi)發(fā)中诞帐,各個(gè)開(kāi)發(fā)階段并不是順序執(zhí)行,而是每個(gè)階段都在迭代爆雹,然后進(jìn)入下一階段的開(kāi)發(fā)停蕉。這樣對(duì)于開(kāi)發(fā)中的需求變化愕鼓,及人員變動(dòng)都能得到更好的適應(yīng)。
軟件開(kāi)發(fā)過(guò)程中迭代模型如下圖:
12. 請(qǐng)描述一下java加載class文件的機(jī)制
Java中類的加載是由ClassLoader和它的子類實(shí)現(xiàn)的慧起,java ClassLoader是一個(gè)非常重要的java 運(yùn)行時(shí)組件菇晃,它負(fù)責(zé)運(yùn)行時(shí)查找和裝入類文件中的類
11. Java中8種基本數(shù)據(jù)類型和其所占的字節(jié)數(shù)?
基本類型 | 大小 | 包裝器類型 |
---|---|---|
boolean | - | Boolean |
char | 2 byte | Character |
byte | 1 byte | Byte |
short | 2 byte | Short |
int | 4 byte | Integer |
long | 8 byte | Long |
float | 4 byte | Float |
double | 8 byte | Double |
boolean所占存儲(chǔ)空間沒(méi)有明確指定
10. &和&&的區(qū)別蚓挤? 【2018.2.5】
&和&&都可以執(zhí)行關(guān)系判斷磺送。二者的區(qū)別是:&運(yùn)算是把邏輯表達(dá)式全部計(jì)算完,而&&具有短路計(jì)算功能灿意。所謂短路計(jì)算估灿,是指系統(tǒng)從左到右進(jìn)行邏輯表達(dá)式的計(jì)算,一旦出現(xiàn)計(jì)算結(jié)果已經(jīng)確定的情況脾歧,則計(jì)算過(guò)程即被終止甲捏。
9. Java中結(jié)構(gòu)化程序設(shè)計(jì)有哪三種基本流程,分別對(duì)應(yīng)哪些語(yǔ)句鞭执?
Java中結(jié)構(gòu)化程序設(shè)計(jì)有三種基本流程,分別是順序芒粹、選擇兄纺、循環(huán)。
其中化漆,順序表示程序中的個(gè)操作是按照它們出現(xiàn)的先后順序執(zhí)行的估脆;選擇對(duì)應(yīng)的是if和switch語(yǔ)句;循環(huán)對(duì)應(yīng)的是for座云、do-while和while語(yǔ)句
8. java中的兩個(gè)關(guān)鍵字:null和void有什么區(qū)別疙赠?
在java中,void僅用于無(wú)返回值的方法上朦拖,例如:
public void a(){}
該方法不需要返回?cái)?shù)據(jù)圃阳,故返回值類型設(shè)置為void
null則表示對(duì)象/變量的值,例如:
String a = null;
表示a沒(méi)有被實(shí)例化璧帝,沒(méi)有只想具體的內(nèi)存地址
7. 簡(jiǎn)述TCP/UDP協(xié)議的區(qū)別捍岳?【2018.2.2】
比較項(xiàng) | TCP | UDP |
---|---|---|
是否可連接 | 面向連接 | 面向非連接 |
傳輸可靠性 | 可靠的 | 不可靠的 |
應(yīng)用場(chǎng)合 | 傳輸大量的數(shù)據(jù) | 少量數(shù)據(jù) |
速度 | 慢 | 快 |
6. Java跨平臺(tái)是如何實(shí)現(xiàn)的?【2018.2.1】
Java是利用JVM實(shí)現(xiàn)跨平臺(tái)的
Java源代碼(*.java)經(jīng)過(guò)java編譯器編譯成java字節(jié)碼(*.class),執(zhí)行java字節(jié)碼睬隶,java字節(jié)碼經(jīng)過(guò)JVM解釋為具體平臺(tái)的具體指令锣夹,并執(zhí)行。不同平臺(tái)有不同的JVM苏潜,所以Java字節(jié)碼可以在主流平臺(tái)上能夠解釋執(zhí)行银萍。在這個(gè)意義上Java是跨平臺(tái)的,也就是說(shuō):Java的字節(jié)碼是跨平臺(tái)的恤左。
5. JVM能有幾個(gè)實(shí)例贴唇?
每個(gè)java程序?qū)?yīng)一個(gè)JVM實(shí)例搀绣,當(dāng)一個(gè)java程序運(yùn)行時(shí)就創(chuàng)建一個(gè)JVM實(shí)例的個(gè)數(shù)取決于同時(shí)執(zhí)行的程序個(gè)數(shù)。
4. JVM滤蝠、JDK豌熄、JRE、JavaSE物咳、JavaME锣险,GC的意思? 【2018.1.31】
JVM:java虛擬機(jī)览闰,Java Virtual Machine的縮寫(xiě)芯肤。是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的压鉴。Java虛擬機(jī)有自己完善的硬體結(jié)構(gòu)崖咨,如處理器、堆棧油吭、寄存器等击蹲,還具有相應(yīng)的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)信息婉宰,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼)歌豺,就可以在多種平臺(tái)上不加修改的運(yùn)行。
JDK:java開(kāi)發(fā)工具包心包,Java development Kit的縮寫(xiě)类咧。JDK是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境蟹腾、Java工具和Java基礎(chǔ)類庫(kù)痕惋。
JRE:Java運(yùn)行環(huán)境,Java Runtime Environment的縮寫(xiě)娃殖。運(yùn)行JAVA程序所必須的環(huán)境的集合值戳,包含JVM標(biāo)準(zhǔn)實(shí)現(xiàn)及Java核心類庫(kù)。
JavaSE:Java Standard Edition,標(biāo)準(zhǔn)版珊随,是我們常用的一個(gè)版本述寡,從JDK5.0開(kāi)始,改名為 Java SE叶洞,主要用于桌面應(yīng)用軟件的編程鲫凶。
JavaEE:Java Enterprise Edition,企業(yè)版衩辟,JavaEE是J2EE的一個(gè)新的名稱螟炫,主要是用于分布式的網(wǎng)絡(luò)程序的開(kāi)發(fā)。
JavaME:Java Micro Edition艺晴,是為機(jī)頂盒昼钻、移動(dòng)電話和PDA之類嵌入式消費(fèi)電子設(shè)備提供Java語(yǔ)言平臺(tái)掸屡,包括虛擬機(jī)和一系列標(biāo)準(zhǔn)化的Java API。
GC:垃圾回收然评,Garbage Collection的縮寫(xiě)仅财。當(dāng)java虛擬機(jī)發(fā)覺(jué)內(nèi)存資源緊張時(shí),則會(huì)自動(dòng)的去清理無(wú)用對(duì)象(沒(méi)有被引用到的對(duì)象)所占用的內(nèi)存空間碗淌。
3. Java 中異常分為哪些種類 【2018.1.30】
按 照 異 常 需 要 處 理 的 時(shí) 機(jī) 分 為 編 譯 時(shí) 異 常 也 叫 CheckedException 和 運(yùn) 行 時(shí) 異 常 也叫RuntimeException盏求。
只有 java 語(yǔ)言提供了 Checked 異常,Java 認(rèn)為 Checked 異常都是可以被處理的異常亿眠,所以 Java 程序必須顯式處理 Checked 異常碎罚。如果程序沒(méi)有處理Checked異常,該程序在編譯時(shí)就會(huì)發(fā)生錯(cuò)誤無(wú)法編譯纳像。
這體現(xiàn)了 Java 的設(shè)計(jì)哲學(xué):沒(méi)有完善錯(cuò)誤處理的代碼根本沒(méi)有機(jī)會(huì)被執(zhí)行荆烈。對(duì) Checked 異常處理方法有兩種:
1 當(dāng)前方法知道如何處理該異常,則用 try...catch 塊來(lái)處理該異常竟趾。
2 當(dāng)前方法不知道如何處理憔购,則在定義該方法是聲明拋出該異常。
運(yùn)行時(shí)異常只有當(dāng)代碼在運(yùn)行時(shí)才發(fā)行的異常岔帽,編譯時(shí)不需要 try catch倦始。Runtime 如除數(shù)是 0和數(shù)組下標(biāo)越界等,其產(chǎn)生頻繁山卦,處理麻煩,若顯示申明或者捕獲將會(huì)對(duì)程序的可讀性和運(yùn)行效率影響很大诵次。所以由系統(tǒng)自動(dòng)檢測(cè)并將它們交給缺省的異常處理程序账蓉。當(dāng)然如果你有處理要求也可以顯示捕獲它們
2. Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?
靠的是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對(duì)象逾一。程序調(diào)用的方法是在運(yùn)行期才動(dòng)態(tài)綁定铸本,就是引用變量所指向的具體實(shí)例對(duì)象的方法,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法遵堵,而不是引用變
量的類型中定義的方法箱玷。
1. 面向?qū)ο?【2018.1.29】
面向?qū)ο笫且环N思想,是基于面向過(guò)程而言的陌宿,是將功能通過(guò)對(duì)象來(lái)實(shí)現(xiàn)锡足,將功能封裝進(jìn)對(duì)象之中,讓對(duì)象去實(shí)現(xiàn)具體的細(xì)節(jié)壳坪。
面向?qū)ο蟮暮锰幨牵?/strong>
1:將復(fù)雜的事情簡(jiǎn)單化舶得。
2:面向?qū)ο髮⒁郧暗倪^(guò)程中的執(zhí)行者,變成了指揮者爽蝴。
3:面向?qū)ο筮@種思想是符合現(xiàn)在人們思考習(xí)慣的一種思想沐批。
面向?qū)ο蟮娜筇匦裕?/strong>
1.封裝:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié)纫骑,僅對(duì)外提供公共訪問(wèn)方式
好處:將變化隔離、便于使用九孩、提高復(fù)用性先馆、提高安全性
原則:將不需要對(duì)外提供的內(nèi)容隱藏起來(lái);把屬性隱藏躺彬,提供公共方法對(duì)其訪問(wèn)
2.繼承:提高代碼復(fù)用性煤墙;繼承是多態(tài)的前提
注:
①子類中所有的構(gòu)造函數(shù)都會(huì)默認(rèn)訪問(wèn)父類中的空參數(shù)的構(gòu)造函數(shù),默認(rèn)第一行有super()顾患;若無(wú)空參數(shù)構(gòu)造函數(shù)番捂,子類中需指定;另外江解,子類構(gòu)造函數(shù)中可自己用this指定自身的其他構(gòu)造函數(shù)设预。
3.多態(tài):是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對(duì)象
好處:提高了程序的擴(kuò)展性
弊端:當(dāng)父類引用指向子類對(duì)象時(shí),雖提高了擴(kuò)展性犁河,但只能訪問(wèn)父類中具備的方法鳖枕,不可訪問(wèn)子類中的方法;即訪問(wèn)的局限性桨螺。
前提:實(shí)現(xiàn)或繼承關(guān)系宾符;覆寫(xiě)父類方法。