導航:首頁 > 編程語言 > java泛型編程指南

java泛型編程指南

發布時間:2023-08-31 14:59:28

Ⅰ 學java用哪本書好

1.《Java從入門到精通(第3版)》

這本書從Java初學者角度出發,通過通俗易懂的語言、豐富多彩的實例,詳細介紹了使用Java語言進行程序開發需要掌握的知識。

2.《Java核心技術卷1基礎知識》

Java領域最有影響力和價值的著作之一,與《Java編程思想》齊名。該書根據JavaSE7全面更新,系統全面講解Java語言的核心概念、語法、重要特性和開發方法,包含大量案例,實踐性強。

3.《Java並發編程實戰》

Java並發經典書籍,書中採用循序漸進的講解方式,從並發編程的基本理論入手,逐步介紹了在設計Java並發程序時各種重要的設計原則、設計模式以及思維模式,同時輔以豐富的示例代碼作為對照和補充,使得開發人員能夠更快地領悟Java並發編程的要領,圍繞著Java平台的基礎並發功能快速地構建大規模的並發應用程序。

4.《Java多線程編程核心技術》

資深Java專家10年經驗總結,全程案例式講解。結合大量實例,全面講解Java多線程編程中的並發訪問、線程間通信、鎖等難突破的核心技術與應用實踐。看這本書的朋友們,團長相信只要你們跟著這本書裡面的代碼敲、運行、思考,對於多線程的使用與理解一定會提高一大截。

5.《EffectiveJava(第3版)》

Google首席Java架構師傾情力作,這本書涵蓋Java7、Java8和Java9中語言和庫的各種新特性,可以深入了解Java平台的細微之處。團長個人覺得這本書並不適合入門的小白看,如果有一些Java開發經驗之後,再看這本書的話,才會受益匪淺。

6.《Java編程思想(第4版)》

本書包括操作符、控制執行流程、訪問許可權控制、復用類、多態、介面、通過異常處理錯誤、字元串、泛型、數組、容器深入研究、Iava』UO系統、枚舉類型、並發以及圖形化用戶界面等內容。這些豐富的內容,包含了Java語言基礎語法以及高級特性,適合各個層次的Java程序員閱讀。

7.《Java8實戰》

這本書是將Java8的新特性講解得最全最仔細的,如果你正在使用Java8,那麼一定要讀這本書。

8.《深入理解Java虛擬機第2版》

想要理解Java虛擬機其實並沒有你想像的那麼難,對於一個合格的Java程序員來說這類知識點是必須掌握的。這本書里提供了大量處理各種常見JVM問題的技巧和最佳實踐,還有若干與生產環境相結合的實戰案例。內容豐富,實戰性強。

9.《Spring實戰(第4版)》

《Spring實戰(第4版)》是經典的Spring學習和實踐指南。

全書分為四部分:

第一部分介紹Spring框架的核心知識;

第二部分在此基礎上介紹了如何使用Spring構建Web應用程序;

第三部分告別前端,介紹了如何在應用程序的後端使用Spring;

第四部分描述了如何使用Spring與其他的應用和服務進行集成。

《Spring實戰(第4版)》適用於已具有一定Java編程基礎的讀者,以及在Java平台下進行各類軟體開發的開發人員、測試人員,尤其適用於企業級Java開發人員。本書既可以被剛開始學習Spring的讀者當作學習指南,也可以被那些想深入了解Spring某方面功能的專業用戶作為參考用書。

Ⅱ java中的泛型 求詳細解釋

1、Java泛型
其實Java的泛型就是創建一個用類型作為參數的類。就象我們寫類的方法一樣,方法是這樣的method(String str1,String str2 ),方法中參數str1、str2的值是可變的。而泛型也是一樣的,這樣寫class Java_Generics<K,V>,這里邊的K和V就象方法中的參數str1和str2,也是可變。下面看看例子:
//code list 1
import Java.util.Hashtable;
class TestGen0<K,V>{
public Hashtable<K,V> h=new Hashtable<K,V>();
public void put(K k, V v) {
h.put(k,v);
}
public V get(K k) {
return h.get(k);
}
public static void main(String args[]){
TestGen0<String,String> t=new TestGen0<String,String>();
t.put("key", "value");
String s=t.get("key");
System.out.println(s);
}
}
正確輸出:value
這只是個例子(Java中集合框架都泛型化了,這里費了2遍事.),不過看看是不是創建一個用類型作為參數的類,參數是K,V,傳入的「值」是String類型。這個類他沒有特定的待處理型別,以前我們定義好了一個類,在輸入輸入參數有所固定,是什麼型別的有要求,但是現在編寫程序,完全可以不制定參數的類型,具體用的時候來確定,增加了程序的通用性,像是一個模板。
呵呵,類似C++的模板(類似)。
1.1. 泛型通配符
下面我們先看看這些程序:
//Code list 2
void TestGen0Medthod1(List l) {
for (Object o : l)
System.out.println(o);
}
看看這個方法有沒有異議,這個方法會通過編譯的,假如你傳入String,就是這樣List<String>。
接著我們調用它,問題就出現了,我們將一個List<String>當作List傳給了方法,JVM會給我們一個警告,說這個破壞了類型安全,因為從List中返回的都是Object類型的,而讓我們再看看下面的方法。
//Code list 3
void TestGen0Medthod1(List<String> l) {
for (Object o : l)
System.out.println(o);
}
因為這里的List<String>不是List<Object>的子類,不是String與Object的關系,就是說List<String>不隸屬於list<Object>,他們不是繼承關系,所以是不行的,這里的extends是表示限制的。
類型通配符是很神奇的,List<?>這個你能為他做什麼呢?怎麼都是「?」,它似乎不確定,他總不能返回一個?作為類型的數據吧,是啊他是不會返回一個「?」來問程序員的?JVM會做簡單的思考的,看看代碼吧,更直觀些。
//code list 4
List<String> l1 = new ArrayList<String>();
li.add(「String」);
List<?> l2 = l1;
System.out.println(l1.get(0));
這段代碼沒問題的,l1.get(0)將返回一個Object。
1.2. 編寫泛型類要注意:
1) 在定義一個泛型類的時候,在 「<>」之間定義形式類型參數,例如:「class TestGen<K,V>」,其中「K」 , 「V」不代表值,而是表示類型。
2) 實例化泛型對象的時候,一定要在類名後面指定類型參數的值(類型),一共要有兩次書寫。例如:
TestGen<String,String> t=new TestGen<String,String>();
3) 泛型中<K extends Object>,extends並不代表繼承,它是類型範圍限制。
2、泛型與數據類型轉換
2.1. 消除類型轉換
上面的例子大家看到什麼了,數據類型轉換的代碼不見了。在以前我們經常要書寫以下代碼,如:
//code list 5
import Java.util.Hashtable;
class Test {
public static void main(String[] args) {
Hashtable h = new Hashtable();
h.put("key", "value");
String s = (String)h.get("key");
System.out.println(s);
}
}
這個我們做了類型轉換,是不是感覺很煩的,並且強制類型轉換會帶來潛在的危險,系統可能會拋一個ClassCastException異常信息。在JDK5.0中我們完全可以這么做,如:
//code list 6
import Java.util.Hashtable;
class Test {
public static void main(String[] args) {
Hashtable<String,Integer> h = new Hashtable<String,Integer> ();
h.put("key", new Integer(123));
int s = h.get("key").intValue();
System.out.println(s);
}
}
這里我們使用泛化版本的HashMap,這樣就不用我們來編寫類型轉換的代碼了,類型轉換的過程交給編譯器來處理,是不是很方便,而且很安全。上面是String映射到String,也可以將Integer映射為String,只要寫成HashTable<Integer,String> h=new HashTable<Integer,String>();h.get(new Integer(0))返回value。果然很方便。

