1. 程式人生 > >第7篇 JDK5.0新特性

第7篇 JDK5.0新特性

Jdk5.0新特性:

Collection在jdk1.5以後,有了一個父介面Iterable,這個介面的出現的將iterator方法進行抽取,提高了擴充套件性。

--------------------------------------------------

增強for迴圈:foreach語句,foreach簡化了迭代器。

格式:// 增強for迴圈括號裡寫兩個引數,第一個是宣告一個變數,第二個就是需要迭代的容器

for( 元素型別 變數名 : Collection集合 & 陣列 ) {

}

高階for迴圈和傳統for迴圈的區別:

高階for迴圈在使用時,必須要明確被遍歷的目標。這個目標,可以是Collection集合或者陣列,如果遍歷Collection集合,在遍歷過程中還需要對元素進行操作,比如刪除,需要使用迭代器。

如果遍歷陣列,還需要對陣列元素進行操作,建議用傳統for迴圈因為可以定義角標通過角標操作元素。如果只為遍歷獲取,可以簡化成高階for迴圈,它的出現為了簡化書寫。

 

高階for迴圈可以遍歷map集合嗎?不可以。但是可以將map轉成set後再使用foreach語句。

 

1)、作用:對儲存物件的容器進行迭代: 陣列  collection   map

2)、增強for迴圈迭代陣列:

String [] arr = {"a", "b", "c"};//陣列的靜態定義方式,只試用於陣列首次定義的時候

for(String s : arr) {

System.out.println(s);

}

3)、單列集合 Collection:

List list = new ArrayList();

list.add("aaa");

// 增強for迴圈, 沒有使用泛型的集合能不能使用增強for迴圈迭代?能

for(Object obj : list) {

String s = (String) obj;

System.out.println(s);

}

4)、雙列集合 Map:

Map map = new HashMap();

map.put("a", "aaa");

// 傳統方式:必須掌握這種方式

Set entrys = map.entrySet(); // 1.獲得所有的鍵值對Entry物件

iter = entrys.iterator(); // 2.迭代出所有的entry

while(iter.hasNext()) {

Map.Entry entry = (Entry) iter.next();

String key = (String) entry.getKey(); // 分別獲得key和value

String value = (String) entry.getValue();

System.out.println(key + "=" + value);

}

// 增強for迴圈迭代:原則上map集合是無法使用增強for迴圈來迭代的,因為增強for迴圈只能針對實現了Iterable介面的集合進行迭代;Iterable是jdk5中新定義的介面,就一個方法iterator方法,只有實現了Iterable介面的類,才能保證一定有iterator方法,java有這樣的限定是因為增強for迴圈內部還是用迭代器實現的,而實際上,我們可以通過某種方式來使用增強for迴圈。

for(Object obj : map.entrySet()) {

Map.Entry entry = (Entry) obj;  // obj 依次表示Entry

System.out.println(entry.getKey() + "=" + entry.getValue());

}

5)、集合迭代注意問題:在迭代集合的過程中,不能對集合進行增刪操作(會報併發訪問異常);可以用迭代器的方法進行操作(子類listIterator:有增刪的方法)。

6)、增強for迴圈注意問題:在使用增強for迴圈時,不能對元素進行賦值;

int[] arr = {1,2,3};

for(int num : arr) {

num = 0; //不能改變陣列的值

}

System.out.println(arr[1]); //2

--------------------------------------------------

可變引數(...):用到函式的引數上,當要操作的同一個型別元素個數不確定的時候,可是用這個方式,這個引數可以接受任意個數的同一型別的資料。

 

和以前接收陣列不一樣的是:

以前定義陣列型別,需要先建立一個數組物件,再將這個陣列物件作為引數傳遞給函式。現在,直接將陣列中的元素作為引數傳遞即可。底層其實是將這些元素進行陣列的封裝,而這個封裝動作,是在底層完成的,被隱藏了。所以簡化了使用者的書寫,少了呼叫者定義陣列的動作。

如果在引數列表中使用了可變引數,可變引數必須定義在引數列表結尾(也就是必須是最後一個引數,否則編譯會失敗。)。

如果要獲取多個int數的和呢?可以使用將多個int數封裝到陣列中,直接對陣列求和即可。

---------------------------------------------------

靜態匯入:匯入了類中的所有靜態成員,簡化靜態成員的書寫。

import static java.util.Collections.*;  //匯入了Collections類中的所有靜態成員

---------------------------------------------------

列舉:關鍵字 enum

問題:物件的某個屬性的值不能是任意的,必須為固定的一組取值其中的某一個;

解決辦法:

1)、在setGrade方法中做判斷,不符合格式要求就丟擲異常;

2)、直接限定使用者的選擇,通過自定義類模擬列舉的方式來限定使用者的輸入,寫一個Grade類,私有建構函式,對外提供5個靜態的常量表示類的例項;

3)、jdk5中新定義了列舉型別,專門用於解決此類問題;

4)、列舉就是一個特殊的java類,可以定義屬性、方法、建構函式、實現介面、繼承類;

------------------------------------------------------------------------------

自動拆裝箱:java中資料型別分為兩種 : 基本資料型別   引用資料型別(物件)

在 java程式中所有的資料都需要當做物件來處理,針對8種基本資料型別提供了包裝類,如下:

int --> Integer

byte --> Byte

short --> Short

long --> Long

char --> Character

double --> Double

float --> Float

boolean --> Boolean

 

jdk5以前基本資料型別和包裝類之間需要互轉:

基本---引用   Integer x = new Integer(x);

引用---基本   int num = x.intValue();

1)、Integer x = 1; x = x + 1;  經歷了什麼過程?裝箱 à 拆箱 à 裝箱

2)、為了優化,虛擬機器為包裝類提供了緩衝池,Integer池的大小 -128~127 一個位元組的大小

3)、String池:Java為了優化字串操作 提供了一個緩衝池;