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
注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。