Ⅲ 零基礎學習Java的書籍有哪些,請推薦

作為Java程序員來說,最痛苦的事情莫過於可以選擇的范圍太廣,可以讀的書太多,往往容易無所適從。我想就我自己讀過的技術書籍中挑選出來一些,按照學習的先後順序,推薦給大家,特別是那些想不斷提高自己技術水平的Java程序員們。

一、Java編程入門類

對於沒有Java編程經驗的程序員要入門,隨便讀什麼入門書籍都一樣,這個階段需要你快速的掌握Java基礎語法和基本用法,宗旨就是「囫圇吞棗不求甚解」,先對Java熟悉起來再說。用很短的時間快速過一遍Java語法,連懵帶猜多寫寫代碼,要「知其然」。

1、《Java編程思想》

在有了一定的Java編程經驗之後,你需要「知其所以然」了。這個時候《Java編程思想》是一本讓你知其所以然的好書,它對於基本的面向對象知識有比較清楚的交待,對Java基本語法,基本類庫有比較清楚的講解,可以幫你打一個良好的Java編程基礎。這本書的缺點是實在太厚,也比較羅嗦,不適合現代人快節奏學習,因此看這本書要懂得取捨,不是每章每節都值得一看的,挑重點的深入看就可以了。

2、《Agile Java》中文版

這本書是出版社送給我的,我一拿到就束之高閣,放在書櫃一頁都沒有翻過,但是前兩天整理書櫃的時候,拿出來一翻,竟然發現這絕對是一本好書!這本書一大特點是以單元測試和TDD來貫穿全書的,在教你Java各種重要的基礎知識的過程中,潛移默化的影響你的編程思維走向敏捷,走向TDD。另外這本書成書很新,以JDK5.0的語法為基礎講解,要學習JDK5.0的新語法也不錯。還有這本書對於內容取捨也非常得當,Java語言畢竟類庫龐大,可以講的內容太多,這本書選擇的內容以及內容的多寡都很得當,可以讓你以最少的時間掌握Java最重要的知識,順便培養出來優秀的編程思路,真是一本不可多得的好書。

二、Java編程進階類

打下一個良好的Java基礎,還需要更多的實踐經驗積累,我想沒有什麼捷徑。有兩本書值得你在編程生涯的這個階段閱讀,培養良好的編程習慣,提高你的代碼質量。

1、《重構 改善既有代碼的設計》

這本書名氣很大,不用多介紹,可以在閑暇的時候多翻翻,多和自己的實踐相互印證。這本書對你產生影響是潛移默化的。

2、《測試驅動開發 by Example》

本書最大特點是很薄,看起來沒有什麼負擔。你可以找一個周末的下午,一邊看,一邊照做,一個下午就把書看完,這本書的所有例子跑完了。這本書的作用是通過實戰讓你培養TDD的思路。

還有一些比較基礎的入門書籍推薦給你

《Head First java開發》java開發入門書籍

《Head First java開發》是本完整的面向對象(object-oriented,OO)程序設計和java開發的學習指導。此書是根據學習理論所設計的,讓你可以從學習程序語言的基礎開始一直到包括線程、網路與分布式程序等項目。最重要的,你會學會如何像個面向對象開發者一樣去思考。但如果你真地想要好好地學習java開發,你會需要《Head First java開發》。這本書可是Amazon編輯推薦的十大好書之一!強烈推薦學習此書,非常適合初學者入門。

《java開發從入門到精通》

《java開發從入門到精通》這本書主要針對java開發基礎,對於沒有學過java開發的人才說,是一個不錯的選擇。通過這本書,大家可以從零開始,慢慢來學習,而且實操很多,不會讓你看到最後出現只會理論的情況。

