Java基礎
1.String類爲何是不可變的?爲何是final的?
什麼是不可變:定義一個字符串對象,再新建一個對象賦值給這個字符串,這個賦值過程不是修改原地址的數據,而是指向一個新的對象,這就叫不可變。以下圖:php
JDK源碼裏,String類被final修飾,String類有一個屬性是char類型的數組,說明String類本質上是一個數組,這個數組也被final修飾,因此String類不可變。好處有:html
- 線程安全--String對象不可變,不能被寫入,因此在多線程中修改字符串的值,其餘的引用指向的仍是原來的對象,不會被改變。
- 用於實現StringPool--棧裏面的多個引用能夠指向StringPool裏的同一個字符串,節省了不少堆空間,若是String是可變的,那StringPool就沒有意義了。
- 便於計算哈希值-- 由於String類不可變,因此字符串很適合被hash。String類有一個hashCode()方法用於計算哈希值,在建立字符串的時候哈希值就計算出來並被緩存了,不須要從新計算。這就使得字符串很適合做爲Map中的鍵,處理速度要快過其它的鍵對象。
補充:web
- String類中有個私有實例字段hash,表示該字符串的哈希值。
- hash值的計算過程,是依據被hash的值的特徵計算的,這要求被hash的值必須固定,所以被hash的值必須不可變。
2.HashMap的源碼分析,實現原理,底層結構?
- 底層結構:
HashMap是由數組+鏈表+紅黑樹組成的。數組是主體,存放的是Entry對象(Entry有四個屬性:key、value、hash、next),向數組的某個位置插入一個entry對象的時候,若是發生哈希衝突,就把那個位置的entry對象做爲頭結點,指向要插入的entry對象,造成一個單向鏈表。可是鏈表不擅長查詢,因此鏈表越少,HashMap的性能越好。在JDK1.8裏引入了紅黑樹,當鏈表長度超過8的時候,就轉換成紅黑樹來存儲元素,提升HashMap的性能。redis
實現原理:算法
先用key經過哈希函數計算出一個數組索引,若是索引位置沒有元素就直接放進去,若是有元素,若key相同就直接替換,若key不相同就遍歷索引位置的鏈表,把元素插入鏈表。若是鏈表長度大於8,就轉換成紅黑樹來存儲元素。spring
源碼分析:數據庫
補充:http://www.javashuo.com/article/p-kjwdvdbc-ke.html數組
3.反射中,Class.forName(String name)和ClassLoader的區別?
反射:動態地獲取類的內容,並映射成一個Java對象。瀏覽器
Java中Class.forName(String name)和ClassLoader均可用來對類進行加載,得到字節碼文件。緩存
- Class.forName(String name)將類的字節碼文件加載到JVM中,內部調用的forName()方法裏有一個參數是控制初始化的,是true,因此會初始化,會加載靜態代碼塊。
- ClassLoader只是將字節碼文件加載到JVM中,不會加載靜態代碼塊。只有在用newInstance建立對象的時候纔會加載靜態代碼塊。
數據庫加載驅動使用Class.forName(String name),是由於DriverManager驅動類有靜態代碼塊。
4.session和cookie的區別和聯繫,session的生命週期,多個服務部署時session管理。
Cookie:數據存儲在客戶端,安全性很差,客戶端能夠刪除cookie。若是不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉,cookie信息銷燬,若是設置持久化時間,cookie會被持久化到磁盤文件裏。
Session:數據存儲在服務器端,安全性較好,但當session太多時會佔用部分服務器資源,session須要藉助cookie來存儲JSESSIONID。session默認30分鐘過時,也能夠經過配置更改這個時間。
SOA架構中,單點登陸系統,專門使用一臺服務器來保存session信息,用redis模擬session,用uuid模擬JSESSIONID。
補充:
http://www.javashuo.com/article/p-vxvvyvpm-nx.html
https://my.oschina.net/u/3943244/blog/2992047#h4_9
5.Java中的隊列都有哪些,有什麼區別。
- 雙端隊列Deque:隊列兩端均可以進行入隊出隊操做
- 阻塞隊列BlockingQueue:若是BlockQueue是空的,這時若是有線程要從這個BlockingQueue取元素,將會被阻塞進入等待狀態,直到別的線程在BlockingQueue中添加進了元素,被阻塞的線程纔會被喚醒。一樣,若是BlockingQueue是滿的,試圖往隊列中存放元素的線程也會被阻塞進入等待狀態,直到BlockingQueue裏的元素被別的線程拿走纔會被喚醒繼續操做
- 非阻塞隊列AbstractQueue:多個線程存取元素時,直接返回結果,不具備阻塞的特色。
補充:
https://zhuanlan.zhihu.com/p/53076263
6.Java的內存模型以及GC算法
線程共享:Java堆,方法區
線程私有:程序計數器,Java虛擬機棧,本地方法棧
現代虛擬機中的GC(垃圾收集)算法:
- 標記-清除算法
標記:遍歷全部的節點,而後將全部能夠到達GC Root的對象標記爲存活的對象。
清除:遍歷堆中全部的對象,將沒有標記的對象所有清除掉。
效率低,清理出來的內存是不連續的,適合大量對象存活的狀況 - 複製算法
將內存按照容量分爲大小相等的兩塊,每次只使用其中一塊,當這一塊內存用完了,把還在存活的對象複製到另外一塊內存上,清空當前使用的內存塊,去使用另外一塊。(商業應用中,8:1)
空間利用率低,存活對象多的時候效率低,適合少許對象存活的狀況。 - 標記-整理算法
從GC Root開始遍歷全部節點,對全部存活的對象作一次標記,以後,將全部的存活對象壓縮到內存的一端,而後清理其餘全部的空間。
從效率上來講,標記-整理算法要低於複製算法(不只要標記全部存活對象,還要整理全部存活對象的引用地址).
適合存活對象較多的狀況。 - 分代收集算法
將Java堆分爲老年代和新生代,根據對象的存活時間不一樣,將內存劃分爲幾塊,分別採用針對性的GC算法,提升效率。新生代:少許對象存活,使用複製算法。
老年代:大量對象存活,適合用標記-清除/標記-整理算法
補充:
GC Root:對象之間的引用組成了一張圖,其中有一個叫作GC Root的根節點,若是一個對象不能到達根節點,說明這個對象已經失效。
標記-清除算法、複製算法、標記-整理算法的總結:三個算法都基於根搜索算法去判斷一個對象是否應該被回收。
7.JDK七、JDK8的新特性
JDK7:
- 數值類型字面值能夠用‘多個‘_’分隔增長可讀性
- 可使用字符串控制switch語句
- try語句裏聲明的資源,能夠自動關閉
- 多重捕獲異常(multi-catch),原本不一樣的異常是由多個catch語句塊來處理,如今能夠把多個異經常使用一個catch語句塊來處理,用’|’來表示多個異常,也就是或的意思
JDK8:
- 接口中能夠添加static方法,接口中能夠爲方法添加默認實現。
原來的接口:接口中的成員變量默認(必須)都是public、static、final類型的,必須被顯式初始化;接口中的方法默認(必須)都是public、abstract類型的。
https://blog.csdn.net/zhaojianting/article/details/80338273
8.Java數組和鏈表兩種結構的操做效率,在哪些狀況下,哪些操做(查詢、插入刪除)的效率高?
數組是一組地址連續、長度固定的內存空間,鏈表是動態分配內存,內存地址能夠連續能夠不連續,隨機查詢操做數組效率更高(O(1)),插入和刪除操做鏈表效率更高(O(1))
9.Java內存泄露的問題調查定位:jmap,jstack的使用等等
- jps:主要用來輸出JVM中運行的進程狀態信息
- jstack:主要用來查看某個Java進程內的線程棧信息
- jmap用來查看堆內存使用情況
補充:
https://blog.csdn.net/sinat_29581293/article/details/70214436
http://www.importnew.com/28916.html
Java開發框架
1.spring框架中須要引用哪些jar包,以及這些jar包的用途
- spring-core.jar:包含Spring 框架基本的核心工具類,其它組件要都要使用到這個包裏的類,依賴Commons Logging(Log4J)。
- spring-beans.jar:是全部組件都要用到的,它包含訪問配置文件、建立和管理bean 以及進行IOC、DI操做相關的全部類。依賴spring-core(CGLIB)。
- spring-aop.jar:包含在應用中使用AOP 特性時所需的類。
- spring-aspects.jar:提供對AspectJ的支持,以即可以方便的將面向切面的功能集成進IDE中,好比Eclipse AJDT。
- spring-context.jar:爲Spring 核心提供了大量擴展。
- spring-context-support.jar:包含支持UI模版(Velocity,FreeMarker,JasperReports),郵件服務,腳本服務(JRuby),緩存Cache(EHCache),任務計劃Scheduling(uartz)方面的類。外部依賴spring-context
- spring-jdbc.jar:包含對Spring 對JDBC 數據訪問進行封裝的全部類。
- spring-test.jar:spring整合JUnit測試的類。
- spring-web.jar:包含Web 應用開發時,用到Spring 框架時所需的核心類,包括自動載入Web Application Context 特性的類、Struts 與JSF 集成類、文件上傳的支持類、Filter 類和大量工具輔助類。外部依賴spring-context, Servlet API, (JSP API, JSTL, Commons FileUpload, COS)。
- spring-webmvc.jar:包含Spring MVC 框架相關的全部類。包括框架的Servlet,Web MVC框架,控制器和視圖支持。固然,若是你的應用使用了獨立的MVC 框架,則無需這個JAR 文件裏的任何類。外部依賴spring-web。
- spring-jms.jar:提供對JMS 1.0.2/1.1的支持類。外部依賴spring-beans,spring-dao,JMS API
詳解:
http://www.javashuo.com/article/p-yisaworx-dk.html
2.srpingMVC的原理架構
5個組件:DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver、View。
詳解:
http://www.javashuo.com/article/p-weqzvalj-nx.html
3.springMVC註解的意思
@Controller、@Resource和@Autowired、@RequestMapping、
@ModelAttribute和@SessionAttributes、@PathVariable和@RequestParam、
@ResponseBody和@RequestBody、
詳解:
http://www.javashuo.com/article/p-vukqgbcb-cb.html
4.spring中BeanFactory和ApplicationContext的聯繫和區別
https://youyu4.iteye.com/blog/2346183
https://blog.csdn.net/zh521zh/article/details/77884897
5.spring的DI(依賴注入)的幾種方式
IOC:控制反轉,把建立對象交給Spring進行配置
DI:依賴注入,向類裏面的屬性中設置值。
兩者關係:DI不能單獨存在,要在Ioc基礎之上來完成操做,即要先建立對象才能注入屬性值。
注入屬性的方式:
set注入、構造方法注入、註解注入、複雜類型注入。還有一些不經常使用的:p名稱空間注入,spel注入。
6.springIOC和AOP的原理
http://www.javashuo.com/article/p-eijuhcac-mw.html
7.spring如何實現事務管理的
Spring並不直接管理事務,而是提供了多種事務管理器,spring將事務管理的職責委託給Hibernate或者mybatis等持久層框架來實現。
Spring事務管理器的接口是org.springframework.transaction.PlatformTransactionManager,經過這個接口,Spring爲各個平臺如JDBC、Hibernate等都提供了對應的事務管理器,可是具體的實現就是各個平臺本身的事情了。
8.spring中循環注入的方式
http://www.javashuo.com/article/p-twyoiyig-nt.html