【Java】基礎(chǔ)面試題

標(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)方式:

  1. 同步方法瑟枫《犯悖可以是靜態(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)方法相互制約狞山。
  2. 同步塊。鎖定一個(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ū)別為:

  1. 數(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)直接存取。
  2. 鏈表動(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有什么差異?

  1. 同步性:Vector是線程安全的(同步)耀找,而ArrayList是線程不安全的
  2. 擴(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ū)別是:

  1. HashMap沒(méi)有排序素挽,允許一個(gè)null鍵和多個(gè)null值,而Hashtable不允許
  2. HashMap把Hashtable的contains方法去掉了狸驳,改成containsvalue和containsKey,因?yàn)閏ontains方法容易引起誤解
  3. Hashtable繼承自Dictionary類预明,HashMap是java1.2引進(jìn)的Map接口的實(shí)現(xiàn)
  4. Hashtable的方法是Synchronize的,而HashMap不是耙箍,在多個(gè)線程訪問(wèn)Hashtable時(shí)撰糠,不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必須為之提供外同步辩昆。Hashtable和HashMap采用hash阅酪、rehash算法大致一樣,所以性能不會(huì)有很大的差異汁针。

49. HashMap是如何設(shè)計(jì)的术辐?是如何解決沖突的?【2018.3.27】

  1. 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)成了鏈表
  2. 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ù)組中的該位置上廷臼。
  3. HashMap的讀取。從HashMap中g(shù)et元素時(shí)绝页,首先計(jì)算key的HashCode荠商,找到數(shù)組中對(duì)應(yīng)位置的某一元素,然后通過(guò)key的equals方法在對(duì)應(yīng)位置的鏈表中找到需要的元素
  4. 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)系圖

集合關(guān)系圖.png

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ū)別:

  1. 運(yùn)行時(shí)異常(RuntimeException)又稱為非檢查異常(Unchecked Exception), 非運(yùn)行時(shí)異常指的是檢查異常(Checked Exception)昂灵。
  2. 運(yùn)行時(shí)異常直接或間接的繼承RuntimeException的異常。非運(yùn)行時(shí)異常是除了運(yùn)行時(shí)異常以外的其他異常舞萄。
  3. 運(yùn)行時(shí)異常不需要捕獲眨补,非運(yùn)行時(shí)異常需要通過(guò)try-catch或throws進(jìn)行處理

常見(jiàn)異常:

  1. RuntimeException
    1. NullPointerException:空指針異常,操作空引用時(shí)引發(fā)
    2. ClassCastException:類型轉(zhuǎn)換異常倒脓,強(qiáng)制類型轉(zhuǎn)換不匹配時(shí)引發(fā)
    3. ArrayIndexOutOfBoundsException:角標(biāo)越界異常撑螺,使用一個(gè)不存在的數(shù)組下標(biāo)時(shí)引發(fā)
  2. 非RuntimeException
    1. SQLException:提供關(guān)于數(shù)據(jù)庫(kù)訪問(wèn)出錯(cuò)的異常
    2. IOException:當(dāng)發(fā)生某種I/O異常時(shí),拋出此異常
    3. ClassNotFoundException:當(dāng)應(yīng)用試圖使用Class類中的forName方法崎弃、loadClass方法時(shí)甘晤,拋出該異常

42. 在java中如何引發(fā)異常?如何處理饲做?

在java中线婚,可以通過(guò)throw關(guān)鍵字來(lái)引發(fā)異常。

處理異常:

  1. 使用try-catch捕獲異常
  2. 使用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.
包裝類的主要用途:

  1. 作為和基本數(shù)據(jù)類型對(duì)應(yīng)的類類型存在,方便涉及到對(duì)象的操作
  2. 包含每種基本數(shù)據(jù)類型的相關(guān)屬性如最大值卷中,最小值等矛双,以及相關(guān)的操作方法。

37. heap 和 stack 的區(qū)別【2018.3.14】

棧(stack)和堆(heap)都是java用來(lái)在內(nèi)存中存放數(shù)據(jù)的地方蟆豫,二者區(qū)別在于:

  1. 棧存放基本類型變量和對(duì)象引用议忽,當(dāng)超出作用域后釋放;堆存放new出來(lái)的對(duì)象和數(shù)組
  2. 堆可以動(dòng)態(tài)的分配內(nèi)存大小十减,生存期也不必事先告訴編譯器栈幸,java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)愤估。存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性侦镇。棧的存取速度比堆要快灵疮,僅次于直接位于CPU中的寄存器。堆由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存壳繁,存取速度較慢震捣。
  3. 棧數(shù)據(jù)可以共享;堆不可以
  4. 棧是一種線形集合闹炉,其添加和刪除元素的操作應(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】

  1. 類皂冰,實(shí)際上是對(duì)某種類型的對(duì)象定義變量和方法的原型。它標(biāo)識(shí)對(duì)象是生活中一類具有共同特征的事物的抽象养篓。
  2. 包秃流,為了更好的組織類,java提供了包機(jī)制柳弄。包是類的容器舶胀,用于分隔類名空間。
  3. 類庫(kù)碧注,是用來(lái)實(shí)現(xiàn)各種功能的類的集合嚣伐。
  4. 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)有具體方法體的方法。抽象方法一般存在于抽象或接口中假抄。