《Thinking in java開發》(中文名:《java開發編程思想》)

《java開發編程思想》可以說是最經典的java開發著作,是所有java開發程序員必備教科書。這本書不管是正在學習還是已經工作許多年的程序員,都可以從這本書中得到你想要的東西。這本書具有教材和工具書的作用,就像一本字典,想知道什麼都可以從中查詢。雖然這本書很好,但並不建議初學者學習,對於初學者難度較大。

《瘋狂java開發講義》

《瘋狂的講義》這本書比較適合自學者,內容比較項目化,實操方法很多,如果你想進行java開發的深入學習,不妨看看這本書。

《java開發核心技術》

這本書分為兩個部分,第一個部分講的是基礎知識,第二個部分講的是高級特性。由於內容非常有層次,所以非常適合自學的同學學習。

《java開發開發實戰經典》

這本書比較適合自學者學習,裡面有很多小案例,可以邊學邊練,鞏固知識。

PS:溫馨提示,光看不練假把式,跟著視頻教程練項目也是必不可少的!相關教程指路B站尚學堂官方號!都是免費滴!

Ⅳ 給初學者推薦學習java的書籍

<JAVA開發實戰經典> 作者李興華 卓越 當當都有賣
800多頁的JAVA核心講解+DVD4G多的視頻教程,這是我買過的最好的JAVA書。其他的JAVA書我已經封存了。 而且本書實例居多,每行代碼都有注釋。足以表示作者的專業作風。其實作者李興華老師的課程我以前就聽過,非常符合現在的實用型開發。我在大學里邊選修的JAVA課程就是靠MLDN的視頻課程復習才過的。 我支持李老師的書!!

Ⅳ 零基礎學習Java的書籍有哪些,請推薦,謝謝

《瘋狂java講義》 對於這本書,相信大家不陌生,《瘋狂講義》這本書深入介紹了java編程的相關方面,這本書的內容有Java基本語法結構、面向對象特徵、集合框架體系、 泛型、異常處理、GUI編程、JDBC資料庫編程、注釋、的IO流體系、多線程編程、網路通信編程、反射機制和java開發中需要的jar包、類和介面。

Ⅵ 零基礎學習Java的書籍有哪些,請推薦

入門類
1.《java從入門到精通》(第3版)
【內容介紹】

本書從初學者角度出發,通過通俗易懂的語言、豐富多彩的實例,詳細介紹了使用Java語言進行程序開發應該掌握的各方面技術。全書共分28章,包括:初
識Java,熟悉Eclipse開發工具,Java
語言基礎,流程式控制制,字元串,數組,類和對象,包裝類,數字處理類,介面、繼承與多態,類的高級特性,異常處理,Swing程序設計,集合類,I/O輸入
輸出,反射,枚舉類型與泛型,多線程,網路通信,資料庫操作,Swing表格組件,Swing樹組件,Swing其他高級組件,高級布局管理器,高級事件
處理,AWT繪圖與音頻播放,列印技術和企業進銷存管理系統等。所有知識都結合具體實例進行介紹,涉及的程序代碼給出了詳細的注釋,可以使讀者輕松領會
Java程序開發的精髓,快速提高開發技能。
【推薦理由】
本書內容詳盡,實例豐富,非常適合作為編程初學者的學慣用書,也適合作為開發人員的查閱、參考資料。
2.《java核心技術卷一》
【內容介紹】

本書是Java技術經典參考書,多年暢銷不衰,第7版在保留以前版本風格的基礎上,涵蓋Java2開發平台標准版J2SE5.0的基礎知識,主要內容包
括面各對象程序設計、反射與代理、介面與內部類、事件監聽器模型、使用Swing
UI工具箱進行圖形用戶界面設計,異常處理、流輸入/輸出和對象序列化、泛型程序設計等。本書內容翔實、深入淺出,附有大量程序實例,極具實用價值,是
Java初學者和Java程序員的必備參考書。
【推薦理由】
本書出版以來,深受廣大讀者的喜愛,它全面介紹了Java SE的基礎知識,不但具有使用價值,而且易於閱讀,易理解,它必成為想進軍Java和基礎薄弱同學的不二之選。
3.《java編程語言》
【內容介紹】

本書以Java語言創建者的獨特視角向讀者展現了為什麼以及如何使用Java語言,以便讀者理解Java語言的基本設計目標以及它在現實世界中的應用。
本書介紹的是Java語言的最新版本,該版本在《Java Language Specification,Second
Edition》中定義,在Java2SDK1.3標准版中實現。本書已是第三版,在經構上相對前兩版有所調整,重點講述了新的語言特徵,並提供了新
API的使用實例。本書完全覆蓋了Java語言當前版本的特徵和類庫,可以作為Java語言的入門向導,也可作為高級Java開發及Java語言教學的參
考用書。
【推薦理由】
本書介紹的是Java語言的最新版本,該版本在《Java
Language Specification,Second
Edition》中定義,在Java2SDK1.3標准版中實現。本書已是第三版,在經構上相對前兩版有所調整,重點講述了新的語言特徵,並提供了新
API的使用實例。本書完全覆蓋了Java語言當前版本的特徵和類庫,可以作為Java語言的入門向導,也可作為高級Java開發及Java語言教學的參
考用書。
進階類
1.《java編程思想》
【內容介紹】

