java 面試收集

面試收集: http://blog.csdn.net/u012516166/article/details/76184403html

熟悉J2EE技術體系,熟練使用Spring、Struts二、Hibernate、SpringMVC等開源框架並瞭解工做原理前端

J2EE:java

J2EE是一套全然不一樣於傳統應用開發的技術架構,包含許多組件,主要可簡化且規範應用系統的開發與部署,進而提升可移植性、安全與再用價值。mysql

J2EE平臺由一整套服務(Services)、應用程序接口(APIs)和協議構成,它對開發基於Web的多層應用提供了功能支持,包含13種核心技術規範:linux

J2EE事務併發訪問主要能夠分爲兩類,分別是同一個系統事務和跨事務訪問的併發訪問控制,其中同一個系統事務能夠採起樂觀鎖以及悲觀鎖策略,而跨多個系統事務時則須要樂觀離線鎖和悲觀離線鎖nginx

Spring:  https://www.ibm.com/developerworks/cn/java/wa-spring1/index.html程序員

Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在覈心容器之上,核心容器定義了建立、配置和管理 bean 的方式,如圖 1 所示。web

組成 Spring 框架的每一個模塊(或組件)均可以單獨存在,或者與其餘一個或多個模塊聯合實現。每一個模塊的功能以下:面試

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。
  • Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
  • Spring AOP:經過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。因此,能夠很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。經過使用 Spring AOP,不用依賴 EJB 組件,就能夠將聲明性事務管理集成到應用程序中。
  • Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不一樣數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,而且極大地下降了須要編寫的異常代碼數量(例如打開和關閉鏈接)。Spring DAO 的面向 JDBC 的異常聽從通用的 DAO 異常層次結構。
  • Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。全部這些都聽從 Spring 的通用事務和 DAO 異常層次結構。
  • Spring Web 模塊:Web 上下文模塊創建在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。因此,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。
  • Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。經過策略接口,MVC 框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能能夠用在任何 J2EE 服務器中,大多數功能也適用於不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象能夠在不一樣 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。ajax

Spring: 面向切面編程(AOP)和控制反轉 (IOC) 容器

AOP(Aspect-OrientedProgramming,面向切面編程),即將多個類的公共行爲封裝到一個可重用模塊

一、概念:AOP是創建在Java的反射基礎之上,具體是指散落在程序中的公共部分提取出來,作成了切面類,這樣作的好處在於代碼的可重用。一旦涉及到該功能的需求發生變化,只要修改該代碼就行。AOP的實現主要是由JDK的動態代理(代理接口:Proxy利用InvocationHandler動態建立一個符合某一接口的實例,生成目標類的代理對象)與CGLIB代理(代理類:須要定義一個MethodInterceptor接口的子類)。

二、意義:加強類的功能(在目標對象的方法執行之間和執行以後)。

三、原理:主要是動態代理和反射機制實現的;

補充和完善OOP(Object-Oriented Programing,面向對象編程)。OOP引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。

當咱們須要爲大量不一樣類的對象引入公共行爲的時候,就不是OOP所擅長的事情了。

散佈在各處功能性的代碼被稱爲橫切(cross-cutting)代碼,在OOP設計中,會致使大量代碼的重複,而不利於各個模塊的重用。

AOP利用一種稱爲「橫切」的技術,剖解開封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其名爲「Aspect」,即切面。

就須要將與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減小系統的重複代碼,下降模塊間的耦合度,並有利於將來的可操做性和可維護性。

使用「橫切」技術,AOP把軟件系統分爲兩個部分:核心關注點和橫切關注點。

業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特色是,他們常常發生在覈心關注點的多處,而各處都基本類似。好比權限認證、日誌、事務處理。

 IOC(Inversion of Control),控制反轉,即調用類的時候只須要 類調用時,註釋 @Autowired,就會在spring容器中登記,不須要實例化,類的建立、銷燬都由 spring來控制;

「控制反轉」,是一種設計思想。即:將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。之前建立對象的主動權和建立時機是由本身把控的,而如今這種權力轉移到第三方。

IOC能指導咱們如何設計出鬆耦合、更優良的程序。傳統應用程序都是由咱們在類內部主動建立依賴對象,從而致使類與類之間高耦合,難於測試;有了IoC容器後,把建立和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,因此對象與對象之間是 鬆散耦合,這樣也方便測試,利於功能複用,更重要的是使得程序的整個體系結構變得很是靈活。

