JavaSE 學習筆記之Jdk5.0新特性(十九)

Jdk5.0新特性:java

Collection在jdk1.5之後,有了一個父接口Iterable,這個接口的出現的將iterator方法進行抽取,提升了擴展性。數組

--------------------------------------------------併發

加強for循環:foreach語句,foreach簡化了迭代器。函數

格式:// 加強for循環括號裏寫兩個參數,第一個是聲明一個變量,第二個就是須要迭代的容器優化

for( 元素類型 變量名 : Collection集合 & 數組 ) {spa

  …對象

}繼承

高級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爲了優化字符串操做提供了一個緩衝池;

相關文章
相關標籤/搜索