本書共22章,包括操作符、控制執行流程、訪問許可權控制、復用類、多態、介面、通過異常處理錯誤、字元串、泛型、數組、容器深入研究、JavaI/O系
統、枚舉類型、並發以及圖形化用戶界面等內容。這些豐富的內容,包含了Java語言基礎語法以及高級特性,適合各個層次的Java程序員閱讀,同時也是高
等院校講授面向對象程序設計語言以及Java語言的絕佳教材和參考書。
【推薦理由】
本書贏得了全球程序員的廣泛贊譽,即使是最晦澀的概念,在BruceEckel的文字親和力和小而直接的編程示例面前也會化解於無形。從Java的基礎語法到最高級特性(深入的面向對象概念、多線程、自動項目構建、單元測試和調試等),本書都能逐步指導你輕松掌握。
2.《java核心技術卷二》
【內容介紹】

《JAVA核心技術卷2:高級特徵》是Java技術權威指南,全面覆蓋Java技術的高級主題,包括流與文件、XML、網路、資料庫編程、高級
Swing、高級 AWT、JavaBean構件、安全、分布式對象、腳本、編譯與註解處理等,同時涉及本地化、國際化以及Java SE
6的內容。《JAVA核心技術卷Ⅱ:高級特徵》對Java技術的闡述精確到位,敘述方式深入淺出,並包含大量示例,從而幫助讀者充分理解Java語言以及
Java類庫的相關特性。
【推薦理由】
本書是經典的《Java核心技術,卷II:高級
特性》的最新修訂版,涵蓋了Java
SE6平台的高級用戶界面程序設計和企業特性。與第1卷(涵蓋了核心的語言和類庫特性)一樣,本卷已經更新到了JavaSE6。並且對新內容都作了重點標
注。書中所有的示常式序都進行了詳細的設計,用來演示最新的編程技術。並展示針對專業開發者在現實中所碰到的典型問題的最佳解決方案。本書包含有關
StAXAPI、JDBC
4、編譯器API、腳本框架、閃屏和托盤API以及其他許多JavaSE6改進特性的新章節。本書聚焦於Java語言中更高級的特性,包括下列內容:流與
文件、網路、資料庫編程、XML、JNDI與LDAP、國際化、高級GUI組件、Java2D、JavaBeans、安全、RMI與Web服務、高級
AWT、註解、本地方法。
3.《瘋狂java講義》
【內容介紹】

本書深入介紹了Java編程的相關方面,全書內容覆蓋了Java的基本語法結構、Java的面向對象特徵、Java集合框架體系、Java泛型、異常處
理、Java
GUI編程、JDBC資料庫編程、Java注釋、Java的IO流體系、Java多線程編程、Java網路通信編程和Java反射機制。共覆蓋了
java.awt、java.lang、java.io和java.nio、java.sql、java.text、java.util、
javax.swing包下絕大部分類和介面。
【推薦理由】
本書並不單純從知識角度來
講解Java,而是從解決問題的角度來介紹Java語言,所以本書中介紹了大量實用案例開發。這些案例既能讓讀者鞏固每章的知識,又可以讓讀者學以致用、
激發編程自豪感,進而引爆內心的編程激情。本書光碟里包含書中所有示例的代碼,如果讀者希望獲得課後練習的程序代碼。
本書為所有打算深入掌握Java編程的讀者而編寫,適合各種層次的Java學習者和工作者閱讀,也適合作為大學教育、培訓機構的Java教材。但北大青鳥光谷校區專業老師認為,如果只是想簡單涉獵Java,則本書過於龐大,不適合閱讀。
JavaEE類
1.《javaWeb整合開發王者歸來》
【內容介紹】

本書全面介紹了Java Web開發中的各種相關技術及知識。全書分為9篇,內容層次清晰,難度循序漸進。第1篇為入門篇,內容包括Java
Web開發概述等;第2篇為基礎篇,內容包括Servlet技術、JSP技術、會話跟蹤、過濾器Filter、監聽器Listener等;第3篇為高級
篇,內容包括JSTL標簽庫的使用、如何自定義標簽、資源國際化、資料庫概述、JDBC詳解、XML概述等;第4篇為Struts框架篇,內容不僅包括
Struts 1.x的內容,也包括Struts
2.x中的內容;第5篇為Hibernate框架篇;第6篇為Spring框架篇;第7篇為EJB與Web服務篇,內容包括EJB
3概述、JPA規范Web服務框架XFire等;第8篇為工具篇,內容包括在Java
Web項目中常用的開源工具框架、主要有版本管理工具SVN、日誌工具commons-logging與Log4J、報表圖形引擎JFreeChart、
PDF組件iText等;第9篇為實戰篇,內容為兩個典型的應用系統:論壇系統(Spring+Struts+Hibernate)、寵物商店(EJB
3+JPA+Struts 2)。
【推薦理由】
資深Java程序員耗時一年時間寫作,十年開發經驗毫無保留。全面、系統、深入介紹Java Web開發的核心技術與主流框架。
2.《spring 入門到精通》
【內容介紹】

本書由淺入深,循序漸進地介紹了Spring的體系結構和相關知識點,目的是幫助初學者快速掌握Spring,並能使用Spring進行應用程序的開
發。本書最大的特色在於每章都是由淺入深,從一個簡單的示例入手,讓讀者快速了解本章內容,然後再詳細講解本章涉及的基本原理和知識點,最後再通過一個詳
細的示例宋鞏固所學內容。本書每一章的例子都是經過精挑細選,具有很強的針對性,力求讓讀者通過親自動手做而掌握其原理和方法,從而學習盡可能多的知識。
本書適用於初、中級軟體開發人員,同時也可用作高校相關專業師生和社會培訓班的教材。
【推薦理由】