依賴注入:DI(Dependency Injection)

組件之間依賴關係由容器在運行期決定,即由容器動態的將某個依賴關係注入到組件之中。依賴注入的目的並不是爲軟件系統帶來更多功能,而是爲了提高組件重用的頻率,併爲系統搭建一個靈活、可擴展的平臺。經過依賴注入機制,咱們只須要經過簡單的配置,而無需任何代碼就可指定目標須要的資源,完成自身的業務邏輯,而不須要關心具體的資源來自何處,由誰實現。

所謂IoC,對於spring框架來講,就是由spring來負責控制對象的生命週期和對象間的關係。

全部的類都會在spring容器中登記,告訴spring你是個什麼東西,你須要什麼東西,而後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其餘須要你的東西。全部的類的建立、銷燬都由 spring來控制,也就是說控制對象生存週期的再也不是引用它的對象,而是spring。對於某個具體的對象而言,之前是它控制其餘對象,如今是全部對象都被spring控制,因此這叫控制反轉。

使用Spring註解配置IOC

Spring和注入相關的常見註解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。

Autowired是自動注入,自動從spring的上下文找到合適的bean來注入
Resource用來指定名稱注入
Qualifier和Autowired配合使用,指定bean的名稱
Service,Controller,Repository分別標記類是Service層類,Controller層類,數據存儲層的類,spring掃描註解配置時,會標記這些類要生成bean。
Component是一種泛指,標記類是組件,spring掃描註解配置時,會標記這些類要生成bean。

項目中,經過在applicationContext.xml中配置掃描註解便可

 

Autowired和Resource是用來修飾字段,構造函數,或者設置方法,並作注入的。

@Autowired 註釋,它能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做。 經過 @Autowired的使用來消除 set ,get方法。

當 Spring 容器啓動時,被@Autowired的字段將將掃描 Spring 容器中全部 Bean,當發現 Bean 中擁有 @Autowired 註釋時就找到和其匹配(默認按類型匹配)的 Bean,並注入到對應的地方中去。   

例如:

ctripcfadapter項目模塊中,UserInfoFacade由@Autowired 註釋,可自動建立對象。

Struts2:

1.概念:輕量級的MVC框架,主要解決了請求分發的問題,重心在控制層和表現層。低侵入性,與業務代碼的耦合度很低。Struts2實現了MVC,並提供了一系列API,採用模式化方式簡化業務開發過程。

  2.與Servlet對比

    優勢:業務代碼解耦,提升開發效率

    缺點:執行效率偏低,須要使用反射、解析XML等技術手段,結構複雜

  3.不一樣框架實現MVC的方式

    Servlet:

    

    Spring:

    

    Struts2:

    

 springmvc和struts2的區別 https://www.cnblogs.com/airsen/archive/2016/11/28/6108519.html

一、springmvc基於方法開發的,struts2基於類開發的。

二、單例和多例的區別:springmvc在映射的時候,經過形參來接收參數的,是將url和controller方法映射,映射成功後,springmvc生成一個handlers對象,對象中只包括一個method,方法執行結束的時候,形參的數據就銷燬,

因此springmvc能夠進行單例開發,而且建議使用。

可是structs接收的參數是經過類的成員變量來接收的,這些變量在多線程訪問中,是共享的,而不是像springmvc那樣,方法結束以後,形參自動銷燬,且沒法使用單例,只能使用多例。

這樣的話,在structs中,隨着方法的添加,不少的成員變量,維護到最後的時候根本就不知道這個成員變量被哪一個方式所使用,因此springmvc開發相似於service開發。

三、通過實際測試,structs速度慢,在與使用structs標籤,若是使用structs建議使用jstl。

mybatis和hibernate的區別

MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架,其主要就完成2件事情:

  1. 封裝JDBC操做
  2. 利用反射打通Java類與SQL語句之間的相互轉換

MyBatis的主要設計目的就是讓咱們對執行SQL語句時對輸入輸出的數據管理更加方便,因此方便地寫出SQL和方便地獲取SQL的執行結果纔是MyBatis的核心競爭力。

對比

一、hibernate 入門門檻高,是一個標準的ORM礦建(對象關係映射),不須要程序寫sql,sql語句自動生成,對sql語句進行優化、修改比較困難。

   mybatis專一於sql自己,須要程序員本身編寫sql語句,sql修改、優化比較方便。是一個不徹底的ORM框架,雖然程序員本身寫sql,mybatis也能夠實現映射(輸入映射,輸出映射)

