1. 泛性編程
C 經過模板技術能夠指定集合的元素類型,而Java在1.5以前一直沒有相對應的功能。一個集合能夠聽任何類型的對象,相應地從集合裏面拿對象的時 候咱們也不得不對他們進行強制得類型轉換。猛虎引入了泛型。例子以下:
ArrayList<String> list = new ArrayList<String>();
list.add(new String("Hello!"));
System.out.println(list.get(0));
2. 自動裝箱/拆箱
Java中常常須要在原始數據類型和它們的包裝類之間轉換,尤爲是將數據放入Collection容器中和取出來時。爲了減小這些重複代碼,JDK 5.0添加了自動裝箱/解箱操做,今後以後,基本上能夠將原始數據類型看成對象來操做了。
自動裝箱:指開發人員能夠把一個基本數據類型直接賦給對應的包裝類。
自動拆箱:指開發人員能夠把一個包裝類對象直接賦給對應的基本數據類型。
例:public void test(){
Integer i = 1000; //裝箱
int c = i; //拆箱
//典型的應用案例
List list = new ArrayList();
list.add(12); //裝箱
int temp = (Integer)list.get(0); //拆箱
}
3. 加強的循環結構(for-each循環)
引入加強for循環的緣由:在JDK5之前的版本中,遍歷數組或集合中的元素,需先得到數組的長度或集合的迭代器,比較麻煩!加入這種循環方式也是爲了簡化一些代碼開發,尤爲是對Collection容器的遍歷,之前都須要獲得Iterator,而後調用next()獲得下一個對象,調用hasNext()判斷是否還有,要不停寫這種重複的代碼,用foreach則很簡單。所以JDK5中定義了一種新的語法——加強foreach循環,以簡化此類操做。加強for循環只能用在數組、或實現Iterable接口的集合類上, 語法格式:
for(變量類型 變量 :需迭代的數組或集合){具體代碼 }
例: int data[] = { 1, 2, 3, 4, 5 };
for(int j : data)
System.out.println(j);
4. 枚舉類型
Java添加了對枚舉類型的支持,使用enum關鍵字進行定義。下面是一個例子:
public enum Meal {BREAKFAST, LUNCH, SUPPER};
public static void main( String[] args ) {
Meal m = Meal.BREAKFAST;
System.out.println( m );
}
其中定義的每個常量都是Meal的一個實例。能夠看到枚舉類型的定義很是像一個類,能夠有方法,能夠有構造函數,不過構造函數不能是public或者protected的;此外實例必須在一開始就定義。另外就是enum不能被繼承,由於事實上定義了一個enum後,編譯器會自動生成一個繼承了java.lang.Enum的同名的類,而Java是不支持多重繼承的,因此定義的enum就不能被繼承了,這一點在某些時候帶來了一些限制,好比想重用代碼來擴展enum時。此外,注意上面定義中的語法,各個實例間用逗號分隔,實例所有結束後用分號。
枚舉類型還定義了一些方法:toString(), values()和ordinal()等。
enum還支持靜態導入,支持用在switch語句中。
5. 靜態導入
靜態導入很是簡單,就是將一個類的靜態變量或者方法導入,這樣在引用時就不須要再寫類名了,減小了代碼輸入的工做量。例子以下:
import static java.lang.System.out;
public class StaticImport {
public static void main( String[] args ) {
out.println( "Good" );
}
}
代碼中用了最經常使用的輸出語句,原來須要寫System.out.println(),如今將out靜態導入,則只需寫out.println()
一般導入的語句也能夠寫成import static java.lang.System.*來將該類中的全部靜態變量和方法都導入。能夠看到靜態導入是很是簡單的,只需記住雖然該特性通常稱爲「靜態導入(static import)」,寫代碼時卻要寫成「import static」。
6. 可變參數列表
從C中借鑑來的功能,若是方法想要接受任意數目的參數的話,就能夠用,獲得的參數則用foreach語法一個一個讀出來。之前則可能須要用一大堆的重載方法。形式如:
void argtest(Object ... args) {
for(int i = 0; i < args.length; i++)
System.out.println(i);
}
例子以下:
public class Test {
public static void test( int...values ) {
System.out.println( values.length );
for ( int i : values ) {
System.out.println( i );
}
}
public static void main( String[] args ) {
test( 1 );
test( 1, 2 );
test( 1, 2, 3 );
}
}上面代碼中能夠看到,可變參數列表還有個屬性是length。
而後咱們能夠這樣調用這個函數:
argtest(1);
argtest(1, 2, 4, 5, 6);
7. 格式化輸出
System.out.printf("This is a test: %4.2f\n", 123.123);
這就會打印出:This is a test: 123.12
8. 從終端讀取數據
剛開始接觸Java 的時候,我怎麼也不能用Java 在終端像C同樣方便的讀取數據。要從終端讀取一個整數我之前是這麼弄的:
try {
BufferedReader reader = new BufferedReader(new
InputStreamReader(System.in));
int i = Integer.parseInt(reader.readLine());
} catch(IOException e) { }
如今好了,Java 裏面引入了一個Scanner(),能夠方便的從終端讀取數據:
public class ScannerExample{
public static void main(String[] args){
Scanner read = new Scanner(System.in);
int i = read.nextInt();
System.out.println(「輸入的i=」+i);
}
}