1. 程式人生 > >java jdk1.7與jdk1.8 區別

java jdk1.7與jdk1.8 區別

1.jdk7語法上

   1.1二進位制變數的表示,支援將整數型別用二進位制來表示,用0b開頭。

   // 所有整數 int, short,long,byte都可以用二進位制表示
    // An 8-bit 'byte' value:
    byte aByte = (byte) 0b00100001;

    // A 16-bit 'short' value:
    short aShort = (short) 0b1010000101000101;

    // Some 32-bit 'int' values:
    intanInt1 = 0b10100001010001011010000101000101;
    intanInt2 = 0b101;
    intanInt3 = 0B101; // The B can be upper or lower case.


    // A 64-bit 'long' value. Note the "L" suffix:
    long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;

    // 二進位制在陣列等的使用
    final int[] phases = { 0b00110001, 0b01100010, 0b11000100, 0b10001001,
    0b00010011, 0b00100110, 0b01001100, 0b10011000 };

1.2  Switch語句支援string型別 

       public static String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
         String typeOfDay;

         switch (dayOfWeekArg) {
             case "Monday":
                 typeOfDay = "Start of work week";
                 break;
             case "Tuesday":
             case "Wednesday":
             case "Thursday":
                 typeOfDay = "Midweek";
                 break;
             case "Friday":

                 typeOfDay = "End of work week";
                 break;
             case "Saturday":
             case "Sunday":
                 typeOfDay = "Weekend";
                 break;
             default:
                 throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
         }
         return typeOfDay;
    } 

1.3 Try-with-resource語句 

  注意:實現java.lang.AutoCloseable介面的資源都可以放到try中,跟final裡面的關閉資源類似; 按照宣告逆序關閉資源 ;Try塊丟擲的異常通過Throwable.getSuppressed獲取 

    try (java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
    java.io.BufferedWriter writer = java.nio.file.Files 
    .newBufferedWriter(outputFilePath, charset)) {
    // Enumerate each entry
    for (java.util.Enumeration entries = zf.entries(); entries
    .hasMoreElements();) {
    // Get the entry name and write it to the output file
    String newLine = System.getProperty("line.separator");
    String zipEntryName = ((java.util.zip.ZipEntry) entries
    .nextElement()).getName() + newLine;
    writer.write(zipEntryName, 0, zipEntryName.length());
    }
    }

1.4 Catch多個異常 說明:Catch異常型別為final; 生成Bytecode 會比多個catch小; Rethrow時保持異常型別 

    public static void main(String[] args) throws Exception {
    try {
    testthrows();
    } catch (IOException | SQLException ex) {
    throw ex;
    }
    }
    public static void testthrows() throws IOException, SQLException {
    }

1.5 數字型別的下劃線表示 更友好的表示方式,不過要注意下劃線新增的一些標準,可以參考下面的示例

    long creditCardNumber = 1234_5678_9012_3456L;
    long socialSecurityNumber = 999_99_9999L;
    float pi = 3.14_15F;
    long hexBytes = 0xFF_EC_DE_5E;
    long hexWords = 0xCAFE_BABE;
    long maxLong = 0x7fff_ffff_ffff_ffffL;
    byte nybbles = 0b0010_0101;
    long bytes = 0b11010010_01101001_10010100_10010010; 
    //float pi1 = 3_.1415F;      // Invalid; cannot put underscores adjacent to a decimal point
    //float pi2 = 3._1415F;      // Invalid; cannot put underscores adjacent to a decimal point
    //long socialSecurityNumber1= 999_99_9999_L;         // Invalid; cannot put underscores prior to an L suffix 
    //int x1 = _52;              // This is an identifier, not a numeric literal
    int x2 = 5_2;              // OK (decimal literal)
    //int x3 = 52_;              // Invalid; cannot put underscores at the end of a literal
    int x4 = 5_______2;        // OK (decimal literal) 
    //int x5 = 0_x52;            // Invalid; cannot put underscores in the 0x radix prefix
    //int x6 = 0x_52;            // Invalid; cannot put underscores at the beginning of a number
    int x7 = 0x5_2;            // OK (hexadecimal literal)
    //int x8 = 0x52_;            // Invalid; cannot put underscores at the end of a number 
    int x9 = 0_52;             // OK (octal literal)
    int x10 = 05_2;            // OK (octal literal)
    //int x11 = 052_;            // Invalid; cannot put underscores at the end of a number 
    1.6 泛型例項的建立可以通過型別推斷來簡化 可以去掉後面new部分的泛型型別,只用<>就可以了。
      //使用泛型前 
    List strList = new ArrayList(); 
    List<String> strList4 = new ArrayList<String>(); 
    List<Map<String, List<String>>> strList5 =  new ArrayList<Map<String, List<String>>>();


    //編譯器使用尖括號 (<>) 推斷型別 
    List<String> strList0 = new ArrayList<String>(); 
    List<Map<String, List<String>>> strList1 =  new ArrayList<Map<String, List<String>>>(); 
    List<String> strList2 = new ArrayList<>(); 
    List<Map<String, List<String>>> strList3 = new ArrayList<>();
    List<String> list = new ArrayList<>();
    list.add("A");
      // The following statement should fail since addAll expects
      // Collection<? extends String>
    //list.addAll(new ArrayList<>()); 