應用場景方面:

二、hibernate適用於需求變化很少的中小型項目,好比:後臺管理系統,orm、oa......

  mybatis適用於需求變化較多的項目,好比:互聯網項目。

熟悉JQuery、JavaScript/Ajax、WebServers等前端技術

Web Service也叫XML Web Service WebService是一種能夠接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通信技術。是:經過SOAP在Web上提供的軟件服務,使用WSDL文件進行說明,並經過UDDI進行註冊。

熟悉SVN、Maven、Junit工具

Maven:項目對象模型(POM)、經過pom.xml 來配置管理引用 jar 包,能夠創建倉庫:本地倉庫、中央倉庫(遠程)

Junit : Java語言的單元測試框架

熟悉Oracle、SQL Server、MySql數據庫,比較差異

SQL是一種語言;MySql,Oracle和SQL Server是指數據庫系統。

1、數據庫對比。
----1.Oracle:最貴,功能最多,安裝最不方便,Oracle環境裏的其餘相關組件最多,支持平臺數量通常,使用中等方便,開發中等方便,運維中等方便,不開源,速度最慢,最安全。
----2.Microsoft SQL Server 2014:中等貴,功能最少,安裝中等方便,Microsoft SQL Server 2014環境裏的其餘相關組件最少,支持平臺最少,使用最方便,開發最方便,運維最方便,不開源,速度中等,通常安全。
----3.Mysql:免費,功能中等,安裝最方便,Mysql環境裏的其餘相關組件數量中等,支持平臺最多,使用最不方便,開發最不方便,運維最不方便,有開源版本,速度最快,最不安全。
2、
Oracle傳統,跨平臺,穩定,適合OLTP,最接近數據庫設計範式,一致性處理是最好的,也是最複雜的。適合金融,電信等企業。要想用好併發揮其性能,對管理員的能力要求較高。另維護成本較高。SqlServer目前只能在Windows系列執行,限制其發展,因此在高可用,災備,併發也受win的限制。優勢是,操做簡單,人員要求低,學習曲線低,聽說紐交所使用中。MySql適合開發者,簡單。不過隨着Oracle的入主,功能愈來愈完善,又由於其開源,阿里開發了改進大數據庫,性能和應用場景不斷拓寬,將來前進可人。

一、servlet執行流程

客戶端發出http請求,web服務器將請求轉發到servlet容器,servlet容器解析url並根據web.xml找到相對應的servlet,並將request、response對象傳遞給找到的servlet,servlet根據request就能夠知道是誰發出的請求,請求信息及其餘信息,當servlet處理完業務邏輯後會將信息放入到response並響應到客戶端。

二、springMVC的執行流程

Spring MVC 是一個模型 - 視圖 - 控制器(MVC)的Web框架創建在中央前端控制器servlet(DispatcherServlet)

springMVC是由dispatchservlet爲核心的分層控制框架。首先客戶端發出一個請求web服務器解析請求url並去匹配dispatchservlet的映射url,若是匹配上就將這個請求放入到dispatchservlet,dispatchservlet根據mapping映射配置去尋找相對應的handel,而後把處理權交給找到的handel,handel封裝了處理業務邏輯的代碼,當handel處理完後會返回一個邏輯視圖modelandview給dispatchservlet,此時的modelandview是一個邏輯視圖不是一個正式視圖,因此dispatchservlet會經過viewresource視圖資源去解析modelandview,而後將解析後的參數放到view中返回到客戶端並展示。

三、Java設計模式思想(單列模式,工廠模式,策略模式,共23種設計模式)

a) 單例模式:單例模式核心只須要new一個實例對象的模式,好比數據庫鏈接,在線人數等,一些網站上看到的在線人數統計就是經過單例模式實現的,把一個計時器存放在數據庫或者內存中,當有人登錄的時候取出來加一再放回去,有人退出登錄的時候取出來減一再放回去,可是當有兩我的同時登錄的時候,會同時取出計數器,同時加一,同時放回去,這樣的話數據就會錯誤,因此須要一個全局變量的對象給所有人使用,只須要new出一個實例對象,這就是單例模式的應用,而且單例模式節省資源,由於它控制了實例對象的個數,並有利於gc回收。