全書共分14章,內容涵蓋了Spring的基礎概念、核心容器、Spring
AOP、事務處理、持久層封裝、Web框架、定時器、Spring和Struts、Spring和Hibernate、Spring和Ant、
Spring和Junit。本書適用於初、中級軟體開發人員,同時也可用作高校相關專業師生和社會培訓班的教材。
3.《JavaWeb開發詳解》
【內容介紹】
本書共分4部分,從XML、Servlet、JSP和應用的角度向讀者展示了Java Web開發中各種技術的應用,循序漸進地引導讀者快速掌握Java Web開發。
【推薦理由】
本書內容全面,涵蓋了從事Java Web開發所應掌握的所有知識,在知識的講解上本書採用理論與實踐相結合的方式,從程序運行的內部機制進行分析講解,並通過大量的實例和實驗來驗證並運用本書的知識。

Ⅶ java編程有哪幾本書比較適合初學者

對於Java的初學者來說,如果找一本比較合適的入門教材的話,完整地介紹Java的 語法、面向對象和主要的API核心庫等知識,那將對學習起到相當的促進作用。 我個人認為,一些經典的國外教材確實值得推崇,首先推薦要看的是《21天學通Ja va 2》、《循序漸進Java 2教程》、《Java2從入門到精通》等書看起來比較淺顯易 懂,將Java的基本只是都涉及到了,使你在很短的時間內掌握Java的基本內容。 看完這這本書之一以後,你就想對Java全面深入的學習,現在向你推薦《Java大學 教程》、《Java 2編程指南》等書,這幾本書對Java的語法、面向對象的知識和AP I函數庫等介紹的比較詳盡。讓你能夠比較熟練的使用Java來編程,解決一般的問題 。 最後向大家推薦的是《Java2核心技術》,這本書主要講述了Java的核心技術也是J ava的難點之處,具有很高的參考價值,無論是Java的初學者還是Java編程老手,都 能從此書受益。 這時候大家可能會注意到,其中竟然沒有大名鼎鼎的《Thinking in Java》這本書 。其實,這本書主要是從編程思想上來講的,並沒有完整的講述Java的整個體系, 而是一種類似Tips的方法來對Java的知識點進行深入的分析和解釋,就好像C++的經 典教材《C++ Primier》一樣,並不適合作為初學語言的入門教材,蛋是在深入學習 Java的過程中的同時來讀這本書會覺得受益匪淺。 值得一提的是,其實最有實用價值的是JDK-Document(下文中簡稱doc, http://ja va.sun.com/j2se/1.5.0/download.jsp中有離線版下載的,本例中只是列舉了1.5的 doc,在相應的地方可以下載1.4甚至1.3的doc)和Java Tutorial在線教程( http:/ /java.sun.com/docs/books/tutorial/這個是在線查看的,離線版的下載本人目前 還不知道)。在doc中有四個部分API 文檔(對SDK自帶的標准Java API都進行了詳 細的介紹,它是按照package來組織的,詳細介紹了每一個class的繼承關系,介面 的實現情況,以及所有public的屬性和方法,對於每個方法的用途、調用的參數、 參數的類型,返回值的類型、以及方法可能拋出的異常等等)、guide(對一些Jav a技術和概念進行講述)、relnotes(這個介紹新版本的JDK的發布信息以及新特點 )、tooldocs(主要對Java的所有命令進行講述)。Doc是我們每一個Java工作者在 編程時必須的手冊,目前只有英文版,sun中國社區正在進行漢化,相信不久就會出 現中文版的doc了。Tutorial也相當的不錯,主要針對初學者,不過對於其他階段的 Java學習者也有很大的幫助了。 以上主要針對J2SE的學習進行講述的,Java主要有J2SE、J2EE、J2ME三個部分,J2 SE是基礎。當我們對J2SE的學習掌握的差不多的時候,其實我們就會對Java的學習 有自己獨特的體會,就會發現每一個Java技術自己所帶的doc都對我們的學習有很大 的幫助。此外,經常去一些著名的網站上去看看各位網友的作品,對Java學習的心 得,確實對我們有很大提高,這里推薦 http://blog.csdn.net 。經常去圖書館或者 到書店去看看有關Java的書,看看它們是不是自己所需要的,這時候,選擇學習Ja va的書籍就會自己拿主意了。 在上述的一些書籍的介紹中,並非每本書都要看,可根據自己的實際情況進行選擇 ,或者像Java先行者咨詢即可。

Ⅷ java中什麼叫泛型

有泛型參數,泛型方法,這篇文件寫的很好,你仔細 讀一下,可以多讀幾次,總會有收獲滴
java泛型
java泛型

什麼是泛型?
泛型(Generic type 或者 generics)是對 Java 語言的類型系統的一種擴展,以支持創建可以按類型進行參數化的類。可以把類型參數看作是使用參數化類型時指定的類型的一個佔位符,就像方法的形式參數是運行時傳遞的值的佔位符一樣。
可以在集合框架(Collection framework)中看到泛型的動機。例如,Map 類允許您向一個 Map 添加任意類的對象,即使最常見的情況是在給定映射(map)中保存某個特定類型(比如 String)的對象。
因為 Map.get() 被定義為返回 Object,所以一般必須將 Map.get() 的結果強制類型轉換為期望的類型,如下面的代碼所示:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
要讓程序通過編譯,必須將 get() 的結果強制類型轉換為 String,並且希望結果真的是一個 String。但是有可能某人已經在該映射中保存了不是 String 的東西,這樣的話,上面的代碼將會拋出 ClassCastException。
理想情況下,您可能會得出這樣一個觀點,即 m 是一個 Map,它將 String 鍵映射到 String 值。這可以讓您消除代碼中的強制類型轉換,同時獲得一個附加的類型檢查層,該檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。這就是泛型所做的工作。

泛型的好處
Java 語言中引入泛型是一個較大的功能增強。不僅語言、類型系統和編譯器有了較大的變化,以支持泛型,而且類庫也進行了大翻修,所以許多重要的類,比如集合框架,都已經成為泛型化的了。這帶來了很多好處:
類型安全。 泛型的主要目標是提高 Java 程序的類型安全。通過知道使用泛型定義的變數的類型限制,編譯器可以在一個高得多的程度上驗證類型假設。沒有泛型,這些假設就只存在於程序員的頭腦中(或者如果幸運的話,還存在於代碼注釋中)。
Java 程序中的一種流行技術是定義這樣的集合,即它的元素或鍵是公共類型的,比如「String 列表」或者「String 到 String 的映射」。通過在變數聲明中捕獲這一附加的類型信息,泛型允許編譯器實施這些附加的類型約束。類型錯誤現在就可以在編譯時被捕獲了,而不是在運行時當作 ClassCastException 展示出來。將類型檢查從運行時挪到編譯時有助於您更容易找到錯誤,並可提高程序的可靠性。
消除強制類型轉換。 泛型的一個附帶好處是,消除源代碼中的許多強制類型轉換。這使得代碼更加可讀,並且減少了出錯機會。
盡管減少強制類型轉換可以降低使用泛型類的代碼的羅嗦程度,但是聲明泛型變數會帶來相應的羅嗦。比較下面兩個代碼例子。
該代碼不使用泛型:
List li = new ArrayList();
li.put(new Integer(3));
Integer i = (Integer) li.get(0);

該代碼使用泛型:
List<Integer> li = new ArrayList<Integer>();
li.put(new Integer(3));
Integer i = li.get(0);

在簡單的程序中使用一次泛型變數不會降低羅嗦程度。但是對於多次使用泛型變數的大型程序來說,則可以累積起來降低羅嗦程度。
潛在的性能收益。 泛型為較大的優化帶來可能。在泛型的初始實現中,編譯器將強制類型轉換(沒有泛型的話,程序員會指定這些強制類型轉換)插入生成的位元組碼中。但是更多類型信息可用於編譯器這一事實,為未來版本的 JVM 的優化帶來可能。
由於泛型的實現方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似於沒有泛型(和強制類型轉換)時所寫的代碼,只是更能確保類型安全而已。

泛型用法的例子
泛型的許多最佳例子都來自集合框架,因為泛型讓您在保存在集合中的元素上指定類型約束。考慮這個使用 Map 類的例子,其中涉及一定程度的優化,即 Map.get() 返回的結果將確實是一個 String:

Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");

如果有人已經在映射中放置了不是 String 的其他東西,上面的代碼將會拋出 ClassCastException。泛型允許您表達這樣的類型約束,即 m 是一個將 String 鍵映射到 String 值的 Map。這可以消除代碼中的強制類型轉換,同時獲得一個附加的類型檢查層,這個檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。
下面的代碼示例展示了 JDK 5.0 中集合框架中的 Map 介面的定義的一部分:

public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}
注意該介面的兩個附加物:
類型參數 K 和 V 在類級別的規格說明,表示在聲明一個 Map 類型的變數時指定的類型的佔位符。
在 get()、put() 和其他方法的方法簽名中使用的 K 和 V。
為了贏得使用泛型的好處,必須在定義或實例化 Map 類型的變數時為 K 和 V 提供具體的值。以一種相對直觀的方式做這件事:
Map<String, String> m = new HashMap<String, String>();
m.put("key", "blarg");
String s = m.get("key");
當使用 Map 的泛型化版本時,您不再需要將 Map.get() 的結果強制類型轉換為 String,因為編譯器知道 get() 將返回一個 String。
在使用泛型的版本中並沒有減少鍵盤錄入;實際上,比使用強制類型轉換的版本需要做更多鍵入。使用泛型只是帶來了附加的類型安全。因為編譯器知道關於您將放進 Map 中的鍵和值的類型的更多信息,所以類型檢查從執行時挪到了編譯時,這會提高可靠性並加快開發速度。

