更新時間:2019-07-23 09:48:17 來源:動力節(jié)點 瀏覽3320次
今天我們進入《Java基礎(chǔ)面試題及答案》專題,小編整合了近年各大廠的面試中的常見問題和知識點,我們的最終目標(biāo)就是大廠:
1、如果A和B對象循環(huán)引用,是否可以被GC?
回答:可以,現(xiàn)在的虛擬機基本都是通過可達性分析算法來判斷對象是否存活的,而不是通過簡單的引用計數(shù)法來判斷對象是否存活。可達性分析算法使用一系列的“GCRoots”對象(虛擬機棧中引用的對象、靜態(tài)屬性引用對象)作為起始點,這些節(jié)點向下搜索的路徑稱為引用鏈,當(dāng)一個對象到GCRoots沒有任何引用鏈連接,則證明對象是不可用的。
2、Java中的內(nèi)存溢出是如何造成的?
OutOfMemoryError:
(1)PerGernSpace程序中使用了大量jar或class,使Java虛擬機裝載類空間不夠。
解決方案:調(diào)參XX:PermSize和XX:MaxPermSize、減少jar包,減少類的重復(fù)加載
(2)JavaHeapSpaceJava虛擬機創(chuàng)建了太多的對象。
解決方案:調(diào)參Xms(初始堆大小)Xmx(最大堆大小)、檢查死循環(huán)或不必要創(chuàng)建的重復(fù)對象
(3)unabletocreatenewnativeThreadJVM占用了太多內(nèi)存空間,而在JVM中創(chuàng)建線程還要再操作系統(tǒng)中也創(chuàng)建線程。
解決方案:調(diào)整JVM中線程大小。
3、Error、Exception和RuntimeException的區(qū)別,作用又是什么?
Error和Exception都是Throwable的子類,RuntimeException是Exception的子類。
Error用于指示合理應(yīng)用程序不應(yīng)該試圖捕獲的錯誤。
Exception指出合理的應(yīng)用程序需要捕獲的條件。分為已檢查異常和未檢查異常。
RuntimeException是未檢查異常,不需要trycatch或在方法上聲明,主要子類:NullPointer、Arithmatic、ArrayIndexOutOfBounds、ClassCast。
4、Reader和InputStream區(qū)別?
都是抽象類,Reader用于讀取字符流(char或String),InputStream用于讀取字節(jié)流(byte數(shù)組)。
5、hashCode的作用?
hashCode主要是用于快速查找,如HashMap結(jié)構(gòu)中,用于定位鍵值對的位置。兩個對象相同,則hashCode一定相同,而hashCode相同的對象則不一定相同,就相當(dāng)于放在同一個框里。
6、HashMap和Hashtable的區(qū)別?
線程安全性、null值的key、效率、HashMap(Iterator快速失敗迭代器)、Hashtable(enumerator迭代器)、時間推移HashMap元素位置會變
7、HashMap中是否任何對象都可以做為key,用戶自定義對象做為key有沒有什么要求?
可以、但是要key對象必須是不可變的對象,不然在Entry被插入Map中后,再改變key值,會導(dǎo)致當(dāng)前key值與hash值不符合,即與數(shù)組索引不符,將無法被查找到。
8、啟動一個線程是用run()還是start()?
多線程有幾種實現(xiàn)同步和并發(fā)是如何解決的什么叫守護線程,用什么方法實現(xiàn)守護線程(Thread.setDeamon()的含義)如何停止一個線程?解釋是一下什么是線程安全?舉例說明一個線程不安全的例子。解釋Synchronized關(guān)鍵字的作用。當(dāng)一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
(1)start
(2)繼承Thread類、實現(xiàn)Runnable接口、使用ExectuorService、Future、Callable實現(xiàn)由返回值的線程。
(3)同步方法、同步代碼塊、鎖
(4)Damon線程、為其他線程的運行提供服務(wù),如GC,Thread。setDeamon(true)。
(5)Thread.stop()不推薦(不會正確釋放資源)、使用中斷來停止線程。
(6)當(dāng)多個線程訪問一個對象時,如果不用考慮這些線程在運行時環(huán)境下的調(diào)度和交替執(zhí)行,也不需要進行額外的同步,或者在調(diào)用方進行任何其他的協(xié)調(diào)操作,調(diào)用這個對象的行為都可以獲得正確的結(jié)果,那這個對象是線程安全的。
(7)車票被重復(fù)賣出。
(8)同步關(guān)鍵詞。修飾靜態(tài)方法,則以類作為鎖對象,同時只能有一個線程訪問此類同步的靜態(tài)方法;修飾普通方法,則以此對象作為鎖對象,同時只能有一個線程訪問此類同步的普通方法;也可以自定義鎖對象同步代碼塊。
(9)synchronized方法不可以進入,非synchronized可以進入。
9、了解過哪些JDK8的新特性,舉例描述下相應(yīng)的特性?
(1)lambda表達式:函數(shù)式編程,方法引用
(2)StreamAPI
(3)接口的默認方法
(4)日期時間API的改進,新增DateTimeFormatter方法
10、對sql進行優(yōu)化的原則有哪些?
詳情見我數(shù)據(jù)庫分類的的一篇博客
11、Servlet的生命周期,Serlvet與CGI的區(qū)別?
生命周期:類加載、實例化(構(gòu)造對象),初始化(init),服務(wù)(service),銷毀(destroy)。
CGI:commongatewayinterface,通用網(wǎng)關(guān)接口,Perl語言編寫,每個請求創(chuàng)建一個CGI對象。
Servlet:只需要實例化、初始化一次,多線程。
12、StringBuffer有什么優(yōu)勢?為什么快?
因為StringBuffer不需要重復(fù)創(chuàng)建String對象,但是其實也不是這樣。
比如Strings="a"+"b"+"c"操作編譯器會優(yōu)化,變成Strings="abc"
Strings=s1+s2+s3編譯器也會優(yōu)化,變成StringBuilder的append操作,但是如果不是一次性+操作拼接完,就會反復(fù)生成String對象與StringBuilder對象,效率會很低。
13、加密解密算法了解嗎?
摘要算法:MD5(128位)、SHA1(160位),是一種不可逆的過程,無論多大的數(shù)據(jù),經(jīng)過摘要算法后都生成相同長度的數(shù)據(jù)。只能通過字典進行破解。
對稱加密算法:DES、AES,加密解密時使用相同的秘鑰。
非對稱加密算法:RSA,加密解密時使用不同的秘鑰,對接支付寶使用RSA2。
14、解決高并發(fā)與高負載?
(1)靜態(tài)頁面消耗最小,盡可能的HTML靜態(tài)化,采用信息發(fā)布系統(tǒng)CMS實現(xiàn)信息錄入自動生成靜態(tài)頁面、在前端緩存不經(jīng)常改變的動態(tài)數(shù)據(jù)。
(2)CDN,把CSS/JS等資源分布在不同的服務(wù)器上。
(3)負載均衡(Nginx)。
(4)緩存不常改變的數(shù)據(jù)(Redis、memcache)。
(5)圖片服務(wù)器與應(yīng)用服務(wù)器分離。
(6)集群。
15、Integer內(nèi)部緩存?
Integer類內(nèi)部有一個staitic的Integer數(shù)組,存儲的是一些已經(jīng)完成初始化的Integer對象,一般值為(-128~127),若用==比較,則有時候會因為值不在緩存中而返回false,所以應(yīng)該用equals比較。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743