b) 策略模式:就是將幾個類中公共的方法提取到一個新的類中,從而使擴展更容易,保證代碼的可移植性,可維護性強。好比有個需求是寫鴨子對象,鴨子有叫,飛,外形這三種方法,若是每一個鴨子類都寫這三個方法會出現代碼的冗餘,這時候咱們能夠把鴨子中的叫,飛,外形這三個方法提取出來,放到鴨父類中,讓每一個鴨子都繼承這個鴨父類,重寫這三個方法,這樣封裝的代碼可移植性強,當用戶提出新的需求好比鴨子會游泳,那麼對於咱們oo程序員來說就很是簡單了咱們只須要在鴨父類中加一個游泳的方法,讓會游泳的鴨子重寫游泳方法就能夠了。

c) 工廠模式:簡單的工廠模式主要是統一提供實例對象的引用,經過工廠模式接口獲取實例對象的引用。好比一個登錄功能,後端有三個類,controller類,interface類,實現接口的實現類。當客戶端發出一個請求,當請求傳到controller類中時,controller獲取接口的引用對象,而實現接口的實現類中封裝好了登錄的業務邏輯代碼。當你須要加一個註冊需求的時候只須要在接口類中加一個註冊方法,實現類中實現方法,controller獲取接口的引用對象便可,不須要改動原來的代碼,這種作法是的可拓展性強。

spring中的設計模式 9中  地址:https://www.cnblogs.com/doudouxiaoye/p/5694096.html

1.簡單工廠 又叫作靜態工廠方法(StaticFactory Method)模式,

2.工廠方法(Factory Method) 

3.單例(Singleton)

4.適配器(Adapter)

5.包裝器(Decorator) 

6.代理(Proxy) 

7.觀察者(Observer) 

8.策略(Strategy) 

9.模板方法(Template Method) 

四、冒泡排序、二分查找

a) 冒泡

  public static void mp(int a[]) {

int swap = 0;

for (int i = 0; i < a.length; i++) {

for (int j = i; j < a.length; j++) {

if (a[j] > a[i]) {

swap = a[i];

a[i] = a[j];

a[j] = swap;

}}}

System.out.println(Arrays.toString(a));

}

b)二分查找public static int ef(int a[], int tag) {

int first = 0;

int end = a.length;

for (int i = 0; i < a.length; i++) {

int middle = (first + end) / 2;

if (tag == a[middle]) {

return middle;

}

if (tag > a[middle]) {

first = middle + 1;

}

if (tag < a[middle]) {

end = middle - 1;

}}

return 0;

}

六、對ajax的理解

a) Ajax爲異步請求,即局部刷新技術,在傳統的頁面中,用戶須要點擊按鈕或者事件觸發請求,到刷新頁面,而異步技術爲不須要點擊便可觸發事件,這樣使得用戶體驗感加強,好比商城購物車的異步加載,當你點擊商品時無需請求後臺而直接動態修改參數。

九、父類與子類之間的調用順序(打印結果)

a) 父類靜態代碼塊

b) 子類靜態代碼塊

c) 父類構造方法

d) 子類構造方法

e) 子類普通方法

f) 重寫父類的方法,則打印重寫後的方法

十一、多線程

a)一個進程是一個獨立的運行環境,能夠看作是一個程序,而線程能夠看作是進程的一個任務,好比QQ是一個進程,而一個QQ窗口是一個線程。

b)在多線程程序中,多線程併發能夠提升程序的效率,cpu不會由於某個線程等待資源而進入空閒狀態,它會把資源讓給其餘的線程。

c)用戶線程就是咱們開發程序是建立的線程,而守護線程爲系統線程,如JVM虛擬中的GC

d)線程的優先級別:每個線程都有優先級別,有限級別高的能夠先獲取CPU資源使該線程從就緒狀態轉爲運行狀態。也能夠自定義線程的有限級別

e)死鎖:至少兩個以上線程爭取兩個以上cpu資源,避免死鎖就避免使用嵌套鎖,只須要在他們須要同步的地方加鎖和避免無限等待

hibernate的核心思想

a) Hibernate的核心思想是ROM對象關係映射機制。它是將表與表之間的操做映射成對象與對象之間的操做。也就是從數據庫中提取的信息會自動按照你設置的映射要求封裝成特定的對象。因此hibernate就是經過將數據表實體類的映射,使得對對象的修改對應數據行的修改。

