【小家java】java5新特性(簡述十大新特性) 重要一躍

相關閱讀

【小家java】java5新特性(簡述十大新特性) 重要一躍
【小家java】java6新特性(簡述十大新特性) 雞肋升級
【小家java】java7新特性(簡述八大新特性) 不溫不火
【小家java】java8新特性(簡述十大新特性) 飽受讚譽
【小家java】java9新特性(簡述十大新特性) 褒貶不一
【小家java】java10新特性(簡述十大新特性) 小步迭代


Java5開發代號爲Tiger(老虎),於2004-09-30發行

評價:很重要的一次更新

特性列表

  • 泛型
  • 枚舉
  • 自動裝箱拆箱
  • 可變參數
  • 註解
  • foreach循環(增強for、for/in)
  • 靜態導入
  • 格式化(System.out.println 支持%s %d等格式化輸出)
  • 線程框架/數據結構 JUC
  • Arrays工具類/StringBuilder/instrument

1、泛型

所謂類型擦除指的就是Java源碼中的範型信息只允許停留在編譯前期,而編譯後的字節碼文件中將不再保留任何的範型信息。也就是說,範型信息在編譯時將會被全部刪除,其中範型類型的類型參數則會被替換爲Object類型,並在實際使用時強制轉換爲指定的目標數據類型。而C++中的模板則會在編譯時將模板類型中的類型參數根據所傳遞的指定數據類型生成相對應的目標代碼。

Map<Integer, Integer> squares = new HashMap<Integer, Integer>();
  • 通配符類型:避免unchecked警告,問號表示任何類型都可以接受
public void printList(List<?> list, PrintStream out) throws IOException {
    for (Iterator<?> i = list.iterator(); i.hasNext(); ) {
      out.println(i.next().toString());
    }
  }
  • 限制類型
public static <A extends Number> double sum(Box<A> box1,Box<A> box2){
    double total = 0;
    for (Iterator<A> i = box1.contents.iterator(); i.hasNext(); ) {
      total = total + i.next().doubleValue();
    }
    for (Iterator<A> i = box2.contents.iterator(); i.hasNext(); ) {
      total = total + i.next().doubleValue();
    }
    return total;
  }

2、枚舉

  • EnumMap
public void testEnumMap(PrintStream out) throws IOException {
    // Create a map with the key and a String message
    EnumMap<AntStatus, String> antMessages =
      new EnumMap<AntStatus, String>(AntStatus.class);
    // Initialize the map
    antMessages.put(AntStatus.INITIALIZING, "Initializing Ant...");
    antMessages.put(AntStatus.COMPILING,    "Compiling Java classes...");
    antMessages.put(AntStatus.COPYING,      "Copying files...");
    antMessages.put(AntStatus.JARRING,      "JARring up files...");
    antMessages.put(AntStatus.ZIPPING,      "ZIPping up files...");
    antMessages.put(AntStatus.DONE,         "Build complete.");
    antMessages.put(AntStatus.ERROR,        "Error occurred.");
    // Iterate and print messages
    for (AntStatus status : AntStatus.values() ) {
      out.println("For status " + status + ", message is: " +
                  antMessages.get(status));
    }
  }
  • switch枚舉
public String getDescription() {
    switch(this) {
      case ROSEWOOD:      return "Rosewood back and sides";
      case MAHOGANY:      return "Mahogany back and sides";
      case ZIRICOTE:      return "Ziricote back and sides";
      case SPRUCE:        return "Sitka Spruce top";
      case CEDAR:         return "Wester Red Cedar top";
      case AB_ROSETTE:    return "Abalone rosette";
      case AB_TOP_BORDER: return "Abalone top border";
      case IL_DIAMONDS:   
        return "Diamonds and squares fretboard inlay";
      case IL_DOTS:
        return "Small dots fretboard inlay";
      default: return "Unknown feature";
    }
  }

3、自動拆箱/裝箱

將primitive類型轉換成對應的wrapper類型:Boolean、Byte、Short、Character、Integer、Long、Float、Double

4、可變參數

private String print(Object... values) {
    StringBuilder sb = new StringBuilder();
    for (Object o : values) {
      sb.append(o.toString())
        .append(" ");
    }
    return sb.toString();
  }

5、註解

  • Inherited表示該註解是否對類的子類繼承的方法等起作用
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface InProgress { }
  • Target類型
  • Rentation表示annotation是否保留在編譯過的class文件中還是在運行時可讀。

6、增強for循環 for/in

for/in循環辦不到的事情:
(1)遍歷同時獲取index
(2)集合逗號拼接時去掉最後一個
(3)遍歷的同時刪除元素

靜態導入

import static java.lang.System.err;
import static java.lang.System.out;

err.println(msg); 

print輸出格式化

 System.out.println("Line %d: %s%n", i++, line);

併發支持(JUC)

  • 線程池
  • uncaught exception(可以抓住多線程內的異常)
class SimpleThreadExceptionHandler implements
    Thread.UncaughtExceptionHandler {
  public void uncaughtException(Thread t, Throwable e) {
    System.err.printf("%s: %s at line %d of %s%n",
        t.getName(), 
        e.toString(),
        e.getStackTrace()[0].getLineNumber(),
        e.getStackTrace()[0].getFileName());
  }
  • blocking queue(BlockingQueue)
  • JUC類庫

10、Arrays、Queue、線程安全StringBuilder

  • Arrays工具類
Arrays.sort(myArray);
Arrays.toString(myArray)
Arrays.binarySearch(myArray, 98)
Arrays.deepToString(ticTacToe)
Arrays.deepEquals(ticTacToe, ticTacToe3)
  • Queue
    避開集合的add/remove操作,使用offer、poll操作(不拋異常)

Queue接口與List、Set同一級別,都是繼承了Collection接口。LinkedList實現了Deque接 口。

Queue q = new LinkedList(); //採用它來實現queue

Queue相關知識,在後續博文中會有專題講解。屬於比較重要的一塊
- Override返回類型
- 單線程StringBuilder
- java.lang.instrument

最後

JDK5是java史上最重要的升級之一,具有非常重要的意義,雖然語法糖非常多。但可以使得我們的代碼更加健壯,更加優雅。

由於出現的時間已經比較久遠了,所以此處講述特性只一筆帶過,不做具體詳解了。有興趣的可以關注我的更多博文,會針對有意義的進行針對性講解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章