范型java
① java 泛型如何使用
拿LIST做例子吧,泛型就是保證了LIST存儲的內容的類型。
比如List<String> slist,那就可以直接往slist里存String類型的東西,取出來時也不用做類型轉換,直接slist.get(i)就是取出內容了。如果非泛型的LIST,取出來是object類型,要做類型轉換
② java方面主流的技術有哪些
Structs hibernate spring Struts
Struts是一個基於Sun J2EE平台的MVC框架,主要是採用Servlet和JSP技術來實現的。
Struts框架可分為以下四個主要部分,其中三個就和MVC模式緊密相關:
1、模型(Model),本質上來說在Struts中Model是一個Action類(這個會在後面詳細討論),開發者通過其實現商業邏輯,同時用戶請求通過控制器(Controller)向Action的轉發過程是基於由struts-config.xml文件描述的配置信息的。
2、視圖(View),View是由與控制器Servlet配合工作的一整套JSP定製標簽庫構成,利用她們我們可以快速建立應用系統的界面。
3、控制器(Controller),本質上是一個Servlet,將客戶端請求轉發到相應的Action類。
4、一堆用來做XML文件解析的工具包,Struts是用XML來描述如何自動產生一些JavaBean的屬性的,此外Struts還利用XML來描述在國際化應用中的用戶提示信息的(這樣一來就實現了應用系統的多語言支持)。
Spring
Spring是輕量級的J2EE應用程序框架。
Spring的核心是個輕量級容器(container),實現了IoC(Inversion of Control)模式的容器,Spring的目標是實現一個全方位的整合框架,在Spring框架下實現多個子框架的組合,這些子框架之間彼此可以獨立,也可以使用其它的框架方案加以替代,Spring希望提供one-stop shop的框架整合方案 。
Spring不會特別去提出一些子框架來與現有的OpenSource框架競爭,除非它覺得所提出的框架夠新夠好,例如Spring有自己的 MVC框架方案,因為它覺得現有的MVC方案有很多可以改進的地方,但它不強迫您使用它提供的方案,您可以選用您所希望的框架來取代其子框架,例如您仍可以在Spring中整合您的Struts框架 。
Spring的核心概念是IoC,IoC的抽象概念是「依賴關系的轉移」,像是「高層模組不應該依賴低層模組,而是模組都必須依賴於抽象」是 IoC的一種表現,「實現必須依賴抽象,而不是抽象依賴實現」也是IoC的一種表現,「應用程序不應依賴於容器,而是容器服務於應用程序」也是IoC的一種表現。
Spring的架構性的好處
Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的framework,你會發現Spring關注了遺留下的問題。
.Spring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統的可測試性和面向對象特性。
Spring 能消除使用各種各樣格式的屬性定製文件的需要,在整個應用和工程中,可通過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。Spring能通過介面而不是類促進好的編程習慣,減少編程代價到幾乎為零。
.Spring被設計為讓使用它創建的應用盡可能少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。
.使用Spring構建的應用程序易於單元測試。
.Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務介面,卻不會影響調用代碼。
.Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web應用。例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的資料庫打交道,甚至不需要JTA實現。
.Spring為數據存取提供了一致的框架,不論是使用JDBC或O/R mapping產品(如Hibernate)。
Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。
Spring能做什麼?
Spring提供許多功能,在此我將快速地依次展示其各個主要方面。
任務描述:
首先,讓我們明確Spring范圍。盡管Spring覆蓋了許多方面,但我們已經有清楚的概念,它什麼應該涉及和什麼不應該涉及。
Spring的主要目的是使J2EE易用和促進好編程習慣。
Spring 不重新開發已有的東西。因此,在Spring中你將發現沒有日誌記錄的包,沒有連接池,沒有分布事務調度。這些均有開源項目提供(例如 Commons Logging 用來做所有的日誌輸出,或Commons DBCP用來作數據連接池),或由你的應用程序伺服器提供。因為同樣的的原因,我們沒有提供O/R mapping層,對此,已有有好的解決辦法如Hibernate和JDO。
Spring的目標是使已存在的技術更加易用。例如,盡管我們沒有底層事務協調處理,但我們提供了一個抽象層覆蓋了JTA或任何其他的事務策略。
Spring沒有直接和其他的開源項目競爭,除非我們感到我們能提供新的一些東西。例如,象許多開發人員,我們從來沒有為Struts高興過,並且感到在MVC web framework中還有改進的餘地。在某些領域,例如輕量級的 IoC容器和AOP框架,Spring有直接的競爭,但是在這些領域還沒有已經較為流行的解決方案。(Spring在這些區域是開路先鋒。)
Spring也得益於內在的一致性。
所有的開發者都在唱同樣的的贊歌,基礎想法依然是Expert One-on-One J2EE設計與開發的那些。
並且我們已經能夠使用一些主要的概念,例如倒置控制,來處理多個領域。
Spring在應用伺服器之間是可移植的。
當然保證可移植性總是一次挑戰,但是我們避免任何特定平台或非標准化,並且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的應用伺服器上的用戶。
Spring的核心即是個IoC/DI的容器,它可以幫程序設計人員完成組件之間的依賴關系注入,使得組件之間的依賴達到最小,進而提高組件的重用性,Spring是個低侵入性(invasive)的框架,Spring中的組件並不會意識到它正置身於Spring中,這使得組件可以輕易的從框架中脫離,而幾乎不用任何的修改,反過來說,組件也可以簡單的方式加入至框架中,使得組件甚至框架的整合變得容易。
Spring最為人重視的另一方面是支持AOP(Aspect-Oriented Programming),然而AOP框架只是Spring支持的一個子框架,說Spring框架是AOP框架並不是一件適當的描述,人們對於新奇的 AOP關注映射至Spring上,使得人們對於Spring的關注集中在它的AOP框架上,雖然有所誤解,但也突顯了Spring的另一個令人關注的特色。
Spring也提供MVC Web框架的解決方案,但您也可以將自己所熟悉的MVC Web框架與Spring解合,像是Struts、Webwork等等,都可以與Spring整合而成為進用於自己的解決方案。Spring也提供其它方面的整合,像是持久層的整合如JDBC、O/R Mapping工具(Hibernate、iBATIS)、事務處理等等,Spring作了對多方面整合的努力,故說Spring是個全方位的應用程序框架。
AJAX
AJAX
全稱「Asynchronous JavaScript and XML」(非同步JavaScript和XML),是指一種創建互動式網頁應用的網頁開發技術。它有機地包含了以下幾種技術:基於web標准(standards-based presentation)XHTML+CSS的表示; 使用 DOM(Document Object Model)進行動態顯示及交互; 使用 XML 和 XSLT 進行數據交換及相關操作; 使用 XMLHttpRequest 進行非同步數據查詢、檢索;使用 JavaScript 將所有的東西綁定在一起。
類似於DHTML或LAMP,AJAX不是指一種單一的技術,而是有機地利用了一系列相關的技術。事實上,一些基於AJAX的「派生/合成」式(derivative/composite)的技術正在出現,如「AFLAX」。
ajax優勢
傳統的web應用允許用戶填寫表單(form),當提交表單時就向web伺服器發送一個請求。伺服器接收並處理傳來的表單,然後返回一個新的網頁。這個做法浪費了許多帶寬,因為在前後兩個頁面中的大部分HTML代碼往往是相同的。由於每次應用的交互都需要向伺服器發送請求,應用的響應時間就依賴於伺服器的響應時間。這導致了用戶界面的響應比本地應用慢得多。與此不同,AJAX應用可以僅向伺服器發送並取回必需的數據,它使用SOAP或其它一些基於XML的web service介面,並在客戶端採用JavaScript處理來自伺服器的響應。因為在伺服器和瀏覽器之間交換的數據大量減少,結果我們就能看到響應更快的應用。同時很多的處理工作可以在發出請求的客戶端機器上完成,所以Web伺服器的處理時間也減少了。
Hibernate
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了輕量級的對象封裝,使得Java程序員可以使用對象編程思維來操縱資料庫。Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化。它還可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序實用,也可以在Servlet/JSP的Web應用中使用
Hibernate不會對您造成妨礙,也不會強迫您修改對象的行為方式。它們不需要實現任何不可思議的介面以便能夠持續存在。惟一需要做的就是創建一份XML「映射文檔」,告訴Hibernate您希望能夠保存在資料庫中的類,以及它們如何關聯到該資料庫中的表和列,然後就可以要求它以對象的形式獲取數據,或者把對象保存為數據。與其他解決方案相比,它幾乎已經很完美了。
運行時,Hibernate讀取映射文檔,然後動態構建Java類,以便管理資料庫與Java之間的轉換。在Hibernate中有一個簡單而直觀的API,用於對資料庫所表示的對象執行查詢。要修改這些對象,(一般情況下)只需在程序中與它們進行交互,然後告訴Hibernate保存修改即可。類似地,創建新對象也很簡單;只需以常規方式創建它們,然後告訴Hibernate有關它們的信息,這樣就能在資料庫中保存它們。
Hibernate API學習起來很簡單,而且它與程序流的交互相當自然。在適當的位置調用它,就可以達成目的。它帶來了很多自動化和代碼節省方面的好處,所以花一點時間學習它是值得的。而且還可以獲得另一個好處,即代碼不用關心要使用的資料庫種類(否則的話甚至必須知道)。我所在的公司就曾有過在開發過程後期被迫更換資料庫廠商的經歷。這會造成巨大的災難,但是藉助於Hibernate,只需要簡單地修改Hibernate配置文件即可。
這里的討論假定您已經通過創建Hibernate映射文檔,建立了一個關系資料庫,並且擁有要映射的Java類。有一個Hibernate「工具集」可在編譯時使用,以支持不同的工作流。例如,如果您已經擁有Java類和映射文檔,Hibernate可以為您創建(或更新)必需的資料庫表。或者,僅僅從映射文檔開始,Hibernate也能夠生成數據類。或者,它可以反向設計您的資料庫和類,從而擬定映射文檔。還有一些用於Eclipse的alpha 插件,它們可以在IDE中提供智能的編輯支持以及對這些工具的圖形訪問。
如果您使用的是Hibernate 2環境,這些工具鮮有提供,但是存在可用的第三方工具。
使用Hibernate的場合
既然Hibernate看起來如此靈活好用,為什麼還要使用其他的工具呢?下面有一些場景,可以幫助您做出判斷(或許通過提供一些比較和上下文,可以有助於鑒別非常適用Hibernate的場合)。
如果應用對於數據存儲的需要十分簡單——例如,您只想管理一組用戶優先選擇——您根本不需要資料庫,更不用說一個優秀的對象-關系映射系統了(即使它也如Hibernate這般易於使用)!從Java 1.4開始,有一個標準的Java Preferences API可以很好地發揮這個作用。(在ONJava文章中可以找到有關Preferences API的更多信息。)
對於熟悉使用關系資料庫和了解如何執行完美的SQL查詢與企業資料庫交互的人來說,Hibernate似乎有些礙手礙腳,這就像帶有動力和自動排擋的快艇車會使注重性能的賽車駕駛員不耐煩一樣。如果您屬於這種人,如果您所在的項目團隊擁有一個強大的DBA,或者有一些存儲過程要處理,您可能想研究一下iBATIS。Hibernate的創建者本身就把iBATIS當作是另一種有趣的選擇。我對它很有興趣,因為我們曾為一個電子商務站點開發了一個類似的系統(其功能更為強大),而且從那時到現在,我們已經在其他環境中使用過它,盡管在發現Hibernate之後,在新項目中我們通常更喜歡使用Hibernate。您可以認為,以SQL為中心的解決方案(比如iBATIS)是「反向的」對象/關系映射工具,而Hibernate是一個更為傳統的ORM。
當然,還有其他的外部原因會導致採用另外的方法。比如,在一個企業環境中,必須使用成熟的EJB架構(或者其他的一些非普通對象映射系統)。可以為提供自己的數據存儲工具的平台量身定做代碼,比如Mac OS X's Core Data。使用的可能是像XML DTD這樣的存儲規范,而它根本不涉及關系資料庫。
③ 數組和泛型的區別
數組是JAVA語言內置的數據類型,它是一個線性的序列,所以它可以快速的訪問其他的元素。但是速度是要有代價的,當你創建了一個數組之後,它的容量就固定了,而且在其生命周期里是不能改變的。還有一點,JAVA裡面的數組是會做邊界檢查的,所以當你越界訪問時,會拋出RuntimeException,所以不用擔心在C或C++因為不做邊界檢查而出現的問題了,當然邊界檢查是以犧牲效率為代價的。數組與其它容器類的區別體現在三個方面:效率、類型識別和可以持有primitives。
JAVA裡面提供的其他容器還包括List,Set和Map。他們處理對象的時候就好像這些這些對象都沒有自己的類型一樣,容器將它所含的元素都看成是JAVA中所有類的根類Object類型的,這樣我們只需創建一種容器,就能把所有的類型的對象全部放進去。但是當取出的時候,那就需要我們自己進行類型轉換了,不過在JAVA Tiger版裡面新引入了「泛型」的概念,結合容器類一起使用就可以解決類型轉換的問題,關於「泛型」這就不詳細講解了。從上面的角度來看,這種做法很不錯,但是就是苦了primitives,如果是常量的話,可以把primitive轉換成wrapper類然後放進容器裡面,如果是變數的話,那就只能放在你自己的類里了。與其他容器類相比,數組會在編譯的時候作類型檢查,從而防止你插入錯誤類型的對象,或者在提取對象的時候把對象的類型給搞錯了,JAVA在編譯和運行的時候都能阻止你將一個不恰當的消息傳給對象。至於效率,數組無疑是要高於其他容器類的,因為有些容器類的實現就是基於數組的,比如ArrayList。不論從類型檢查還是效率的角度來考慮,我們首選數組來作為容器都是沒錯的,但是數組的缺點就是功能太弱了,所以才會有容器類的出現。
要多說幾句的就是,java.util包裡面有一個Arrays類,它包括了一組可以用於數組的static的工具方法,其中最基本的是四個方法:用來比較兩個數組是否相等的equals();用來填充數組的fill();用來對數組進行排序的sort();以及用於在一個已經排序的數組中查找元素的binarySearch()。所有這些方法都對primitives和Object進行了重載。此外還有一個asList()方法,它接受一個數組,然後把它轉成一個List容器。JAVA標准類庫還提供了一個System.array()的靜態方法,它能以較快的速度拷貝數組,對primitive和Object都進行了重載,但是注意當對Object數組進行拷貝時,進行的是淺拷貝(shallow )。