前言
Android面試題Java篇,由本人整理匯總,后續(xù)將繼續(xù)推出系列篇,如果喜歡請持續(xù)關注和推薦。
目錄
- 靜態(tài)內(nèi)部類、內(nèi)部類、匿名內(nèi)部類,為什么內(nèi)部類會持有外部類的引用?持有的引用是this?還是其它?
2.Java 中try catch finally的執(zhí)行順序
3.equals與==的區(qū)別:
4.Object有哪些公用方法?
5.String、StringBuffer與StringBuilder的區(qū)別
6.Java的四種引用的區(qū)別
7.介紹垃圾回收機制
8.你用過哪些集合類
9.說說hashMap是怎樣實現(xiàn)的
10.ArrayList,LinkedList的區(qū)別
11.ArrayList和Vector的主要區(qū)別是什么?
12.HashMap和 HashTable 的區(qū)別:
13.wait()和sleep()的區(qū)別
14TCP三次握手
15.為什么TCP是可靠的,UDP早不可靠的?為什么UDP比TCP快?
16.http協(xié)議了解多少,說說里面的協(xié)議頭部有哪些字段?
17.https了解多少
18.談談 HTTP 中Get 和 Post 方法的區(qū)別
19.推送心跳包是TCP包還是UDP包或者HTTP包
正文
1. 靜態(tài)內(nèi)部類、內(nèi)部類、匿名內(nèi)部類,為什么內(nèi)部類會持有外部類的引用?持有的引用是this?還是其它?
靜態(tài)內(nèi)部類:使用static修飾的內(nèi)部類
內(nèi)部類:就是在某個類的內(nèi)部又定義了一個類,內(nèi)部類所嵌入的類稱為外部類
匿名內(nèi)部類:使用new生成的內(nèi)部類
因為內(nèi)部類的產(chǎn)生依賴于外部類,持有的引用是類名.this
2.Java 中try catch finally的執(zhí)行順序
先執(zhí)行try中代碼,如果發(fā)生異常執(zhí)行catch中代碼,最后一定會執(zhí)行finally中代碼
3.equals與==的區(qū)別:
==是判斷兩個變量或?qū)嵗遣皇侵赶蛲粋€內(nèi)存空間 equals是判斷兩個變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相
4.Object有哪些公用方法?
方法equals測試的是兩個對象是否相等
方法clone進行對象拷貝
方法getClass返回和當前對象相關的Class對象
方法notify,notifyall,wait都是用來對給定對象進行線程同步的
5.String、StringBuffer與StringBuilder的區(qū)別
String 類型和 StringBuffer 類型的主要性能區(qū)別其實在于 String 是不可變的對象 StringBuffer和StringBuilder底層是 char[]數(shù)組實現(xiàn)的 StringBuffer是線程安全的,而StringBuilder是線程不安全的
6.Java的四種引用的區(qū)別
強引用:如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內(nèi)存空間不足,JVM 也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。如果想中斷強引用和某個對象之間的關聯(lián),可以顯式地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象
軟引用:在使用軟引用時,如果內(nèi)存的空間足夠,軟引用就能繼續(xù)被使用,而不會被垃圾回收器回收,只有在內(nèi)存不足時,軟引用才會被垃圾回收器回收。
弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當 JVM 進行垃圾回收,一旦發(fā)現(xiàn)弱引用對象,無論當前內(nèi)存空間是否充足,都會將弱引用回收。不過由于垃圾回收器是一個優(yōu)先級較低的線程,所以并不一定能迅速發(fā)現(xiàn)弱引用對象
虛引用:顧名思義,就是形同虛設,如果一個對象僅持有虛引用,那么它相當于沒有引用,在任何時候都可能被垃圾回收器回收。
7.介紹垃圾回收機制
標記回收法:遍歷對象圖并且記錄可到達的對象,以便刪除不可到達的對象,一般使用單線程工作并且可能產(chǎn)生內(nèi)存碎片
標記-壓縮回收法:前期與第一種方法相同,只是多了一步,將所有的存活對象壓縮到內(nèi)存的一端,這樣內(nèi)存碎片就可以合成一大塊可再利用的內(nèi)存區(qū)域,提高了內(nèi)存利用率
復制回收法:把現(xiàn)有內(nèi)存空間分成兩部分,gc運行時,它把可到達對象復制到另一半空間,再清空正在使用的空間的全部對象。這種方法適用于短生存期的對象,持續(xù)復制長生存期的對象則導致效率降低。
分代回收發(fā):把內(nèi)存空間分為兩個或者多個域,如年輕代和老年代,年輕代的特點是對象會很快被回收,因此在年輕代使用效率比較高的算法。當一個對象經(jīng)過幾次回收后依然存活,對象就會被放入稱為老年的內(nèi)存空間,老年代則采取標記-壓縮算法
8.你用過哪些集合類
數(shù)據(jù)結(jié)構(gòu)中用于存儲數(shù)據(jù)的有哪些
數(shù)組
數(shù)組存儲區(qū)間是連續(xù)的,占用內(nèi)存嚴重,故空間復雜的很大。但數(shù)組的二分查找時間復雜度小,為O(1);數(shù)組的特點是:尋址容易,插入和刪除困難;
鏈表
鏈表存儲區(qū)間離散,占用內(nèi)存比較寬松,故空間復雜度很小,但時間復雜度很大,達O(N)。鏈表的特點是:尋址困難,插入和刪除容易。
9.說說hashMap是怎樣實現(xiàn)的
哈希表:由數(shù)組+鏈表組成的
當我們往HashMap中put元素的時候,先根據(jù)key的hashCode重新計算hash值,根據(jù)hash值得到這個元素在數(shù)組中的位置(即下標),如果數(shù)組該位置上已經(jīng)存放有其他元素了,那么在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果數(shù)組該位置上沒有元素,就直接將該元素放到此數(shù)組中的該位置上。
10.ArrayList,LinkedList的區(qū)別
ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。
對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。
11.ArrayList和Vector的主要區(qū)別是什么?
ArrayList 和Vector底層是采用數(shù)組方式存儲數(shù)據(jù)
Vector:
線程同步
當Vector中的元素超過它的初始大小時,Vector會將它的容量翻倍,
ArrayList:
線程不同步,但性能很好
當ArrayList中的元素超過它的初始大小時,ArrayList只增加50%的大小
12.HashMap和 HashTable 的區(qū)別:
HashTable比較老,是基于Dictionary 類實現(xiàn)的,HashTable 則是基于 Map接口實現(xiàn)的
HashTable 是線程安全的, HashMap 則是線程不安全的
HashMap可以讓你將空值作為一個表的條目的key或value
13.wait()和sleep()的區(qū)別
sleep來自Thread類,和wait來自Object類
調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。而 調(diào)用 wait 方法線程會釋放對象鎖
sleep睡眠后不出讓 系統(tǒng)資源,wait讓出系統(tǒng)資源其他線程可以占用CPU
sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒
14.TCP三次握手
第一次握手:建立連接時,客戶端發(fā)送syn包(syn=j)到服務器,并進入SYN_SEND狀態(tài),等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手。 完成三次握手,客戶端與服務器開始傳送數(shù)據(jù).
15.為什么TCP是可靠的,UDP早不可靠的?為什么UDP比TCP快?
TCP/IP協(xié)議高,因為其擁有三次握手雙向機制,這一機制保證校驗了數(shù)據(jù),保證了他的可靠性。
UDP就沒有了,udp信息發(fā)出后,不驗證是否到達對方,所以不可靠。
但是就速度來說,還是UDP協(xié)議更高,畢竟其無需重復返回驗證,只是一次性的
16.http協(xié)議了解多少,說說里面的協(xié)議頭部有哪些字段?
http(超文本傳輸協(xié)議)是一個基于請求與響應模式的、無狀態(tài)的、應用層的協(xié)議;http請求由三部分組成,分別是:請求行、消息報頭、請求正文。
HTTP消息報頭包括普通報頭、請求報頭、響應報頭、實體報頭
17.https了解多少
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此 加密的詳細內(nèi)容就需要SSL。
18.談談 HTTP 中Get 和 Post 方法的區(qū)別
GET - 從指定的服務器中獲取數(shù)據(jù),明文發(fā)送內(nèi)容
POST - 提交數(shù)據(jù)給指定的服務器處理
(1)POST請求不能被緩存下來
(2)POST請求不會保存在 瀏覽器瀏覽記錄中
(3)以POST請求的URL無法保存為瀏覽器書簽
(4)POST請求沒有長度限制
19.推送心跳包是TCP包還是UDP包或者HTTP包
心跳包的實現(xiàn)是調(diào)用了socket.sendUrgentData(0xFF)這句代碼實現(xiàn)的,所以,當然是TCP包。
總結(jié)
以上就是這篇文章的內(nèi)容了,喜歡的可以關注一下哦,也可以加android學習交流群:1005956838,謝謝!