Arraylist與linkedlist的區別

a) 都是實現list接口的列表,arraylist是基於數組的數據結構,linkedlist是基於鏈表的數據結構,當獲取特定元素時,ArrayList效率比較快,它經過數組下標便可獲取,而linkedlist則須要移動指針。當存儲元素與刪除元素時linkedlist效率較快,只須要將指針移動指定位置增長或者刪除便可,而arraylist須要移動數據。

數據庫優化

a) 選擇合適的字段,好比郵箱字段能夠設爲char(6),儘可能把字段設置爲notnull,這樣查詢的時候數據庫就不須要比較null值

b) 使用關聯查詢( left join on)查詢代替子查詢

c) 使用union聯合查詢手動建立臨時表

d) 開啓事物,當數據庫執行多條語句出現錯誤時,事物會回滾,能夠維護數據庫的完整性

e) 使用外鍵,事物能夠維護數據的完整性可是它卻不能保證數據的關聯性,使用外鍵能夠保證數據的關聯性

f) 使用索引,索引是提升數據庫性能的經常使用方法,它能夠令數據庫服務器以比沒有索引快的多的速度檢索特定的行,特別是對於max,min,order by查詢時,效果更明顯

g) 優化的查詢語句,絕大多數狀況下,使用索引能夠提升查詢的速度,但若是sql語句使用不恰當的話,索引沒法發揮它的特性。

jvm的優化

a) 設置參數,設置jvm的最大內存數

b) 垃圾回收器的選擇

2六、高併發處理

a) 瞭解一點高併發性問題,好比一W人搶一張票時,如何保證票在沒買走的狀況下全部人都能看見這張票,顯然是不能用同步機制,由於synchronize是鎖同步一次只能一我的進行。這時候能夠用到鎖機制,採用樂觀鎖能夠解決這個問題。樂觀鎖的簡單意思是在不鎖定表的狀況下,利用業務的控制來解決併發問題,這樣即保證數據的可讀性,又保證保存數據的排他性,保證性能的同時解決了併發帶來的髒讀數據問題。

2七、事物的理解

a) 事物具備原子性,一致性,持久性,隔離性

b) 原子性:是指在一個事物中,要麼所有執行成功,要麼所有失敗回滾。

c) 一致性:事物執行以前和執行以後都處於一致性狀態

d) 持久性:事物多數據的操做是永久性

e) 隔離性:當一個事物正在對數據進行操做時,另外一個事物不能夠對數據進行操做,也就是多個併發事物之間相互隔離。

mybatis中批量插入的兩種方式(高效插入)

1、mybiats foreach標籤

2、mybatis ExecutorType.BATCH 在同一事務範圍內,分批commit insert batch  :http://blog.csdn.net/wlwlwlwl015/article/details/50246717

java 中強(StrongReference)、弱(WeakReference)、軟(SoftReference)、虛(PhantomReference)引用

jvm:java虛擬機  https://www.cnblogs.com/lishun1005/p/6019678.html

提及Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Java應用程序接口(Java API)。它們的關係以下圖所示:

 

運行期環境表明着Java平臺,開發人員編寫Java代碼(.java文件),而後將之編譯成字節碼(.class文件),再而後字節碼被裝入內存,一旦字節碼進入虛擬機,它就會被解釋器解釋執行,或者是被即時代碼發生器有選擇的轉換成機器碼執行。

JVM基本概念
(1) 基本概念:
     JVM是可運行Java代碼的假想計算機 ,包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收,堆 和 一個存儲方法域。JVM是運行在操做系統之上的,它與硬件沒有直接的交互。
(2) 運行過程:
     咱們都知道Java源文件,經過編譯器,可以生產相應的.Class文件,也就是字節碼文件,而字節碼文件又經過Java虛擬機中的解釋器,編譯成特定機器上的機器碼 。
也就是以下:
     ① Java源文件—->編譯器—->字節碼文件
     ② 字節碼文件—->JVM—->機器碼
     每一種平臺的解釋器是不一樣的,可是實現的虛擬機是相同的,這也就是Java爲何可以跨平臺的緣由了 ,當一個程序從開始運行,這時虛擬機就開始實例化了,多個程序啓動就會存在多個虛擬機實例。程序退出或者關閉,則虛擬機實例消亡,多個虛擬機實例之間數據不能共享。

