java中級面試題

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

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

堆:(對象)web

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

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

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

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

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

二、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

八、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三、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六、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」

1七、Eureka和zookeeper的區別?

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

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

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

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

1八、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,可讓你以命令行方式快速創建雲組件
相關文章
相關標籤/搜索