1.7在可變引數方法中傳遞非具體化引數,改進編譯警告和錯誤 

Heap pollution 指一個變數被指向另外一個不是相同型別的變數。例如

    List l = new ArrayList<Number>();
    List<String> ls = l;       // unchecked warning
    l.add(0, new Integer(42)); // another unchecked warning
    String s = ls.get(0);      // ClassCastException is thrown
    Jdk7:
    public static <T> void addToList (List<T> listArg, T... elements) {
    for (T x : elements) {
    listArg.add(x);
    }
    }
    你會得到一個warning
    warning: [varargs] Possible heap pollution from parameterized vararg type
    要消除警告,可以有三種方式
    1.加 annotation @SafeVarargs
    2.加 annotation @SuppressWarnings({"unchecked", "varargs"})
    3.使用編譯器引數 –Xlint:varargs;

  1.8 資訊更豐富的回溯追蹤 就是上面try中try語句和裡面的語句同時丟擲異常時,異常棧的資訊

    java.io.IOException  
    §?      at Suppress.write(Suppress.java:19)  
    §?      at Suppress.main(Suppress.java:8)  
    §?      Suppressed:  java.io.IOException 
    §?          at Suppress.close(Suppress.java:24) 
    §?          at Suppress.main(Suppress.java:9)  
    §?      Suppressed:  java.io.IOException 
    §?          at  Suppress.close(Suppress.java:24)  
    §?          at  Suppress.main(Suppress.java:9) 


2. NIO2的一些新特性

    1.java.nio.file 和java.nio.file.attribute包 支援更詳細屬性,比如許可權,所有者 
    2.  symbolic and hard links支援 
    3. Path訪問檔案系統,Files支援各種檔案操作 
    4.高效的訪問metadata資訊 
    5.遞迴查詢檔案樹,檔案擴充套件搜尋 
    6.檔案系統修改通知機制 
    7.File類操作API相容 
    8.檔案隨機訪問增強 mapping a region,locl a region,絕對位置讀取 
    9. AIO Reactor(基於事件)和Proactor 

  下面列一些示例:

2.1IO and New IO 監聽檔案系統變化通知 

