題目來自http://www.codeceo.com/article/201-java-interview-qa.html,答案自己網上找的,如有疏漏,歡迎斧正。一起學習,共同進步。
一.Java基礎
1. String類為什么是final的。
2. HashMap的源碼,實現原理,底層結構。
3. 說說你知道的幾個Java集合類:list、set、queue、map實現類咯。
4. 描述一下ArrayList和LinkedList各自實現和區別。
5. Java中的隊列都有哪些,有什么區別。
6. 反射中,Class.forName和classloader的區別。
7. Java7、Java8的新特性(baidu問的,好BT)。
8. Java數組和鏈表兩種結構的操作效率,在哪些情況下(從開頭開始,從結尾開始,從中間開始),哪些操作(插入,查找,刪除)的效率高。
9. Java內存泄露的問題調查定位:jmap,jstack的使用等等。
10. string、stringbuilder、stringbuffer區別。
11. hashtable和hashmap的區別。
13.異常的結構,運行時異常和非運行時異常,各舉個例子。
14.String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他們之間用 == 比較的結果。
15. String 類的常用方法。
16. Java 的引用類型有哪幾種。
17. 抽象類和接口的區別?
接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認為public abstract類型,接口中的成員變量類型默認為public static final。另外,接口和抽象類在方法上有區別:
(1) 抽象類可以有構造方法,接口中不能有構造方法。
(2) 抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。Java 8里的接口可以有default方法。
(3) 抽象類中可以有普通成員變量,接口中沒有普通成員變量。
(4) 抽象類中的抽象方法的訪問類型可以是public,protected和默認類型。
(5) 抽象類中可以包含靜態方法,接口中不能包含靜態方法。
(6) 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,並且默認即為public static final類型。
(7) 一個類可以實現多個接口,但只能繼承一個抽象類。二者在應用方面也有一定的區別:接口更多的是在系統架構設計方法發揮作用,主要用於定義模塊之間的通信契約。而抽象類在代碼實現方面發揮作用,可以實現代碼的重用,例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的所有Servlet類都要用相同的方式進行權限判斷、記錄訪問日志和處理異常,那么就可以定義一個抽象的基類,讓所有的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日志和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼。
18. java的基礎類型和字節大小。
Java基本類型共有八種,基本類型可以分為三類,字符類型char,布爾類型boolean以及數值類型byte、short、int、long、float、double。數值類型又可以分為整數類型byte、short、int、long和浮點數類型float、double。JAVA中的數值類型不存在無符號的,它們的取值范圍是固定的,不會隨着機器硬件環境或者操作系統的改變而改變。實際上,JAVA中還存在另外一種基本類型void,它也有對應的包裝類 java.lang.Void,不過我們無法直接對它們進行操作。8 中類型表示范圍如下:
byte:8位,最大存儲數據量是255,存放的數據范圍是-128~127之間。
short:16位,最大數據存儲量是65536,數據范圍是-32768~32767之間。
int:32位,最大數據存儲容量是2的32次方減1,數據范圍是負的2的31次方到正的2的31次方減1。
long:64位,最大數據存儲容量是2的64次方減1,數據范圍為負的2的63次方到正的2的63次方減1。
float:32位,數據范圍在3.4e-45~1.4e38,直接賦值時必須在數字后加上f或F。
double:64位,數據范圍在4.9e-324~1.8e308,賦值時可以加d或D也可以不加。
boolean:只有true和false兩個取值。
char:16位,存儲Unicode碼,用單引號賦值。
Java決定了每種簡單類型的大小。這些大小並不隨着機器結構的變化而變化。這種大小的不可更改正是Java程序具有很強移植能力的原因之一。下表列出了Java中定義的簡單類型、占用二進制位數及對應的封裝器類。
19. Hashtable,HashMap,ConcurrentHashMap底層實現原理與線程安全問題?
可參考的文章:Hashmap實現原理淺析:http://www.cnblogs.com/lzrabbit/p/3721067.html
ConcurrentHashMap原理分析:http://www.cnblogs.com/ITtangtang/p/3948786.html
20.如果不讓你用Java Jdk提供的工具,你自己實現一個Map,你怎么做。說了好久,說了HashMap源代碼,如果我做,就會借鑒HashMap的原理,說了一通HashMap實現。
21.Hash沖突怎么辦?哪些解決散列沖突的方法?
22.HashMap沖突很厲害,最差性能,你會怎么解決? 從O(n)提升到log(n),用二叉排序樹的思路說了一通。
23.rehash。
24.hashCode() 與 equals() 生成算法、方法怎么重寫。
二.Java IO
1.講講IO里面的常見類,字節流、字符流、接口、實現類、方法阻塞。
2.講講NIO。
3.String 編碼UTF-8 和GBK的區別?
4.什么時候使用字節流、什么時候使用字符流?
5.遞歸讀取文件夾下的文件,代碼怎么實現。
三.Java Web
1.session和cookie的區別和聯系,session的生命周期,多個服務部署時session管理。
2.servlet的一些相關問題。
3.webservice相關問題。
4.jdbc連接,forName方式的步驟,怎么聲明使用一個事務。舉例並具體代碼。
參考文章:http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html
5.無框架下配置web.xml的主要配置內容。
web.xml配置詳解1: https://my.oschina.net/u/1383439/blog/224448
web.xml配置詳解2: http://www.cnblogs.com/chinafine/archive/2010/09/02/1815980.html
6.jsp和servlet的區別。
(1) jsp經編譯后就變成了Servlet.(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的代碼, Web容器將JSP的代碼編譯成JVM能夠識別的java類)
(2) jsp更擅長表現於頁面顯示, servlet更擅長於邏輯控制.
(3) Servlet中沒有內置對象,Jsp中的內置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到.
Jsp是Servlet的一種簡化,使用Jsp只需要完成程序員需要輸出到客戶端的內容,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成。而Servlet則是個完整的Java類,這個類的Service方法用於生成對客戶端的響應。
四.JVM
1.Java的內存模型以及GC算法。
參考答案:http://blog.csdn.net/kingofworld/article/details/17718587
2.jvm性能調優都做了什么。
JVM性能調優: http://www.cnblogs.com/chen77716/archive/2010/06/26/2130807.html
深入理解JVM性能調優: http://www.open-open.com/lib/view/open1334729637702.html
3.介紹JVM中7個區域,然后把每個區域可能造成內存的溢出的情況說明。
深入理解JVM之內存區域與內存溢出: http://www.codeceo.com/article/jvm-memory-overflow.html
4.介紹GC 和GC Root不正常引用。
沒有找到很好的答案,只找到了關於GC Root的介紹:http://blog.csdn.net/fenglibing/article/details/8928927
5.自己從classload加載方式,加載機制說開去,從程序運行時數據區,講到內存分配,講到String常量池,講到JVM垃圾回收機制,算法,hotspot。反正就是各種擴展。
6.jvm 如何分配直接內存, new 對象如何不分配在堆而是棧上,常量池解析.
(2) JAVA NEW關鍵字分配的對象只能在堆上。
7.數組多大放在 JVM 老年代。(不只是設置 PretenureSizeThreshold ,問通常多大,沒做過一問便知)
大對象直接進入老年代: http://book.51cto.com/art/201107/278927.htm
Java整型數組的最大長度到底有多長: http://blog.csdn.net/mayumin/article/details/5904974
8.老年代中數組的訪問方式
JVM的內存分配及運行機制: http://www.cnblogs.com/200911/p/3922704.html
沒有被GC回收,在不在老年代都通過數組引用訪問.
9.GC算法,永久代對象如何GC,GC有環怎么處理。
1) Java的GC機制及算法: http://blog.chinaunix.net/uid-7374279-id-4489100.html
Java GC基本算法: http://www.blogjava.net/showsun/archive/2011/07/21/354745.html
2) Java內存區域和GC機制: http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html
永久代的回收有兩種:常量池中的常量,無用的類信息,常量的回收很簡單,沒有引用了就可以被回收。對於無用的類進行回收,必須保證3點:
(1) 類的所有實例都已經被回收;
(2) 加載類的ClassLoader已經被回收;
(3) 類對象的Class對象沒有被引用(即沒有通過反射引用該類的地方).3) 基於引用對象遍歷的垃圾回收器可以處理循環引用,只要是涉及到的對象不能從GC Roots強引用可到達,垃圾回收器都會進行清理來釋放內存。
10.誰會被GC,什么時候 GC。
(1) 超出了作用域或引用計數為空的對象;從gc root開始搜索找不到的對象,而且經過一次標記、清理,仍然沒有復活的對象。
(2) 程序員不能具體控制時間,系統在不可預測的時間調用System.gc()函數的時候;當然可以通過調優,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制進入oldObject的次數,使得oldObject 存儲空間延遲達到full gc,從而使得計時器引發gc時間延遲OOM的時間延遲,以延長對象生存期。
11.如果想不被GC怎么辦。
只要存在某對象的強引用,就不會被GC回收.
12.如果想在GC中生存1次怎么辦。
想在對象生命周期中至少被GC一次后存活,最簡單的方法是重寫Object的finalize()。
五.開源框架
1.Hibernate和ibatis的區別.
參考答案:http://www.cnblogs.com/mingyongcheng/p/3588100.html
2.講講mybatis的連接池。
《深入理解mybatis原理》Mybatis數據源與連接池: http://blog.csdn.net/luanlouis/article/details/37671851
3.Spring框架中需要引用哪些jar包,以及這些jar包的用途.
Spring—jar包詳解: http://www.cnblogs.com/yanjunwu/archive/2013/04/06/3001927.html
4.SpringMVC的原理.
(1) SpringMVC 的工作原理: http://www.cnblogs.com/zbf1214/p/5265117.html
(2) Spring框架和MVC原理: http://www.cnblogs.com/jingmoxukong/p/4506493.html
5.SpringMVC注解的意思.
SpringMVC常用的注解和含義: http://blog.csdn.net/dandandeshangni/article/details/47974461
6.Spring中beanFactory和ApplicationContext的聯系和區別.
BeanFactory 和 ApplicationContext 的區別: http://www.cnblogs.com/lihuiyy/archive/2012/05/22/2512712.html
Spring中ApplicationContext和beanfactory區別: http://blog.csdn.net/hi_kevin/article/details/7325554
7.Spring注入的幾種方式(循環注入).
Spring四種依賴注入方式: http://blessht.iteye.com/blog/1162131
(1)Set注入;
(2)構造器注入;
(3)靜態工廠的方法注入;
(4)實例工廠的方法注入.
8.Spring如何實現事物管理的.
Spring事務管理: http://www.cnblogs.com/newsouls/p/3988216.html
9.SpringIOC.
談談對Spring IOC的理解: http://www.cnblogs.com/xdp-gacl/p/4249939.html
10.Spring AOP的原理.
(1) 代理類的生成與載入;
(2) 攔截鏈的理解與闡述.
Spring的AOP原理: https://my.oschina.net/elain/blog/382494
11.Hibernate中的1級和2級緩存的使用方式以及區別原理(Lazy-Load的理解).
Hibernate緩存:一級緩存和二級緩存: http://www.cnblogs.com/200911/archive/2012/10/09/2716873.html
1)延遲加載 : 當程序執行getter方法獲取時,才發送sql語句加載數據.
延遲加載給程序帶來好處,但是要避免session過早關閉問題.
(1)load()和get()兩個方法區別:
load()采用延遲加載機制,返回的是一個proxy代理對象
get()沒有采用延遲加載,返回的是一個對象實例
(2)Hibernate.initialize(user): 可以強制user對象實例化
(3)hbm映射描述文件中,<class>,<property>,<set>等元素, 都可以使用lazy屬性,默認lazy="true",啟用延遲加載.
2)緩存機制
Hibernate每次查詢先去緩存中查找,沒有才去數據庫查詢.
(1)一級緩存:
Session級別的緩存,緩存load,get出來的單個對象.默認開啟.
使用同一個Session對象多次查詢同一個User對象,只會發送一次SQL取數據庫獲取.
(2)二級緩存
SessionFactory級別的緩存.默認情況是關閉.
①首先在hibernate.cfg.xml中指定EhCache緩存策略.
②在src下添加ehcache.xml配置文件.
③在User.hbm.xml中添加<cache/>定義.
<cache usage="read-only"/>,如果涉及更新,使用read-write.
12.Hibernate的原理體系架構,五大核心接口,Hibernate對象的三種狀態轉換,事務管理。
參考答案: http://blog.csdn.net/martinmateng/article/details/50879436
Hibernate的工作原理和體系結構: http://hong0104.iteye.com/blog/760813
Hibernate事務管理: http://xmllong.iteye.com/blog/1436769
六.網絡通信
1.Http是無狀態通信,http的請求方式有哪些,可以自己定義新的請求方式么。
2.Socket通信,以及長連接,分包,連接異常斷開的處理。
Socket通信原理簡介: http://www.jianshu.com/p/90348ef3f41e
Socket通信原理探討: http://www.cnblogs.com/fuchongjundream/p/3914696.html
3.Socket通信模型的使用,AIO和NIO。
也談BIO | NIO | AIO: https://my.oschina.net/bluesky0leon/blog/132361
4.Socket框架netty的使用,以及NIO的實現原理,為什么是異步非阻塞。
Netty原理和使用: http://www.jdon.com/concurrent/netty.html
5.同步和異步,阻塞和非阻塞。
同步與異步的概念: http://blog.chinaunix.net/uid-21411227-id-1826898.html
Socket阻塞與非阻塞,同步與異步、I/O模型: http://blog.csdn.net/hguisu/article/details/7453390
6.OSI七層模型,包括TCP,IP的一些基本知識.
TCP IP基礎知識的復習: http://www.cnblogs.com/rollenholt/archive/2012/04/25/2469592.html
7.Http中,get post的區別.
GET和POST有什么區別: http://www.cnblogs.com/nankezhishi/archive/2012/06/09/getandpost.html
8.說說http,tcp,udp之間關系和區別。
TCP、UDP和HTTP詳解: http://blog.sina.com.cn/s/blog_bf9843bf0101j5w8.html
HTTP TCP UDP Socket關系的幾個經典圖: http://www.cnblogs.com/ghj1976/p/4295346.html
9.說說瀏覽器訪問www.taobao.com,經歷了怎樣的過程。
首先是查找瀏覽器緩存,瀏覽器會保存一段時間你之前訪問過的一些網址的DNS信息,不同瀏覽器保存的時常不等。
如果沒有找到對應的記錄,這個時候瀏覽器會嘗試調用系統緩存來繼續查找這個網址的對應DNS信息。
如果還是沒找到對應的IP,那么接着會發送一個請求到路由器上,然后路由器在自己的路由器緩存上查找記錄,路由器一般也存有DNS信息。
如果還是沒有,這個請求就會被發送到ISP(注:Internet Service Provider,互聯網服務提供商,就是那些拉網線到你家里的運營商,中國電信中國移動什么的),ISP也會有相應的ISP DNS服務器,一聽中國電信就知道這個DNS服務器的規模肯定不會小,所以基本上都能在這里找得到。題外話:會跑到這里進行查詢是因為你沒有改動過"網絡中心"的"ipv4"的DNS地址,萬惡的電信聯通可以改動了這個DNS服務器,換句話說他們可以讓你的瀏覽器跳轉到他們設定的頁面上,這也就是人盡皆知的DNS和HTTP劫持,ISP們還美名曰“免費推送服務”。強烈鄙視這種霸王行為。我們也可以自行修改DNS服務器來防止DNS被ISP污染。
如果還是沒有的話, 你的ISP的DNS服務器會將請求發向根域名服務器進行搜索。根域名服務器就是面向全球的頂級DNS服務器,共有13台邏輯上的服務器,從A到M命名,真正的實體服務器則有幾百台,分布於全球各大洲。所以這些服務器有真正完整的DNS數據庫。如果到了這里還是找不到域名的對應信息,那只能說明一個問題:這個域名本來就不存在,它沒有在網上正式注冊過。或者賣域名的把它回收掉了(通常是因為欠費)。
這也就是為什么打開一個新頁面會有點慢,因為本地沒什么緩存,要這樣遞歸地查詢下去。
多說一句,例如"mp3.baidu.com",域名先是解析出這是個.com的域名,然后跑到管理.com域名的服務器上進行進一步查詢,然后是.baidu,最后是mp3,
所以域名結構為:三級域名.二級域名.一級域名。
瀏覽器終於得到了IP以后,瀏覽器接着給這個IP的服務器發送了一個http請求,方式為get,例如訪問nbut.cn
這個get請求包含了主機(host)、用戶代理(User-Agent),用戶代理就是自己的瀏覽器,它是你的"代理人",Connection(連接屬性)中的keep-alive表示瀏覽器告訴對方服務器在傳輸完現在請求的內容后不要斷開連接,不斷開的話下次繼續連接速度就很快了。其他的顧名思義就行了。還有一個重點是Cookies,Cookies保存了用戶的登陸信息,在每次向服務器發送請求的時候會重復發送給服務器。Corome上的F12與Firefox上的firebug(快捷鍵shift+F5)均可查看這些信息。
發送完請求接下來就是等待回應了,如下圖:
當然了,服務器收到瀏覽器的請求以后(其實是WEB服務器接收到了這個請求,WEB服務器有iis、apache等),它會解析這個請求(讀請求頭),然后生成一個響應頭和具體響應內容。接着服務器會傳回來一個響應頭和一個響應,響應頭告訴了瀏覽器一些必要的信息,例如重要的Status Code,2開頭如200表示一切正常,3開頭表示重定向,4開頭,如404,呵呵。響應就是具體的頁面編碼,就是那個<html>......</html>,瀏覽器先讀了關於這個響應的說明書(響應頭),然后開始解析這個響應並在頁面上顯示出來。在下一次CF的時候(不是穿越火線,是http://codeforces.com/),由於經常難以承受幾千人的同時訪問,所以CF頁面經常會出現崩潰頁面,到時候可以點開火狐的firebug或是Chrome的F12看看狀態,不過這時候一般都急着看題和提交代碼,似乎根本就沒心情理會這個狀態吧。
如果是個靜態頁面,那么基本上到這一步就沒了,但是如今的網站幾乎沒有靜態的了吧,基本全是動態的。所以這時候事情還沒完,根據我們的經驗,瀏覽器打開一個網址的時候會慢慢加載這個頁面,一部分一部分的顯示,直到完全顯示,最后標簽欄上的圈圈就不轉了。
這是因為,主頁(index)頁面框架傳送過來以后,瀏覽器還要繼續向服務器發送請求,請求的內容是主頁里面包含的一些資源,如圖片,視頻,css樣式等等。這些"非靜態"的東西要一點點地請求過來,所以標簽欄轉啊轉,內容刷啊刷,最后全部請求並加載好了就終於好了。
需要說明的是,對於靜態的頁面內容,瀏覽器通常會進行緩存,而對於動態的內容,瀏覽器通常不會進行緩存。緩存的內容通常也不會保存很久,因為難保網站不會被改動。
10.HTTP協議、 HTTPS協議,SSL協議及完整交互過程.
HTTPS協議, SSL協議及完整交互過程: http://blog.csdn.net/dfsaggsd/article/details/50910999
HTTP協議詳解: http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html
11.Tcp的擁塞,快回傳,ip的報文丟棄.
TCP的擁塞控制: http://blog.csdn.net/sicofield/article/details/9708383
IP報文頭詳解以及定義: http://www.cnblogs.com/xsiedu/articles/1741584.html
12.Https處理的一個過程,對稱加密和非對稱加密.
對稱加密與非對稱加密: http://www.cnblogs.com/jfzhu/p/4020928.html
SSH加密原理、RSA非對稱加密算法學習與理解: https://my.oschina.net/realfighter/blog/388486
13.Head各個特點和區別.




