Java中級面試題及答案整理

一、webservice是什麼?

webservice是一種跨編程語言和跨操做系統的遠程調用技術,遵循SOPA/WSDL規範。html

二、springCloud是什麼?

springcloud是一個微服務框架,並提供全套分佈式系統解決方案。支持配置管理,熔斷機制,leader選舉,服務治理,分佈式session,微代理,控制總線,智能路由,一次性token。程序員

三、Java中堆和棧有什麼不一樣?

每一個線程都有本身的棧內存,用於存儲本地變量,方法參數和棧調用,一個線程中存儲的變量對其它線程是不可見的。而堆是全部線程共享的一片公用內存區域。對象都在堆裏建立,爲了提高效率線程會從堆中弄一個緩存到本身的棧,若是多個線程使用該變量就可能引起問題,這時volatile 變量就能夠發揮做用了,它要求線程從主存中讀取變量的值。web

堆:(對象)ajax

引用類型的變量,其內存分配在堆上或者常量池(字符串常量、基本數據類型常量),須要經過new等方式來建立。spring

堆內存主要做用是存放運行時建立(new)的對象。sql

(主要用於存放對象,存取速度慢,能夠運行時動態分配內存,生存期不須要提早肯定)數據庫

棧:(基本數據類型變量、對象的引用變量)編程

基本數據類型的變量(int、short、long、byte、float、double、boolean、char等)以及對象的引用變量,其內存分配在棧上,變量出了做用域就會自動釋放。json

四、Spring的Scope有如下幾種,經過@Scope註解來實現:

(1)Singleton:一個Spring容器中只有一個Bean的實例,此爲Spring的默認配置,全容器共享一個實例。跨域

(2)Prototype:每次調用新建一個Bean實例。

(3)Request:Web項目中,給每個 http request 新建一個Bean實例。

(4)Session:Web項目中,給每個 http session 新建一個Bean實例。

(5)GlobalSession:這個只在portal應用中有用,給每個 global http session 新建一個Bean實例。

五、Spring事務傳播行爲

所謂事務的傳播行爲是指,若是在開始當前事務以前,一個事務上下文已經存在,此時有若干選項能夠指定一個事務性方法的執行行爲。在TransactionDefinition定義中包括了以下幾個表示傳播行爲的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:若是當前存在事務,則加入該事務;若是當前沒有事務,則建立一個新的事務。這是默認值。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一個新的事務,若是當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:若是當前存在事務,則加入該事務;若是當前沒有事務,則以非事務的方式繼續運行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,若是當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,若是當前存在事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_MANDATORY:若是當前存在事務,則加入該事務;若是當前沒有事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_NESTED:若是當前存在事務,則建立一個事務做爲當前事務的嵌套事務來運行;若是當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。

六、Spring的聲明式事務管理力度是什麼級別?

Struts2是類級別的,Spring是方法級別的

spring事務能夠分爲編程式事務和聲明式事務

七、spring MVC與struts2的區別:

參考:  http://blog.csdn.net/chenleixing/article/details/44570681

① Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截

② SpringMVC的方法之間基本上獨立的,獨享request response數據

③ 因爲Struts2須要針對每一個request進行封裝,把request,session等servlet生命週期的變量封裝成一個一個Map,供給每一個Action使用,並保證線程安全,因此在原則上,是比較耗費內存的

④ 攔截器實現機制上,Struts2有以本身的interceptor機制,SpringMVC用的是獨立的AOP方式

⑤ SpringMVC的入口是servlet,而Struts2是filter

⑥ SpringMVC集成了Ajax

⑦ SpringMVC驗證支持JSR303,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感受太煩亂

⑧ Spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高

⑨ Struts2更加符合OOP的編程思想, SpringMVC就比較謹慎,在servlet上擴展

⑩ SpringMVC開發效率和性能高於Struts2

八、Spring框架中的核心思想包括什麼?

主要思想是IOC控制反轉,DI依賴注入,AOP面向切面

九、ArrayList和LinkedList的大體區別以下:

1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。 
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。

十、ArrayList,Vector主要區別爲如下幾點: 

(1):Vector是線程安全的,源碼中有不少的synchronized能夠看出,而ArrayList不是。致使Vector效率沒法和ArrayList相比; 

(2):ArrayList和Vector都採用線性連續存儲空間,當存儲空間不足的時候,ArrayList默認增長爲原來的50%,Vector默認增長爲原來的一倍; 

十一、HashSet與HashMap的區別:

十二、HashMap和Hashtable的區別:

HashMap和Hashtable都實現了Map接口,但決定用哪個以前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。

  1. HashMap幾乎能夠等價於Hashtable,除了HashMap是非synchronized的,並能夠接受null(HashMap能夠接受爲null的鍵值(key)和值(value),而Hashtable則不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程能夠共享一個Hashtable;而若是沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
  3. 另外一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。因此當有其它線程改變了HashMap的結構(增長或者移除元素),將會拋出ConcurrentModificationException,但迭代器自己的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並非一個必定發生的行爲,要看JVM。這條一樣也是Enumeration和Iterator的區別。
  4. 因爲Hashtable是線程安全的也是synchronized,因此在單線程環境下它比HashMap要慢。若是你不須要同步,只須要單一線程,那麼使用HashMap性能要好過Hashtable。
  5. HashMap不能保證隨着時間的推移Map中的元素次序是不變的。

1三、線程安全是什麼?線程不安全是什麼?

線程安全就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其餘線程不能進行訪問直到該線程讀取完,其餘線程纔可以使用。不會出現數據不一致或者數據污染。(Vector,HashTable) 
線程不安全就是不提供數據訪問保護,有可能出現多個線程前後更改數據形成所獲得的數據是髒數據。(ArrayList,LinkedList,HashMap等)

1四、線程和進程的區別?

進程和線程都是一個時間段的描述,是CPU工做時間段的描述,不過是顆粒大小不一樣;

(1)進程是資源的分配和調度的一個獨立單元,而線程是CPU調度的基本單元
(2)同一個進程中能夠包括多個線程,而且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進行至少包括一個線程。
(3)進程的建立調用fork或者vfork,而線程的建立調用pthread_create,進程結束後它擁有的全部線程都將銷燬,而線程的結束不會影響同個進程中的其餘線程的結束
(4)線程是輕兩級的進程,它的建立和銷燬所須要的時間比進程小不少,全部操做系統中的執行功能都是建立線程去完成的
(5)線程中執行時通常都要進行同步和互斥,由於他們共享同一進程的全部資源
(6)線程有本身的私有屬性TCB,線程id,寄存器、硬件上下文,而進程也有本身的私有屬性進程控制塊PCB,這些私有屬性是不被共享的,用來標示一個進程或一個線程的標誌

1五、黑盒測試、灰盒測試、白盒測試、單元測試有什麼區別?

黑盒測試關注程序的功能是否正確,面向實際用戶;

白盒測試關注程序源代碼的內部邏輯結構是否正確,面向編程人員;

灰盒測試是介於白盒測試與黑盒測試之間的一種測試。

單元測試(Unit Testing)是對軟件基本組成單元進行的測試,如函數或是一個類的方法。這裏的單元,就是軟件設計的最小單位。

1六、怎麼對數據庫百萬級數據進行優化?

使用讀寫分離技術(

讓主數據庫(master)處理事務性增、改、刪操做(INSERT、UPDATE、DELETE),而從數據庫(slave)處理SELECT查詢操做

1七、Spring Bean的生命週期:

  • Bean的創建, 由BeanFactory讀取Bean定義文件,並生成各個實例
  • Setter注入,執行Bean的屬性依賴注入
  • BeanNameAware的setBeanName(), 若是實現該接口,則執行其setBeanName方法
  • BeanFactoryAware的setBeanFactory(),若是實現該接口,則執行其setBeanFactory方法
  • BeanPostProcessor的processBeforeInitialization(),若是有關聯的processor,則在Bean初始化以前都會執行這個實例的processBeforeInitialization()方法
  • InitializingBean的afterPropertiesSet(),若是實現了該接口,則執行其afterPropertiesSet()方法
  • Bean定義文件中定義init-method
  • BeanPostProcessors的processAfterInitialization(),若是有關聯的processor,則在Bean初始化以前都會執行這個實例的processAfterInitialization()方法
  • DisposableBean的destroy(),在容器關閉時,若是Bean類實現了該接口,則執行它的destroy()方法
  • Bean定義文件中定義destroy-method,在容器關閉時,能夠在Bean定義文件中使用「destory-method」定義的方法

簡單回答springbean生命週期:

(1)實例化(必須的)構造函數構造對象

(2)裝配(可選的)爲屬性賦值

(3)回調(可選的)(容器-控制類和組件-回調類)

(4)初始化(init-method=" ")

(5)就緒

(6)銷燬(destroy-method=" ")

1八、springmvc生命週期:

1A)客戶端發出http請求,只要請求形式符合web.xml
文件中配置的*.action的話,就由DispatcherServlet
來處理。

1B)DispatcherServlet再將http請求委託給映射器
的對象來將http請求交給對應的Action來處理

2)映射器根據客戶的http請求,再對比<bean name="/hello.action
若是匹配正確,再將http請求交給程序員寫的Action

3)執行Action中的業務方法,最終返回一個名叫ModelAndView
的對象,其中封裝了向視圖發送的數據和視圖的邏輯名