通過FileSystems.getDefault().newWatchService()獲取watchService,然後將需要監聽的path目錄註冊到這個watchservice中,對於這個目錄的檔案修改,新增,刪除等實踐可以配置,然後就自動能監聽到響應的事件。

    private WatchService watcher; 
    public TestWatcherService(Path path) throws IOException {
    watcher = FileSystems.getDefault().newWatchService();
    path.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
    } 
    public void handleEvents() throws InterruptedException {
    while (true) {
    WatchKey key = watcher.take();
    for (WatchEvent<?> event : key.pollEvents()) {
    WatchEvent.Kind kind = event.kind();
    if (kind == OVERFLOW) {// 事件可能lost or discarded
    continue;
    }
    WatchEvent<Path> e = (WatchEvent<Path>) event;
    Path fileName = e.context();
    System.out.printf("Event %s has happened,which fileName is %s%n",kind.name(), fileName);
    }
    if (!key.reset()) {
    break;
    }

2.2 IO and New IO遍歷檔案樹 ,通過繼承SimpleFileVisitor類,實現事件遍歷目錄樹的操作,然後通過Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk);這個API來遍歷目錄樹

    private void workFilePath() {
    Path listDir = Paths.get("/tmp"); // define the starting file 
    ListTree walk = new ListTree();
    …Files.walkFileTree(listDir, walk);…
    // 遍歷的時候跟蹤連結
    EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
    try {
    Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk);
    } catch (IOException e) {
    System.err.println(e);
    }
    class ListTree extends SimpleFileVisitor<Path> {// NIO2 遞迴遍歷檔案目錄的介面 
    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
    System.out.println("Visited directory: " + dir.toString());
    return FileVisitResult.CONTINUE;
    } 
    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) {
    System.out.println(exc);
    return FileVisitResult.CONTINUE;
    }
    }