向後兼容
在 Java 語言中引入泛型的一個重要目標就是維護向後兼容。盡管 JDK 5.0 的標准類庫中的許多類,比如集合框架,都已經泛型化了,但是使用集合類(比如 HashMap 和 ArrayList)的現有代碼將繼續不加修改地在 JDK 5.0 中工作。當然,沒有利用泛型的現有代碼將不會贏得泛型的類型安全好處。

二 泛型基礎
類型參數
在定義泛型類或聲明泛型類的變數時,使用尖括弧來指定形式類型參數。形式類型參數與實際類型參數之間的關系類似於形式方法參數與實際方法參數之間的關系,只是類型參數表示類型,而不是表示值。
泛型類中的類型參數幾乎可以用於任何可以使用類名的地方。例如,下面是 java.util.Map 介面的定義的摘錄:
public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}
Map 介面是由兩個類型參數化的,這兩個類型是鍵類型 K 和值類型 V。(不使用泛型)將會接受或返回 Object 的方法現在在它們的方法簽名中使用 K 或 V,指示附加的類型約束位於 Map 的規格說明之下。
當聲明或者實例化一個泛型的對象時,必須指定類型參數的值:
Map<String, String> map = new HashMap<String, String>();
注意,在本例中,必須指定兩次類型參數。一次是在聲明變數 map 的類型時,另一次是在選擇 HashMap 類的參數化以便可以實例化正確類型的一個實例時。
編譯器在遇到一個 Map<String, String> 類型的變數時,知道 K 和 V 現在被綁定為 String,因此它知道在這樣的變數上調用 Map.get() 將會得到 String 類型。
除了異常類型、枚舉或匿名內部類以外,任何類都可以具有類型參數。