4)ModelAndView對象隨着響應到到DispatcherServlet中了

5)這時DispatcherServlet收到了ModelAndView對象,
它也不知道視圖邏輯名是何意,又得委託一個名叫
視圖解析器的對象去具體解析ModelAndView對象
中的內容

6)將視圖解析器解析後的內容,再次交由DispatcherServlet
核心控制器,這時核心控制器再將請求轉發到具體的
視圖頁面,取出數據,再顯示給用戶

1九、servlet生命週期?

Servlet 經過調用 init () 方法進行初始化。
Servlet 調用 service() 方法來處理客戶端的請求。
Servlet 經過調用 destroy() 方法終止(結束)。
最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的

20、ajax怎麼解決跨域?

參考:http://blog.csdn.net/u014727260/article/details/72793459

① 代理(經過後臺操做)

② JSONP(添加響應頭,容許跨域 )

addHeader(‘Access-Control-Allow-Origin:*’);//容許全部來源訪問 

addHeader(‘Access-Control-Allow-Method:POST,GET’);//容許訪問的方式

③ 在ajax的dataType方式改成「jsonp」

2一、Mysql數據類型:

① 普通索引

② 惟一索引

③ 主鍵索引

④ 組合索引

⑤ 全文索引

參考:http://www.javashuo.com/article/p-cswecvft-bb.html

2二、Eureka和zookeeper的區別?

① 作分佈式下的服務發現仍是使用eureka更好,也就是AP特性的分佈式協調工具(zookeeper由於網絡故障就沒法返回可用的主機)

② zookeeper技術更加成熟,資料更多

③ Eureka。是spring cloud之下一個專門負責微服務服務註冊和發現的組件,Eureka就是爲了服務發現而設計的

④ Zookeeper。是用來保證分佈式一致性的一個軟件。不是爲了服務發現註冊而設計的,只不過它的特性也能夠被二次開發成服務發現註冊中心罷了

2三、SpringCloud都有哪些組件?

Spring Cloud爲微服務架構開發涉及的配置管理,服務治理,熔斷機制,智能路由,微代理,控制總線,一次性token,全局一致性鎖,leader選舉,分佈式session,集羣狀態管理等操做提供了一種簡單的開發方式。

組件列:

  • Spring Cloud Config:配置管理工具,支持使用Git存儲配置內容,支持應用配置的外部化存儲,支持客戶端配置信息刷新、加解密配置內容等
  • Spring Cloud Bus:事件、消息總線,用於在集羣(例如,配置變化事件)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。
  • Spring Cloud Netflix:針對多種Netflix組件提供的開發工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
  • Netflix Eureka:一個基於rest服務的服務治理組件,包括服務註冊中心、服務註冊與服務發現機制的實現,實現了雲端負載均衡和中間層服務器的故障轉移。
  • Netflix Hystrix:容錯管理工具,實現斷路器模式,經過控制服務的節點,從而對延遲和故障提供更強大的容錯能力。
  • Netflix Ribbon:客戶端負載均衡的服務調用組件。
  • Netflix Feign:基於Ribbon和Hystrix的聲明式服務調用組件。
  • Netflix Zuul:微服務網關,提供動態路由,訪問過濾等服務。
  • Netflix Archaius:配置管理API,包含一系列配置管理API,提供動態類型化屬性、線程安全配置操做、輪詢框架、回調機制等功能。
  • Spring Cloud for Cloud Foundry:經過Oauth2協議綁定服務到CloudFoundry,CloudFoundry是VMware推出的開源PaaS雲平臺。
  • Spring Cloud Sleuth:日誌收集工具包,封裝了Dapper,Zipkin和HTrace操做。
  • Spring Cloud Data Flow:大數據操做工具,經過命令行方式操做數據流。
  • Spring Cloud Security:安全工具包,爲你的應用程序添加安全控制,主要是指OAuth2。
  • Spring Cloud Consul:封裝了Consul操做,consul是一個服務發現與配置工具,與Docker容器能夠無縫集成。
  • Spring Cloud Zookeeper:操做Zookeeper的工具包,用於使用zookeeper方式的服務註冊和發現。
  • Spring Cloud Stream:數據流操做開發包,封裝了與Redis,Rabbit、Kafka等發送接收消息。
  • Spring Cloud CLI:基於 Spring Boot CLI,可讓你以命令行方式快速創建雲組件

2四、Hibernate的三種狀態是什麼?怎麼將遊離狀態轉換爲持久化狀態?

transient(瞬時狀態),persistent(持久化狀態)以及detached(離線狀態)

轉換:update()    saveOrUpdate()       lock()

相關文章
相關標籤/搜索