概覽
Java集合也叫容器,能夠容納其它的Java對象,始於JDK1.2.優勢是:java
1.下降編程難度編程
2.提升程序性能jvm
3.提升API間的互操做性性能
4.下降學習難度學習
5.下降設計和實現相關API的難度spa
6.增長程序的重用性設計
Java容器裏只能放對象,對於基本類型(int, long, float, double等),須要將其包裝成對象類型後(Integer, Long, Float, Double等)才能放到容器裏。不少時候拆包裝和解包裝可以自動完成。這雖然會致使額外的性能和空間開銷,但簡化了設計和編程。3d
泛型
java容器可以容納任何類型的對象,這一點是經過Java的泛型機制完成的。Java泛型是是編譯器爲咱們提供的一個語法糖,在編譯的時候對相應的字符串替換,自己不須要jvm虛擬機的支持。實質上Java的單繼承機制纔是保證這一特性的根本,由於全部的對象都是Object的子類,容器裏只要可以存放Object對象就好了。 事實上,全部容器的內部存放的都是Object對象,泛型機制只是簡化了編程,由編譯器自動幫咱們完成了強制類型轉換而已。code
//JDK 1.4 or before ArrayList list = new ArrayList(); list.add(new String("Monday")); list.add(new String("Tuesday")); list.add(new String("Wensday")); for(int i = 0; i < list.size(); i++){ String weekday = (String)list.get(i);//顯式類型轉換 System.out.println(weekday.toUpperCase()); }
//JDK 1.5 or latter ArrayList<String> list = new ArrayList<String>();//參數化類型 list.add(new String("Monday")); list.add(new String("Tuesday")); list.add(new String("Wensday")); for(int i = 0; i < list.size(); i++){ String weekday = list.get(i);//隱式類型轉換,編譯器自動完成 System.out.println(weekday.toUpperCase()); }
接口和實現類
接口:
java集合統一設計,定義了14個接口。關係如圖:對象
Map接口沒有繼承自Collection接口,由於Map表示的是關聯式容器而不是集合。但Java爲咱們提供了從Map轉換到Collection的方法,能夠方便的將Map切換到集合視圖。 上圖中提供了Queue接口,卻沒有Stack,這是由於Stack的功能已被JDK 1.6引入的Deque取代。
實現:
一些常見類的實現如圖:
迭代器:
java集合的迭代器,爲咱們提供了遍歷容器中元素的方法。只有容器自己清楚容器裏元素的組織方式,所以迭代器只能經過容器自己獲得。每一個容器都會經過內部類的形式實現本身的迭代器。
//visit a list with iterator ArrayList<String> list = new ArrayList<String>(); list.add(new String("Monday")); list.add(new String("Tuesday")); list.add(new String("Wensday")); Iterator<String> it = list.iterator();//獲得迭代器 while(it.hasNext()){ String weekday = it.next();//訪問元素 System.out.println(weekday.toUpperCase()); }
//使用加強for迭代 ArrayList<String> list = new ArrayList<String>(); list.add(new String("Monday")); list.add(new String("Tuesday")); list.add(new String("Wensday")); for(String weekday : list){//enhanced for statement System.out.println(weekday.toUpperCase()); }