jdk7 和 jdk8 的特性 https://www.cnblogs.com/lknny/p/6085050.html

jdk7:

  • switch支持字符串
  • List
  • 對java集合的加強支持
  • 在try catch異常撲捉中,一個catch能夠寫多個異常類型,用"|"隔開;

jdk8:

  • 接口能夠添加默認方法,default;
  • lambda表達式,對於接口能夠直接用()->{}方式來表達,小括號表示方法入參,花括號內表示方法返回值,如Collections的sort()方法:
Collections.sort(names, (String a, String b) -> { return b.compareTo(a); }); Collections.sort(names, (String a, String b) -> b.compareTo(a)); Collections.sort(names, (a, b) -> b.compareTo(a));
  • 函數式接口,@FunctionalInterface, 將lambda表達式映射到一個單方法的接口上
  • 方法和構造函數的引用,可使用::,如Integer::valueOf
  • lambda表達式訪問外層做用域和老版本的匿名對象中的方式很像,能夠直接訪問標記了final的外層局部變量,或者實例的字段以及靜態變量。
  • java.util.Stream 表示能應用在一組元素上一次執行的操做序列。Stream 操做分爲中間操做或者最終操做兩種,最終操做返回一特定類型的計算結果,而中間操做返回Stream自己,這樣你就能夠將多個操做依次串起來。
  linux
Linux是一套無償使用和自由傳播的 類Unix 操做系統,是一個基於 POSIXUNIX的多用戶、 多任務、支持 多線程和多 CPU的操做系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。它支持 32位64位硬件。Linux繼承了 Unix網絡爲核心的設計思想,是一個性能穩定的多用戶網絡操做系統。
Linux操做系統誕生於1991 年10 月5 日(這是第一次正式向外公佈時間)。Linux存在着許多不一樣的Linux版本,但它們都使用了 Linux內核。Linux可安裝在各類計算機硬件設備中,好比 手機平板電腦路由器、視頻遊戲控制檯、臺式計算機、大型機和超級計算機。
嚴格來說,Linux這個詞自己只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,而且使用 GNU工程各類工具和數據庫的操做系統。

nginx

Nginx (engine x) 是一個高性能的 HTTP反向代理服務器,也是一個IMAP/POP3/SMTP 服務器。Nginx是由伊戈爾·賽索耶夫爲 俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。
其將 源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而 聞名。2011年6月1日,nginx 1.0.4發佈。
Nginx是一款 輕量級Web 服務器/ 反向代理服務器及 電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。其特色是佔有內存少, 併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、 京東新浪網易騰訊淘寶等。

tomcat與resin的比較

Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其餘一些公司及我的共同開發而成。因爲有了Sun 的參與和支持,最新的Servlet 和JSP 規範老是能在Tomcat 中獲得體現,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規範。由於Tomcat 技術先進、性能穩定,並且免費,於是深受Java 愛好者的喜好並獲得了部分軟件開發商的承認,成爲目前比較流行的Web 應用服務器。目前最新版本是7.0。

Tomcat運行時佔用的系統資源小,擴展性好,支持負載平衡與郵件服務等開發應用系統經常使用的功能;並且它還在不斷的改進和完善中,任何一個感興趣的程序員均可以更改它或在其中加入新的功能。

Resin是CAUCHO公司的產品,是一個很是流行的application server,對servletJSP提供了良好的支持,性能也比較優良,resin自身採用JAVA語言開發。

Resin是CAUCHO公司的產品,是一個很是流行的支持servlets 和jsp的引擎,速度很是快。Resin自己包含了一個支持HTTP/1.1的WEB服務器。雖然它能夠顯示動態內容,可是它顯示靜態內容的能力也很是強,速度直逼APACHE SERVER。許多站點都是使用該WEB服務器構建的。

Resin也能夠和許多其餘的WEB服務器一塊兒工做,好比Apache server和IIS等。Resin支持Servlets 3.0標準和JSP 1.2標準。熟悉ASPPHP的用戶能夠發現用Resin來進行JSP編程是件很容易的事情。

Resin支持負載平衡(Load balancing),能夠增長WEB站點的可靠性。方法是增長服務器的數量。好比一臺SERVER的錯誤率是1%的話,那麼支持負載平衡的兩個Resin服務器就可使錯誤率降到0.01%。