命名類型參數
推薦的命名約定是使用大寫的單個字母名稱作為類型參數。這與 C++ 約定有所不同(參閱 附錄 A:與 C++ 模板的比較),並反映了大多數泛型類將具有少量類型參數的假定。對於常見的泛型模式,推薦的名稱是:
K —— 鍵,比如映射的鍵。
V —— 值,比如 List 和 Set 的內容,或者 Map 中的值。
E —— 異常類。
T —— 泛型。

泛型不是協變的
關於泛型的混淆,一個常見的來源就是假設它們像數組一樣是協變的。其實它們不是協變的。List<Object> 不是 List<String> 的父類型。
如果 A 擴展 B,那麼 A 的數組也是 B 的數組,並且完全可以在需要 B[] 的地方使用 A[]:
Integer[] intArray = new Integer[10];
Number[] numberArray = intArray;
上面的代碼是有效的,因為一個 Integer 是 一個 Number,因而一個 Integer 數組是 一個 Number 數組。但是對於泛型來說則不然。下面的代碼是無效的:
List<Integer> intList = new ArrayList<Integer>();
List<Number> numberList = intList; // invalid
最初,大多數 Java 程序員覺得這缺少協變很煩人,或者甚至是「壞的(broken)」,但是之所以這樣有一個很好的原因。如果可以將 List<Integer> 賦給 List<Number>,下面的代碼就會違背泛型應該提供的類型安全:
List<Integer> intList = new ArrayList<Integer>();
List<Number> numberList = intList; // invalid
numberList.add(new Float(3.1415));
因為 intList 和 numberList 都是有別名的,如果允許的話,上面的代碼就會讓您將不是 Integers 的東西放進 intList 中。但是,正如下一屏將會看到的,您有一個更加靈活的方式來定義泛型。

類型通配符
假設您具有該方法:
void printList(List l) {
for (Object o : l)
System.out.println(o);
}
上面的代碼在 JDK 5.0 上編譯通過,但是如果試圖用 List<Integer> 調用它,則會得到警告。出現警告是因為,您將泛型(List<Integer>)傳遞給一個只承諾將它當作 List(所謂的原始類型)的方法,這將破壞使用泛型的類型安全。
如果試圖編寫像下面這樣的方法,那麼將會怎麼樣?
void printList(List<Object> l) {
for (Object o : l)
System.out.println(o);
}
它仍然不會通過編譯,因為一個 List<Integer> 不是 一個 List<Object>(正如前一屏 泛型不是協變的 中所學的)。這才真正煩人 —— 現在您的泛型版本還沒有普通的非泛型版本有用!
解決方案是使用類型通配符:
void printList(List<?> l) {
for (Object o : l)
System.out.println(o);
}
上面代碼中的問號是一個類型通配符。它讀作「問號」。List<?> 是任何泛型 List 的父類型,所以您完全可以將 List<Object>、List<Integer> 或 List<List<List<Flutzpah>>> 傳遞給 printList()。