答案:

  1. 接口可以繼承接口 extands
  2. 抽象類可以實(shí)現(xiàn)接口
  3. 抽象類可以繼承具體類
  4. 抽象類中可以有靜態(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ī)制如下:

  1. 增量收集器
    增量收集器把堆棧分為多個(gè)域,每次僅從一個(gè)域回收垃圾捧书。這會(huì)造成較小的應(yīng)用程序中斷吹泡。
  2. 分代收集器
    這種收集器把堆棧分為兩個(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ì)象鸥跟。

  1. 修飾成員變量。用static修飾的成員變量不屬于對(duì)象的數(shù)據(jù)結(jié)構(gòu)盔沫;static變量是屬于類的變量医咨,通常可以通過(guò)類名來(lái)引用static成員架诞;static成員變量和類的信息一起存儲(chǔ)在方法區(qū)拟淮,而不是在堆中,一個(gè)類的static成員變量只有“一份”谴忧,無(wú)論該類創(chuàng)建了多少對(duì)象很泊。
  2. 修飾成員方法。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方法的作用在于提供一些“工具方法”和“工廠方法”等。
  3. 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】

  1. 插入排序(直接插入排序曲稼、希爾排序)
  2. 交換排序(冒泡排序、快速排序)
  3. 選擇排序(直接選擇排序湖员、堆排序)
  4. 歸并排序
  5. 分配排序(箱排序贫悄、基數(shù)排序)

19. 簡(jiǎn)單說(shuō)下什么是遞歸?什么情況會(huì)使用娘摔?

  1. 遞歸作為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用窄坦,是指函數(shù)在運(yùn)行過(guò)程中直接或間接調(diào)用自身而產(chǎn)生的重入現(xiàn)象
  2. 遞歸算法一般用于解決三類問(wèn)題:
    1. 數(shù)據(jù)的定義是按遞歸定義的(斐波那契函數(shù))
    2. 問(wèn)題解法按遞歸算法實(shí)現(xiàn)(回溯)
    3. 數(shù)據(jù)的結(jié)構(gòu)形式是按遞歸定義的(樹(shù)的遍歷,圖的搜索)

18. 列出自己常用的jdk包 【2018.2.23】

常用的jdk包如下:

  1. java.lang:這個(gè)包中包含了JDK提供的基礎(chǔ)類凳寺,如String等都是這里面的鸭津,這個(gè)包是唯一一個(gè)可以不用導(dǎo)入就可以使用的包
  2. java.io:這個(gè)包中包含了與輸入輸出相關(guān)的類,如文件操作等
  3. java.net:這個(gè)包中包含了與網(wǎng)絡(luò)有關(guān)的類读第,如URL曙博,URLConnection等
  4. java.util:系統(tǒng)輔助類,特別是集合類Collection怜瞒,list父泳,map等
  5. 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】

  1. 垃圾回收(GC)是Java語(yǔ)言的一個(gè)重要特性,作用是釋放不在被使用的內(nèi)存
  2. 垃圾回收由系統(tǒng)進(jìn)行管理奋岁,在系統(tǒng)認(rèn)為需要的時(shí)候自動(dòng)啟動(dòng)一個(gè)線程進(jìn)行處理
  3. 盡量減少垃圾內(nèi)存思瘟,也就是新建對(duì)象的數(shù)量,可以降低垃圾回收的頻率
  4. 垃圾回收無(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ě)父類方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灭翔,一起剝皮案震驚了整個(gè)濱河市魏烫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肝箱,老刑警劉巖哄褒,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異煌张,居然都是意外死亡呐赡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門骏融,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)链嘀,“玉大人,你說(shuō)我怎么就攤上這事档玻』巢矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵窃肠,是天一觀的道長(zhǎng)包个。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么碧囊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任树灶,我火速辦了婚禮,結(jié)果婚禮上糯而,老公的妹妹穿的比我還像新娘天通。我一直安慰自己,他們只是感情好熄驼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布像寒。 她就那樣靜靜地躺著,像睡著了一般瓜贾。 火紅的嫁衣襯著肌膚如雪诺祸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天祭芦,我揣著相機(jī)與錄音筷笨,去河邊找鬼。 笑死龟劲,一個(gè)胖子當(dāng)著我的面吹牛胃夏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昌跌,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仰禀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚕愤?” 一聲冷哼從身側(cè)響起答恶,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萍诱,沒(méi)想到半個(gè)月后亥宿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砂沛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曙求。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍庵。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悟狱,靈堂內(nèi)的尸體忽然破棺而出静浴,到底是詐尸還是另有隱情,我是刑警寧澤挤渐,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布苹享,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏得问。R本人自食惡果不足惜囤攀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宫纬。 院中可真熱鬧焚挠,春花似錦、人聲如沸漓骚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝌蹂。三九已至噩斟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孤个,已是汗流浹背剃允。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硼身,地道東北人硅急。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像佳遂,于是被迫代替她去往敵國(guó)和親营袜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法丑罪,類相關(guān)的語(yǔ)法荚板,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法吩屹,異常的語(yǔ)法跪另,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • 第一階段題庫(kù) 基礎(chǔ)知識(shí)部分: 1. JDK是什么?JRE是什么煤搜? a) 答:JDK:java開(kāi)發(fā)工具包免绿。JRE:j...
    獨(dú)念白閱讀 940評(píng)論 0 3
  • 三十多年前,我第一次睜開(kāi)了眼擦盾。你說(shuō)嘲驾,我當(dāng)時(shí)有一張皺巴巴的臉,哭起來(lái)的樣子還真挺好看迹卢。 過(guò)了有三年辽故,我記住你的臉。你...
    半朽閱讀 537評(píng)論 33 42
  • 天涯星辰閱讀 164評(píng)論 2 1
  • 提高對(duì)生活的掌控力腐碱,很多事情成為"錦上添花"的事誊垢,"雪中送炭"的期待越來(lái)越少,這樣的生活比較容易感受到幸福。
    Ye二姐閱讀 266評(píng)論 0 0