Resin 最新使用的是 4.0 的版本、Tomcat 是 9.0。

1.先從是否收費上進行比較:

Resin做爲我的開發是免費的,若是須要將開發產品做爲商業產品發佈是須要收費的。

Tomcat是開源的,免費。 

2.Resin 在一臺機器上配置多個運行實例時,稍顯麻煩,不像Tomcat複製多份,修改個端口便可,徹底獨立。 

3.在最新的 Resin 3.1 / 3.2 中,會自動對URL進行解碼處理,致使原來在Tomcat 和 Resin 3.0 上運行正常的程序,到了新版本會有部分亂碼的現象。 

兩者在穩定性上都沒有任何問題、性能在訪問量不大的話,都沒有多大的差異。目前選擇Tomcat的較多。

NoSQL

NoSQL,泛指非關係型的數據庫,NoSQL數據庫的四大分類表格分析

 JMS與MQ的關係   

1、JMS

定義:JMS即Java消息服務(JavaMessage Service)應用程序接口是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通訊。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。

簡介:JMS是一種與廠商無關的 API,用來訪問消息收發服務(消息中間件)。它相似於JDBC(Java DatabaseConnectivity):這裏,JDBC 是能夠用來訪問許多不一樣關係數據庫的API,而JMS一樣提供與廠商無關的訪問方式來訪問消息收發服務,許多廠商目前都支持JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,這只是幾個例子。 JMS 使您可以經過消息收發服務從一個 JMS 客戶機向另外一個JMS客戶機發送消息。消息是 JMS 中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關該消息的元數據組成。消息主體則攜帶着應用程序的數據或有效負載。根據有效負載的類型來劃分,能夠將消息分爲幾種類型,它們分別攜帶:簡單文本(TextMessage)、可序列化的對象 (ObjectMessage)、屬性集合 (MapMessage)、字節流 (BytesMessage)、原始值流 (StreamMessage),還有無有效負載的消息 (Message)。

2、MQ

定義:MQ全稱爲消息隊列(Message Queue), MQ是一種應用程序與應用程序之間的通訊方法。應用程序經過消息隊列來通訊,而無需專用鏈接來連接它們。消息傳遞指的是程序經過在消息隊列中收發數據進行通訊,而不是經過直接調用彼此來通訊。隊列的使用除去了接收和發送應用程序同時執行的要求。其中較爲成熟的MQ產品有IBM的WEBSPHERE MQ。

MQ特色:MQ的消費-生產者模型的一個典型的表明,一端往消息隊列中不斷的寫入消息,而另外一端則能夠讀取或者訂閱隊列中的消息。

使用場景:在項目中,將一些無需即時返回且耗時的操做提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提升了系統的吞吐量。

3、兩者之間的關係

JMS是一個用於提供消息服務的技術規範(API),它制定了在整個消息服務提供過程當中的全部數據結構和交互流程。而MQ則是消息隊列服務,是面向消息中間件(MOM)的最終實現,是真正的消息服務提供者。MQ的實現能夠基於JMS,也能夠基於其餘規範或標準,其中ActiveMQ就是基於JMS規範實現的消息隊列。

RESTful架構風格

一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件能夠更簡潔,更有層次,更易於實現緩存等機制。

REST即Representational State Transfer的縮寫,可譯爲"表現層狀態轉化」。REST最大的幾個特色爲:資源、統一接口、URI和無狀態。

1.1.1 資源

所謂"資源",就是網絡上的一個實體,或者說是網絡上的一個具體信息。它能夠是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的實在。資源總要經過某種載體反應其內容,文本能夠用txt格式表現,也能夠用HTML格式、XML格式表現,甚至能夠採用二進制格式;圖片能夠用JPG格式表現,也能夠用PNG格式表現;JSON是如今最經常使用的資源表示格式。

1.1.2 統一接口

RESTful架構風格規定,數據的元操做,即CRUD(create, read, update和delete,即數據的增刪查改)操做,分別對應於HTTP方法:GET用來獲取資源,POST用來新建資源(也能夠用於更新資源),PUT用來更新資源,DELETE用來刪除資源,這樣就統一了數據操做的接口,僅經過HTTP方法,就能夠完成對數據的全部增刪查改工做。

1.1.3 URI