類型通配符的作用
前一屏 類型通配符 中引入了類型通配符,這讓您可以聲明 List<?> 類型的變數。您可以對這樣的 List 做什麼呢?非常方便,可以從中檢索元素,但是不能添加元素。原因不是編譯器知道哪些方法修改列表哪些方法不修改列表,而是(大多數)變化的方法比不變化的方法需要更多的類型信息。下面的代碼則工作得很好:
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
System.out.println(lu.get(0));
為什麼該代碼能工作呢?對於 lu,編譯器一點都不知道 List 的類型參數的值。但是編譯器比較聰明,它可以做一些類型推理。在本例中,它推斷未知的類型參數必須擴展 Object。(這個特定的推理沒有太大的跳躍,但是編譯器可以作出一些非常令人佩服的類型推理,後面就會看到(在 底層細節 一節中)。所以它讓您調用 List.get() 並推斷返回類型為 Object。
另一方面,下面的代碼不能工作:
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
lu.add(new Integer(43)); // error
在本例中,對於 lu,編譯器不能對 List 的類型參數作出足夠嚴密的推理,以確定將 Integer 傳遞給 List.add() 是類型安全的。所以編譯器將不允許您這么做。
以免您仍然認為編譯器知道哪些方法更改列表的內容哪些不更改列表內容,請注意下面的代碼將能工作,因為它不依賴於編譯器必須知道關於 lu 的類型參數的任何信息:
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
lu.clear();

泛型方法
(在 類型參數 一節中)您已經看到,通過在類的定義中添加一個形式類型參數列表,可以將類泛型化。方法也可以被泛型化,不管它們定義在其中的類是不是泛型化的。
泛型類在多個方法簽名間實施類型約束。在 List<V> 中,類型參數 V 出現在 get()、add()、contains() 等方法的簽名中。當創建一個 Map<K, V> 類型的變數時,您就在方法之間宣稱一個類型約束。您傳遞給 add() 的值將與 get() 返回的值的類型相同。
類似地,之所以聲明泛型方法,一般是因為您想要在該方法的多個參數之間宣稱一個類型約束。例如,下面代碼中的 ifThenElse() 方法,根據它的第一個參數的布爾值,它將返回第二個或第三個參數:
public <T> T ifThenElse(boolean b, T first, T second) {
return b ? first : second;
}
注意,您可以調用 ifThenElse(),而不用顯式地告訴編譯器,您想要 T 的什麼值。編譯器不必顯式地被告知 T 將具有什麼值;它只知道這些值都必須相同。編譯器允許您調用下面的代碼,因為編譯器可以使用類型推理來推斷出,替代 T 的 String 滿足所有的類型約束:
String s = ifThenElse(b, "a", "b");
類似地,您可以調用:
Integer i = ifThenElse(b, new Integer(1), new Integer(2));
但是,編譯器不允許下面的代碼,因為沒有類型會滿足所需的類型約束:
String s = ifThenElse(b, "pi", new Float(3.14));
為什麼您選擇使用泛型方法,而不是將類型 T 添加到類定義呢?(至少)有兩種情況應該這樣做:
當泛型方法是靜態的時,這種情況下不能使用類類型參數。
當 T 上的類型約束對於方法真正是局部的時,這意味著沒有在相同類的另一個 方法簽名中使用相同 類型 T 的約束。通過使得泛型方法的類型參數對於方法是局部的,可以簡化封閉類型的簽名。

有限制類型
在前一屏 泛型方法 的例子中,類型參數 V 是無約束的或無限制的 類型。有時在還沒有完全指定類型參數時,需要對類型參數指定附加的約束。
考慮例子 Matrix 類,它使用類型參數 V,該參數由 Number 類來限制:
public class Matrix<V extends Number> { ... }
編譯器允許您創建 Matrix<Integer> 或 Matrix<Float> 類型的變數,但是如果您試圖定義 Matrix<String> 類型的變數,則會出現錯誤。類型參數 V 被判斷為由 Number 限制 。在沒有類型限制時,假設類型參數由 Object 限制。這就是為什麼前一屏 泛型方法 中的例子,允許 List.get() 在 List<?> 上調用時返回 Object,即使編譯器不知道類型參數 V 的類型。

三 一個簡單的泛型類
編寫基本的容器類
此時,您可以開始編寫簡單的泛型類了。到目前為止,泛型類最常見的用例是容器類(比如集合框架)或者值持有者類(比如 WeakReference 或 ThreadLocal)。我們來編寫一個類,它類似於 List,充當一個容器。其中,我們使用泛型來表示這樣一個約束,即 Lhist 的所有元素將具有相同類型。為了實現起來簡單,Lhist 使用一個固定大小的數組來保存值,並且不接受 null 值。
Lhist 類將具有一個類型參數 V(該參數是 Lhist 中的值的類型),並將具有以下方法:
public class Lhist<V> {
public Lhist(int capacity) { ... }
public int size() { ... }
public void add(V value) { ... }
public void remove(V value) { ... }
public V get(int index) { ... }
}
要實例化 Lhist,只要在聲明時指定類型參數和想要的容量:
Lhist<String> stringList = new Lhist<String>(10);

實現構造函數
在實現 Lhist 類時,您將會遇到的第一個攔路石是實現構造函數。您可能會像下面這樣實現它:
public class Lhist<V> {
private V[] array;
public Lhist(int capacity) {
array = new V[capacity]; // illegal
}
}
這似乎是分配後備數組最自然的一種方式,但是不幸的是,您不能這樣做。具體原因很復雜,當學習到 底層細節 一節中的「擦除」主題時,您就會明白。分配後備數組的實現方式很古怪且違反直覺。下面是構造函數的一種可能的實現(該實現使用集合類所採用的方法):
public class Lhist<V> {
private V[] array;
public Lhist(int capacity) {
array = (V[]) new Object[capacity];
}
}

另外,也可以使用反射來實例化數組。但是這樣做需要給構造函數傳遞一個附加的參數 —— 一個類常量,比如 Foo.class。後面在 Class<T> 一節中將討論類常量。

實現方法
實現 Lhist 的方法要容易得多。下面是 Lhist 類的完整實現:
public class Lhist<V> {
private V[] array;
private int size;
public Lhist(int capacity) {
array = (V[]) new Object[capacity];
}
public void add(V value) {
if (size == array.length)
throw new IndexOutOfBoundsException(Integer.toString(size));
else if (value == null)
throw new NullPointerException();
array[size++] = value;
}
public void remove(V value) {
int removalCount = 0;
for (int i=0; i<size; i++) {
if (array[i].equals(value))
++removalCount;
else if (removalCount > 0) {
array[i-removalCount] = array[i];
array[i] = null;
}
}
size -= removalCount;
}
public int size() { return size; }
public V get(int i) {
if (i >= size)
throw new IndexOutOfBoundsException(Integer.toString(i));
return array[i];
}
}
注意,您在將會接受或返回 V 的方法中使用了形式類型參數 V,但是您一點也不知道 V 具有什麼樣的方法或域,因為這些對泛型代碼是不可知的。

使用 Lhist 類
使用 Lhist 類很容易。要定義一個整數 Lhist,只需要在聲明和構造函數中為類型參數提供一個實際值即可:
Lhist<Integer> li = new Lhist<Integer>(30);
編譯器知道,li.get() 返回的任何值都將是 Integer 類型,並且它還強制傳遞給 li.add() 或 li.remove() 的任何東西都是 Integer。除了實現構造函數的方式很古怪之外,您不需要做任何十分特殊的事情以使 Lhist 是一個泛型類。

閱讀全文

與java泛型編程指南相關的資料

熱點內容
和平精英如何切換蘋果到安卓 瀏覽:530
資料庫調用表單的命令 瀏覽:920
程序員技能大賽 瀏覽:9
什麼app買品牌衣服 瀏覽:13
手機看世界名著哪個app好 瀏覽:493
運行命令切換列印機用戶 瀏覽:919
android滑動button 瀏覽:939
伺服器日誌可以干什麼 瀏覽:644
安卓系統空間怎麼清理軟體 瀏覽:343
維也納pdf 瀏覽:641
加密貨幣交易所哪個最好 瀏覽:816
linux的現狀 瀏覽:926
命令與征服叛逆者修改器 瀏覽:246
怎麼用ios玩安卓全民槍戰 瀏覽:668
程序員入行前後的頭發 瀏覽:711
嵌入式圖像演算法 瀏覽:329
伺服器如何訪問伺服器失敗 瀏覽:875
android進度球 瀏覽:1001
Linux造成xfs文件夾 瀏覽:457
華為手機怎麼修改wifi加密類型 瀏覽:250