1. 程式人生 > >Java基礎總結之各版本JDK新特性

Java基礎總結之各版本JDK新特性

JDK5新特性:

(1)自動裝箱和拆箱:

public class JDK5TNewFeatures {

	public static void main(String[] args) {
		Integer num = 10;
		int num2 = num;
		System.out.println(num2);
	}

}

如下是反編譯class檔案獲得的原始碼:實際上編譯器自動完成了拆裝箱,是Java的蜜糖。

import java.io.PrintStream;

public class JDK5TNewFeatures
{
  public static void main(String[] args)
  {
    Integer num = Integer.valueOf(10);
    int num2 = num.intValue();
    System.out.println(num2);
  }
}

(2)泛型:泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。這種引數型別可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面、泛型方法。 Java語言引入泛型的好處是安全簡單。

ArrayList<String> list = new ArrayList<String>();

在Java SE 1.5之前,沒有泛型的情況的下,通過對型別Object的引用來實現引數的“任意化”,“任意化”帶來的缺點是要做顯式的強制型別轉換,而這種轉換是要求開發者對實際引數型別可以預知的情況下進行的。對於強制型別轉換錯誤的情況,編譯器可能不提示錯誤,在執行的時候才出現異常,這是一個安全隱患。 

泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,以提高程式碼的重用率。

(3)增強for迴圈:

public class JDK5TNewFeatures {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("World");
		list.add("Is-Me-Hl");
		for (String s : list) {
			System.out.println(s);
		}
	}

}

注意的是:增強for迴圈底層也是使用迭代器完成的遍歷,只不過這個迭代器由JVM獲取。在使用增強for迴圈的過程中,需要注意的是:不能使用集合物件對集合元素的個數進行修改。

迭代器遍歷元素和增強for迴圈遍歷元素的區別:迭代器遍歷集合中可以使用remove方法刪除集合元素,而增強for迴圈不可以。

普通for迴圈與掙錢for迴圈的區別:增強for迴圈一定有遍歷的目標,而普通for迴圈可以沒有。

如果在增強for迴圈中修改集合元素個數會報如下錯誤:

public class JDK5TNewFeatures {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("World");
		list.add("Is-Me-Hl");
		for (String s : list) {
			// list.remove(s);
			list.add("Happy");
		}
	}

}
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at h.l.jdk5.JDK5TNewFeatures.main(JDK5TNewFeatures.java:12)

(4)靜態匯入:

import static java.lang.System.out;//匯入java.lang包下的System類的靜態方法out;
import java.util.ArrayList;
import static java.lang.System.out;

public class JDK5TNewFeatures {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("World");
		list.add("Is-Me-Hl");
		for (String s : list) {
			out.println(s);
		}
	}

}

 import xxxx (非靜態匯入)和 import static xxxx(靜態匯入)的區別是前者一般匯入的是類檔案如import java.util.Scanner;後者一般是匯入靜態的方法,import static java.lang.System.out;

(5)可變引數:方法的引數個數不確定。用"..."定義。

public class JDK5TNewFeatures {

	public static void main(String[] args) {
		sum(1, 2, 3);
		sum(4, 5, 6, 7, 8);
		sum(1);
	}

	private static void sum(int... is) {
		int sum = 0;
		for (int i = 0; i < is.length; i++) {
			sum += is[i];
		}
		System.out.println(sum);
	}

}

(6)列舉:enum:有限個例項。

public enum EnumDemo {
	Front, Behind, Left, Right;
}
public class JDK5TNewFeatures {

	public static void main(String[] args) {
		EnumDemo ed = EnumDemo.Front;
		System.out.println(ed);
	}
}
//執行結果
Front

public enum EnumDemo {
	Front("前"), Behind("後"), Left("左"), Right("右");

	private String name;

	private EnumDemo(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

}
public class JDK5TNewFeatures {

	public static void main(String[] args) {
		EnumDemo ed = EnumDemo.Front;
		System.out.println(ed);
		System.out.println(ed.getName());
	}
}
//執行結果
Front
前

public enum EnumDemo {
	Front("前") {
		@Override
		public void show() {
			System.out.println("前面");
		}
	},
	Behind("後") {
		@Override
		public void show() {
			System.out.println("後面");
		}
	},
	Left("左") {
		@Override
		public void show() {
			System.out.println("左面");
		}
	},
	Right("右") {
		@Override
		public void show() {
			System.out.println("右面");
		}
	};

	private String name;

	private EnumDemo(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public abstract void show();
}
public class JDK5TNewFeatures {

	public static void main(String[] args) {
		EnumDemo ed = EnumDemo.Front;
		System.out.println(ed);
		System.out.println(ed.getName());
		ed.show();
	}
}
//執行結果
Front
前
前面

上述就是列舉的簡單使用。對於列舉有一下幾點要注意一下:

列舉也是類,編譯後會生成.class檔案。

列舉值預設的修飾符是public static final。

列舉類的建構函式只能使用private訪問修飾符,如果省略了其構造器的訪問控制符,則預設使用private修飾。

上述的Front、Behind等值,預設的寫法都是:

public static final EnumDemo Front= new EnumDemo ();

public static final EnumDemo Behind= new EnumDemo ();

public static final EnumDemo Left= new EnumDemo ();

public static final EnumDemo Right= new EnumDemo ();

JDK7新特性:

(1)二進位制字面量:

public class JDK7TNewFeatures {

	public static void main(String[] args) {
		int a = 0b100_100_100;
		System.out.println(a);
	}
}

(2)數字字面量可以出現下劃線:

public class JDK7TNewFeatures {

	public static void main(String[] args) {
		int a = 100_100_100;
		System.out.println(a);
	}
}

(3)switch語句可以用字串:

public class JDK7TNewFeatures {

	public static void main(String[] args) {
		switch ("str1") {
		case "str1":
			System.out.println("str1");
			break;
		case "str2":
			System.out.println("str2");
			break;
		case "str3":
			System.out.println("str3");
			break;
		}
	}
}

(4)泛型簡化:

public class JDK7TNewFeatures {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<>();
	}
}

(5)異常的多個catch合併:

public class JDK7TNewFeatures {

	public static void main(String[] args) {
		int[] a = { 1, 2, 3 };
		try {
			System.out.println(10 / 0);
			System.out.println(a[3]);
		} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
			System.out.println("出問題了");
		}
	}
}

(6)try...with...resources語句:

public static void main(String[] args) {//原來的寫法
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(new File("test"));
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
    }
}
public static void main(String[] args) {//JDK7後使用
    try (FileInputStream inputStream = new FileInputStream(new File("test"))) {
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

try-with-resource並不是JVM虛擬機器的新增功能,只是JDK實現了一個語法糖,當你將上面程式碼反編譯後會發現,其實對JVM虛擬機器而言,它看到的依然是之前的寫法:

public static void main(String[] args) {
    try {
        FileInputStream inputStream = new FileInputStream(new File("test"));
        Throwable var2 = null;

        try {
            System.out.println(inputStream.read());
        } catch (Throwable var12) {
            var2 = var12;
            throw var12;
        } finally {
            if (inputStream != null) {
                if (var2 != null) {
                    try {
                        inputStream.close();
                    } catch (Throwable var11) {
                        var2.addSuppressed(var11);
                    }
                } else {
                    inputStream.close();
                }
            }

        }

    } catch (IOException var14) {
        throw new RuntimeException(var14.getMessage(), var14);
    }
}

JDK8新特性:參考https://blog.csdn.net/u014470581/article/details/54944384


JDK10新特性:參考https://www.oschina.net/translate/109-new-features-in-jdk-10


注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。