2.3 AIO非同步IO 檔案和網路 非同步IO在java 
 NIO2實現了,都是用AsynchronousFileChannel,AsynchronousSocketChanne等實現,關於同步阻塞IO,同步非阻塞IO,非同步阻塞IO和非同步非阻塞IO在ppt的這頁上下面備註有說明,有興趣的可以深入瞭解下。Java NIO2中就實現了作業系統的非同步非阻塞IO。

    // 使用AsynchronousFileChannel.open(path, withOptions(),  
        // taskExecutor))這個API對非同步檔案IO的處理  
        public static void asyFileChannel2() {  
            final int THREADS = 5;  
            ExecutorService taskExecutor = Executors.newFixedThreadPool(THREADS);  
            String encoding = System.getProperty("file.encoding");  
            List<Future<ByteBuffer>> list = new ArrayList<>();  
            int sheeps = 0;  
            Path path = Paths.get("/tmp",  
                    "store.txt");  
            try (AsynchronousFileChannel asynchronousFileChannel = AsynchronousFileChannel  
                    .open(path, withOptions(), taskExecutor)) {  
                for (int i = 0; i < 50; i++) {  
                    Callable<ByteBuffer> worker = new Callable<ByteBuffer>() {  
                        @Override 
                        public ByteBuffer call() throws Exception {  
                            ByteBuffer buffer = ByteBuffer  
                                    .allocateDirect(ThreadLocalRandom.current()  
                                            .nextInt(100, 200));  
                            asynchronousFileChannel.read(buffer, ThreadLocalRandom  
    ……


3. JDBC 4.1

3.1.可以使用try-with-resources自動關閉Connection, ResultSet, 和 Statement資源物件 

3.2. RowSet 1.1:引入RowSetFactory介面和RowSetProvider類,可以建立JDBC driver支援的各種 row sets,這裡的rowset實現其實就是將sql語句上的一些操作轉為方法的操作,封裝了一些功能。

3.3. JDBC-ODBC驅動會在jdk8中刪除 

    try (Statement stmt = con.createStatement()) { 
     RowSetFactory aFactory = RowSetProvider.newFactory();
      CachedRowSet crs = aFactory.createCachedRowSet();

     RowSetFactory rsf = RowSetProvider.newFactory("com.sun.rowset.RowSetFactoryImpl", null);
    WebRowSet wrs = rsf.createWebRowSet();
    createCachedRowSet 
    createFilteredRowSet 
    createJdbcRowSet 
    createJoinRowSet 
    createWebRowSet 


4. 併發工具增強 

4.1.fork-join 
 最大的增強,充分利用多核特性,將大問題分解成各個子問題,由多個cpu可以同時解決多個子問題,最後合併結果,繼承RecursiveTask,實現compute方法,然後呼叫fork計算,最後用join合併結果。

    class Fibonacci extends RecursiveTask<Integer> {
    final int n;
    Fibonacci(int n) {
    this.n = n;
    }
    private int compute(int small) {
    final int[] results = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
    return results[small];
    }
    public Integer compute() {
    if (n <= 10) {
    return compute(n);
    }
    Fibonacci f1 = new Fibonacci(n - 1);
    Fibonacci f2 = new Fibonacci(n - 2);
    System.out.println("fork new thread for " + (n - 1));
    f1.fork();
    System.out.println("fork new thread for " + (n - 2));
    f2.fork();
    return f1.join() + f2.join();
    }
    } 

 4.2.ThreadLocalRandon 併發下隨機數生成類,保證併發下的隨機數生成的執行緒安全,實際上就是使用threadlocal

    final int MAX = 100000;
    ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
    long start = System.nanoTime();
    for (int i = 0; i < MAX; i++) {
    threadLocalRandom.nextDouble();
    }
    long end = System.nanoTime() - start;
    System.out.println("use time1 : " + end);
    long start2 = System.nanoTime();
    for (int i = 0; i < MAX; i++) {
    Math.random();
    }
    long end2 = System.nanoTime() - start2;
    System.out.println("use time2 : " + end2); 


4.3. phaser 類似cyclebarrier和countdownlatch,不過可以動態新增資源減少資源

     void runTasks(List<Runnable> tasks) {
    final Phaser phaser = new Phaser(1); // "1" to register self
    // create and start threads
    for (final Runnable task : tasks) {
    phaser.register();
    new Thread() {
    public void run() {

相關推薦

JAVA併發容器:JDK1.7 1.8 ConcurrentHashMap 區別

生活 為什麼我們總是沒有時間把事情做對,卻有時間做完它? 瞭解ConcurrentHashMap 工作中常用到hashMap,但是HashMap在多執行緒高併發場景下並不是執行緒安全的。 所以引入了ConcurrentHashMap,它是HashMap的執行緒安全版本,採用了分段

java jdk1.7jdk1.8 區別

1.jdk7語法上   1.1二進位制變數的表示,支援將整數型別用二進位制來表示,用0b開頭。   // 所有整數 int, short,long,byte都可以用二進位制表示    // An 8-bit 'byte' value:    byte aByte = (by

java集合之----HashMap原始碼分析(基於JDK1.71.8

一、什麼是HashMap 百度百科這樣解釋: 簡而言之,HashMap儲存的是鍵值對(key和value),通過key對映到value,具有很快的訪問速度。HashMap是非執行緒安全的,也就是說在多執行緒併發環境下會出現問題(死迴圈) 二、內部實現 (1)結構 HashM

JDK1.7JDK1.8相互切換

1. 配置好環境變數(我的是64bit系統) JAVA_HOME = C:\Program Files\Java\jdk1.7.0_25 CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar Path = ;%JAVA_HOME%

FtpClient jdk1.7jdk1.6區別

FtpClient 在jdk1.7,變成了private的,所以沒辦法通過new去例項化,為此百度了一些,總結一下1.6到1.7的變化 //ftpClient = new FtpClient(); 原有的new 方法 ftpClient = FtpClie

對於JVM記憶體模型的理解(對比jdk1.71.8

首先介紹一下java虛擬機器規範所規定的java記憶體模型:1.程式計數器(java記憶體模型中唯一不會發生oom的空間),負責記錄正在執行的虛擬機器位元組碼地址,如果是native方法,則計數器值為空,執行緒私有區2.java虛擬機器棧,生命週期與執行緒相同。描述java方

jdk1.7jdk1.8切換問題

前言 在做不同的java專案時候,很可能來回切換jdk,由於小編的jdk1.7是安裝版的,jdk1.8是綠色版的,當做不同的專案時候,就來回切換jdk了,遇到了一下問題。 遇到的問題 修改

JDK1.7和1.8中HashMapConcurrentHashMap總結比較

談到HashMap和ConcurrentHashMap,必然會聯想到一些其他集合結構,比如HashTable,Vector等,先理一下他們的區別吧。其實HashTable和Vector已經被廢棄了,HashTable和Vector以及ConcurrentHashMap都是執行緒安全的同步結構,區別是

ConcurrentHashMap JDK1.7JDK1.8區別

前言 以前寫過介紹HashMap的文章,文中提到過HashMap在put的時候,插入的元素超過了容量(由負載因子決定)的範圍就會觸發擴容操作,就是rehash,這個會重新將原陣列的內容重新hash到新的擴容陣列中,在多執行緒的環境下,存在同時

ConCurrentHashMap JDK1.7JDK1.8區別

轉自:https://www.jianshu.com/p/933289f27270 ConCurrentHashMap 1.8 相比 1.7的話,主要改變為: 去除 Segment + HashEntry + Unsafe 的實現, 改為 Synchronized + CAS + N

jdk1.7 jdk 1.8 生產環境JVM引數

jdk 1.7 生產虛擬機器引數(新增到 catalina.sh中)#JAVA_OPTS="-Xmx8000M -Xms8000M -Xmn1024M -XX:PermSize=2048M -XX:MaxPermSize=2048M -Xss256K -XX:+Disable

str.split(&amp;amp;quot;&amp;amp;quot;)在JDK1.7JDK1.8中的區別

問題描述:今天幫同門作華為的筆試題,我在自己電腦上除錯好的程式碼上傳後會報陣列越界的異常,這讓我非常的難受,經過認真查詢問題的原因發現,我本地用的是JDK1.7,而上傳後用的是JDK1.8編譯執行,String.split("")在JDK1.7和JDK1.8中切割後是有差別的

jdk1.7jdk1.8區別

轉自:http://www.2cto.com/kf/201307/225968.html 本文是我學習瞭解了jdk7和jdk8的一些新特性的一些資料,有興趣的大家可以瀏覽下下面的內容。 官方文件:http://www.oracle.com/technetwork/jav

JDK1.7和1.8中List集合中sort方法排序問題【JAVA

上次做專案的過程中遇到一個對list集合排序的問題,一直困擾著我,後來一直到最後找了半天才發現問題所在。 因為我本機上JDK版本是1.8 ,而伺服器中JDK版本是1.7,因此線上下測試的過程中跑資料都好好地, 而到了線上卻總是出現問題,後來查詢很多文章才予以解決,現在特地記

JDK1.7&1.8源碼對比分析【集合】HashMap

rst www. sub com final 建議 views trie emp 前言 在JDK1.8源碼分析【集合】HashMap文章中,我們分析了HashMap在JDK1.8中新增的特性(引進了紅黑樹數據結構),但是為什麽要進行這個優化呢?這篇文章我們通過對比JDK1.

JDK1.7&1.8源碼對比分析【集合】ConcurrentHashMap

ted html eat 重點 內部 int bits ola ase 前言 在JDK1.7&1.8源碼對比分析【集合】HashMap中我們對比分析了JDK1.7和1.8版本的HashMap源碼,趁熱打鐵,這篇文章就來看看JDK1.7和1.8版本的Concurren

個人筆記本安裝多個jdk(jdk1.7jdk1.8jdk1.9,jdk10.0)出現的問題

oracle java 個人筆記 選擇 bubuko 1.9 style 輸入 data 1、個人筆記本已經安裝jdk1.7,jdk1.8,(之前沒有在意這個問題)。最近想學習jdk10.0,安裝以後,環境變量變成了jdk10.0,就是cmd輸入命令java -versio

jdk1.7(1.8) 安裝配置(Windows)

JDK1.7安裝步驟 1.jdk1.7官方下載 首先訪問: http://www.oracle.com/technetwork/java/javase/downloads/index.html 這個地址到官方網站下載頁面 2.安裝jdk1.7 雙擊下載好的安裝包點選接受

Windows10如何實現Jdk1.7Jdk1.8的完美切換

步驟1.安裝JDK1.7; 步驟2.配置JDK環境變數; 參見:Windows10下配置JDK環境變數 步驟3.檢查JDK是否安裝成功命令,java -version;java;javac; 步驟4.安裝JDK1.8; 步驟5.安裝完成後 刪除系統環境變數path的C

JDK1.7JDK1.8下載

由於JDK官網下載緩慢,所以特此分享已上傳網盤的JDK,方便與大家使用 JDK1.8 連線:https://pan.baidu.com/s/15RTqCJGK4FJt5y_p7g4qlA  密碼:00tk JDK1.7 連線:https://pan.baidu.com