能夠用一個URI(統一資源定位符)指向資源,即每一個URI都對應一個特定的資源。要獲取這個資源,訪問它的URI就能夠,所以URI就成了每個資源的地址或識別符。通常的,每一個資源至少有一個URI與之對應,最典型的URI即URL。

1.1.4 無狀態

所謂無狀態的,即全部的資源,均可以經過URI定位,並且這個定位與其餘資源無關,也不會由於其餘資源的變化而改變。有狀態和無狀態的區別,舉個簡單的例子說明一下。如查詢員工的工資,若是查詢工資是須要登陸系統,進入查詢工資的頁面,執行相關操做後,獲取工資的多少,則這種狀況是有狀態的,由於查詢工資的每一步操做都依賴於前一步操做,只要前置操做不成功,後續操做就沒法執行;若是輸入一個url便可獲得指定員工的工資,則這種狀況是無狀態的,由於獲取工資不依賴於其餘資源或狀態,且這種狀況下,員工工資是一個資源,由一個url與之對應,能夠經過HTTP中的GET方法獲得資源,這是典型的RESTful風格。

SOA 2.0框架  

負載均衡  http://conf.ctripcorp.com/pages/viewpage.action?pageId=148259144

主要部件

  • 高性能RESTful服務框架,包括服務端(Service-Side)框架和客戶端(Client-Side)框架。
  • 合同驅動(Contract Driven)代碼生成工具,自動從WSDL生成服務端和客戶端代理(Proxy)。
  • 服務資產庫(Service Repository),CTrip服務元數據中央數據庫(Single Sourth of Truth)。
  • 服務註冊表(Service Registry),提供動態服務路由查詢(lookup)。
  • 安全和配置服務,統一和中央的安全和配置信息管理,直接和目標服務進行同步。
  • 實時和歷史監控,提供實時和歷史服務性能的監控dashboard,保障服務SLA。

SOA 2.0平臺架構主要劃分爲設計開發時平臺和運行時平臺兩大部分:

設計開發時平臺主要有代碼生成工具服務資產庫組成,主要涉及的角色包括:

  • 架構師 - 負責服務的架構,設計和評審工做。
  • SOA開發者 - 負責服務的設計,實現和單元測試。
  • SOA測試員 - 負責對服務進行集成和性能測試。

架構師和SOA開發者首先在服務資產庫中註冊服務,而後業務需求定義服務接口合同(WSDL),而後開發者經過代碼生成工具從WSDL生成出服務端(或者客戶端)代碼,

並根據具體業務實現服務的業務邏輯和作單元集成測試,服務在經過測試人員測試後會被最終部署到生成環境。

運行時平臺主要有服務端和客戶端框架組成,同時包括服務監控和安全策略控制部件,運行時主要涉及的角色是:

  • 運維工程師 - 監控服務的實時和歷史性能,並對服務進行安全控制和配置管理。

服務端和客戶端框架會將運行時性能以dashboard的方式展現出來,供運維人員監控服務的性能和健康情況,同時運維人員

可根據須要對服務進行動態配置和進行安全設置。

服務註冊表(Registry)是設計開發時和運行時平臺之間的一個橋樑,它按期同步服務資產庫(Repository)中的服務路由信息並作本地緩存,

服務客戶端在運行時經過服務註冊表進行動態地服務路由查詢。

爲保證服務質量,防止級聯失敗(Cascade Failure),SOA 2.0服務框架還包括一個稱爲電路保護器(CircuitBreaker)的容錯部件,

當服務器過載時,電路保護期負責限流(Rate Limiting)以防止服務性能進一步惡化。

 反射

咱們.java文件在編譯後會變成.class文件,這就像是個鏡面,自己是.java,在鏡中是.class,他們實際上是同樣的;那麼同理,咱們看到鏡子的反射是.class,就能經過反編譯,瞭解到.java文件的原本面目。即爲反射。

官方給出的概念:反射是java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查而且對內部的成員進行操做。例如它容許一個java的類獲取它全部的成員變量和方法而且顯示出來。

百度面試題

1.介紹項目,圍繞項目問了一些問題

2.算法3題:

1).KMP匹配子串

2).給定100萬個字符串,求出現頻率最高的10個

3).實現java parseInt

4.linux問題:刪除nginx進程,刪除全部名稱中含有nginx的進程,查找某個文件夾中包含某個字符串的全部文件名

5.數據庫索引問題

6.java裏面鎖的種類,實現方式

相關文章
相關標籤/搜索