- IOC的優勢是什麼
- IO 和 NIO的區別,NIO優勢
- Java 8 / Java 7 爲咱們提供了什麼新功能
- 什麼是競態條件? 舉個例子說明。
- JRE、JDK、JVM 及 JIT 之間有什麼不一樣
- MVC的各個部分都有那些技術來實現?如何實現?
- RPC 通訊和 RMI 區別
- 什麼是 Web Service(Web服務)
- JSWDL開發包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。
- WEB容器主要有哪些功能? 並請列出一些常見的WEB容器名字。
11,IOC,Inversion of Control控制反轉,html
spring的三大核心:IOC控制反轉,DI依賴注入,AOP面向切面編程java
通俗的理解是:日常咱們new一個實例,這個實例的控制權是咱們程序員,而控制反轉是指new實例工做不禁咱們程序員來作而是交給spring容器來作。linux
反轉控制的優勢:實現組件之間的解耦,提升程序的靈活性和可維護性程序員
IOC的缺點:複雜不利於理解,執行效率有損耗, 缺乏IDE支持web
一、建立對象的步驟變複雜了,不直觀,固然這是對不習慣這種方式的人來講的。
二、由於使用反射來建立對象,因此在效率上會有些損耗。但相對於程序的靈活性和可維護性來講,這點損耗是微不足道的。
三、缺乏IDE重構的支持,若是修改了類名,還需到XML文件中手動修改,這彷佛是全部XML方式的缺憾所在
12 ,Java中I/O操做主要是指使用Java進行輸入,輸出操做spring
java.nio全稱java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,爲全部的原始類型(boolean類型除外)提供緩存支持的數據容器,使用它能夠提供非阻塞式的高伸縮性網絡。apache
咱們在寫java程序的時候,爲了進行優化,把所有的精力用在了處理效率上,可是對IO的關注卻不多。這也多是由之前java早期時JVM在解釋字節碼時速度慢,運行速率大大低於本地編譯代碼,所以之前每每忽視了IO的優化。可是如今JVM在運行時優化已前進了一大步,如今的java應用程序更多的是受IO的束縛,也就是將時間花在等待數據傳輸上。如今有了NIO,就能夠減小IO的等待時間,從而提高IO的效率編程
java io 和java nio的區別:有三點主要區別:IO面向流,是阻塞IO,無選擇器。NIO面向緩衝,是非阻塞IO,有選擇器。設計模式
一、面向流與面向緩衝api
Java IO和NIO之間第一個最大的區別是,IO是面向流的,NIO是面向緩衝區的。 Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取全部字節,它們沒有被緩存在任何地方。此外,它不能先後移動流中的數據。若是須要先後移動從流中讀取的數據,須要先將它緩存到一個緩衝區。 Java NIO的緩衝導向方法略有不一樣。數據讀取到一個它稍後處理的緩衝區,須要時可在緩衝區中先後移動。這就增長了處理過程當中的靈活性。可是,還須要檢查是否該緩衝區中包含全部您須要處理的數據。並且,需確保當更多的數據讀入緩衝區時,不要覆蓋緩衝區裏還沒有處理的數據。
二、阻塞與非阻塞IO
Java IO的各類流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據徹底寫入。該線程在此期間不能再幹任何事情了。Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,可是它僅能獲得目前可用的數據,若是目前沒有數據可用時,就什麼都不會獲取,而不是保持線程阻塞,因此直至數據變的能夠讀取以前,該線程能夠繼續作其餘的事情。 非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不須要等待它徹底寫入,這個線程同時能夠去作別的事情。 線程一般將非阻塞IO的空閒時間用於在其它通道上執行IO操做,因此一個單獨的線程如今能夠管理多個輸入和輸出通道(channel)。
三、選擇器(Selectors)
Java NIO的選擇器容許一個單獨的線程來監視多個輸入通道,你能夠註冊多個通道使用一個選擇器,而後使用一個單獨的線程來「選擇」通道:這些通道里已經有能夠處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
注意:JVM 是把雙刃劍。它提供了統一的操做環境,讓 Java 程序員不用再爲操做系統環境的區別而煩惱。與特定平臺相關的細枝末節大都被隱藏了起來,於是代碼寫得又快又容易。可是隱藏操做系統的技術細節也意味着某些個性鮮明、功能強大的特性被擋在了門外。
1三、
JAVA5的新功能簡介:
一、泛型。二、枚舉。三、自動拆裝箱。四、可變長參數。五、註釋。六、靜態導入。七、增強for循環(for(int n:numbers))
八、新的格式化方法(java.util.Formatter)
formatter.format("Remaining account balance: $%.2f", balance);
九、新的線程模型和併發庫Thread Framework
JAVA6的新功能簡介:
一、引入了一個支持腳本引擎的新框架。二、UI的加強。三、對WebService支持的加強(JAX-WS2.0和JAXB2.0)。
四、一系列新的安全相關的加強五、JDBC4.0六、Compiler API七、通用的Annotations支持
JAVA7的新功能簡介:
1,switch中可使用字串2,菱形泛型
1.switch能夠接受string類型而不像之前僅僅是int;2.異常catch能夠一次處理完而不像之前一層層的surround;3.泛型類實例化也不用繁瑣的將泛型聲明再寫一遍;4.文件讀寫 會自動關閉流而不像之前那樣須要在finally中顯式close;5.數值可使用下劃線分隔;6.文件讀寫功能加強,有更簡單的api調用;7.文件改變的事件通知功能;8.多核 並行計算的支持增強 fork join 框架;9.還有一些動態特性的加入。
JAVA8的新功能簡介:
1Lambda表達式2接口的默認方法與靜態方法三、方法引用四、重複註解五、擴展註解的支持六、Optional七、Stream八、Date/Time API (JSR 310)九、JavaScript引擎Nashorn十、Base6411更好的類型推測機制、12編譯器優化1三、併發(Concurrency)1四、Nashorn引擎jjs15類依賴分析器jdeps16JVM的PermGen空間被移除
1四、競態條件(race condition)是指設備或系統出現不恰當的執行時序,而獲得不正確的結果。
在java中競態條件出如今多線程中。有兩種狀況:1,先檢測後執行,而執行後的結果影響檢測,2,延遲性初始化,兩個線程同時執行單例初始化;
如對於main線程,若是文件a不存在,則建立文件a,可是在判斷文件a不存在以後,Task線程建立了文件a,這時候先前的判斷結果已經失效,(main線程的執行依賴了一個錯誤的判斷結果)此時文件a已經存在了,可是main線程仍是會繼續建立文件a,致使Task線程建立的文件a被覆蓋、文件中的內容丟失等等問題。
線程a和線程b同時執行getInstance(),線程a看到instance爲空,建立了一個新的Obj對象,此時線程b也須要判斷instance是否爲空,此時的instance是否爲空取決於不可預測的時序:包括線程a建立Obj對象須要多長時間以及線程的調度方式,若是b檢測時,instance爲空,那麼b也會建立一個instance對象
1五、首先對術語進行解釋:JVM是java虛擬機,JRE是java運行環境,JDK是java開發工具箱,JIT是java的即時編輯器
JVM實現java的跨平臺特性
JRE是java的運行環境,爲java運行提供基礎
JDK是封裝了部分經常使用代碼,使開發簡化
JIT提升了JVM的編碼效率
java虛擬機(JVM)
使用java編程語言的主要優點就是平臺的獨立性。你曾經想知道過java怎麼實現平臺的獨立性嗎?對,就是虛擬機,它抽象化了硬件設備,開發者和他們的程序的得以操做系統。虛擬機的職責就是處理和操做系統的交流。java不一樣的接口規範對任何平臺都有良好的支持,由於jvm很好的實現了每一個平臺的規範。jvm能夠理解僞代碼字節碼,在用戶和操做系統之間創建了一層樞紐。
java運行時環境(JRE)
java運行時環境是JVM的一個超集。JVM對於一個平臺或者操做系統是明確的,而JRE確實一個通常的概念,他表明了完整的運行時環境。咱們在jre文件夾中看到的全部的jar文件和可執行文件都會變成運行時的一部分。事實上,運行時JRE變成了JVM。因此對於通常狀況時候使用JRE,對於明確的操做系統來講使用JVM。當你下載了JRE的時候,也就自動下載了JVM。
java開發工具箱(JDK)
java開發工具箱指的是編寫一個java應用所須要的全部jar文件和可執行文件。事實上,JRE是JKD的一部分。若是你下載了JDK,你會看到一個名叫JRE的文件夾在裏面。JDK中要被牢記的jar文件就是tools.jar,它包含了用於執行java文檔的類還有用於類簽名的jar包。
即時編譯器(JIT)
即時編譯器是種特殊的編譯器,它經過有效的把字節碼變成機器碼來提升JVM的效率。JIT這種功效很特殊,由於他把檢測到的類似的字節碼編譯成單一運行的機器碼,從而節省了CPU的使用。這和其餘的字節碼編譯器不一樣,由於他是運行時(第一類執行的編譯?)the firs of its kind to perform the compilation(從字節碼到機器碼)而不是在程序運行以前。正是由於這些,動態編譯這個詞彙才和JIT有那麼緊密的關係。
1六、MVC是Model-View-Controller的縮寫,是一種軟件設計典範和依據。
M是指業務模型,V是指用戶界面,C則是控制器。經過業務模型和用戶界面的隔離,達到下降代碼耦合度,提升代碼重用性,容易部署,生命週期短,容易維護的目的
M:hibernate/mybatis/ibatis C:severlet/struts/spring action V:jsp/FreeMarker/tails/taglib/EL/Velocity
mvc是一種設計模式,許多框架都運用了這一思想
java中的struts2框架,spring框架,PHP中的ZF框架,微軟的.NET框架
1七、
RPC(Remote Procedure Call Protocol)遠程過程調用協議,經過網絡從遠程計算機上請求調用某種服務
RMI:遠程方法調用(Remote Method Invocation)。可以讓在客戶端Java虛擬機上的對象像調用本地對象同樣調用服務端java 虛擬機中的對象上的方法。
二者區別:
1. RPC 不支持對象, 採用http協議; RMI支持傳輸對象。採用tcp/ip 協議
2.RMI只限於JAVA語言,RPC跨語言
3方法調用方式不一樣:
RMI中是經過在客戶端的Stub對象做爲遠程接口進行遠程方法的調用。每一個遠程方法都具備方法簽名。若是一個方法在服務器上執行,可是沒有相匹配的簽名被添加到這個遠程接口(stub)上,那麼這個新方法就不能被RMI客戶方所調用。
RPC中是經過網絡服務協議向遠程主機發送請求,請求包含了一個參數集和一個文本值,一般造成「classname.methodname(參數集)」的形式。RPC遠程主機就去搜索與之相匹配的類和方法,找到後就執行方法並把結果編碼,經過網絡協議發回。
四、調用結果的返回形式不一樣:
Java是面向對象的,因此RMI的調用結果能夠是對象類型或者基本數據類型;
RMI的結果統一由外部數據表示 (External Data Representation, XDR) 語言表示,這種語言抽象了字節序類和數據類型結構之間的差別。
1八、
Web Service,網絡服務的本質,就是經過網絡調用其餘網站的資源。
計算機服務,能夠分爲本地服務和網絡服務。是對計算機資源的調用,處理,展現
本地服務,具備安全性高,資源有限,成本高,平臺移植性差的特色
網絡服務,能夠解決本地服務的缺點,並且容易維護升級,實現不一樣技術的聚合
最廣泛的一種說法就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access Protocol)協議是web service的主體,它經過HTTP或者SMTP等應用層協議進行通信,自身使用XML文件來描述程序的函數方法和參數信息,從而完成不一樣主機的異構系統間的計算服務處理。這裏的WSDL(Web Services Description Language)web 服務描述語言也是一個XML文檔,它經過HTTP向公衆發佈,公告客戶端程序關於某個具體的 Web service服務的URL信息、方法的命名,參數,返回值等。
1九、
JSWDL開發包定義了網絡服務規範,Web Service是基於網絡的、分佈式的模塊化組件,它執行特定的任務,遵照具體的技術規範,這些規範使得Web Service能與其餘兼容的組件進行互操做。
JAXP(Java API for XML Parsing) 定義了在Java中使用DOM, SAX, XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當你須要改變具體的實現時候也不須要修改代碼。
JAXM(Java API for XML Messaging) 是爲SOAP通訊提供訪問方法和傳輸機制的API。
WSDL是一種 XML 格式,用於將網絡服務描述爲一組端點,這些端點對包含面向文檔信息或面向過程信息的消息進行操做。這種格式首先對操做和消息進行抽象描述,而後將其綁定到具體的網絡協議和消息格式上以定義端點。相關的具體端點即組合成爲抽象端點(服務)。
SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML編碼信息的輕量級協議。
UDDI 的目的是爲電子商務創建標準;UDDI是一套基於Web的、分佈式的、爲Web Service提供的、信息註冊中心的實現標準規範,同時也包含一組使企業能將自身提供的Web Service註冊,以使別的企業可以發現的訪問協議的實現標準。
20、
web容器是一種服務程序,在服務器一個端口就有一個提供相應服務的程序,而這個程序就是處理從客戶端發出的請求,
Web容器的功能:1.通訊支持。2.控制servlet生命週期。3.多線程支持,爲每一個servlet請求建立一個線程,servlet運行完成後容器就會自動結束這個線程。
java 中的Web容器舉例:通常本地開發的話建議使用tomcat。linux系統建議使用jetty或apache hpptd。大型的項目就用JBOSS或webloigc