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

jdk1.7和jdk1.8區別

轉自:http://www.2cto.com/kf/201307/225968.html

本文是我學習瞭解了jdk7和jdk8的一些新特性的一些資料,有興趣的大家可以瀏覽下下面的內容。

官方文件:http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html

在jdk7的新特性方面主要有下面幾方面的增強:

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();

相關推薦

ConcurrentHashMap JDK1.7JDK1.8區別

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

ConCurrentHashMap JDK1.7 JDK1.8區別

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

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

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

ConcurrentHashMap的實現原理(JDK1.7JDK1.8)

http://youzhixueyuan.com/concurrenthashmap.html HashMap、CurrentHashMap 的實現原理基本都是BAT面試必考內容,阿里P8架構師談:深入探討HashMap的底層結構、原理、擴容機制深入談過hashmap的實現原理以及在JDK 1.

HashMap在jdk1.71.8中的實現

Java集合類的原始碼是深入學習Java非常好的素材,原始碼裡很多優雅的寫法和思路,會讓人歎為觀止。HashMap的原始碼尤為經典,是非常值得去深入研究的,jdk1.8中HashMap發生了比較大的變化,這方面的東西也是各個公司高頻的考點。網上也有很多應對面試的標準答案,我之前也寫過類似的面

併發程式設計系列:ConcurrentHashMap的實現原理(JDK1.7JDK1.8)

轉載自:https://www.toutiao.com/i6623301848268800519/ HashMap、CurrentHashMap 的實現原理基本都是BAT面試必考內容,阿里P8架構師談:深入探討HashMap的底層結構、原理、擴容機制深入談過hashmap的實現原理

JDK1.7JDK1.8的切換

JDK1.7和JDK1.8的切換 轉自:https://blog.csdn.net/elice_/article/details/80471312(備註:我只是記錄一下,自己用) 目錄 一、配置jdk1.7(win7系統) 二、jd

Windows上實現JDK1.71.8切換

最近做專案需要用到JDK1.7,原來電腦安裝了JDK1.8版本,現在要用JDK1.7。 如果把1.8刪掉,那麼要用的時候呢?又得裝回來 所以就想能不能兩個版本的都裝上需要用到的時候更改一下路徑就可以切換了,經過查資料發現是可以的。 1. 配置好環境變數 JAVA_HOME =

JDK1.71.8中HashMap與ConcurrentHashMap總結比較

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

【必備技能】HashMap在jdk1.71.8中的實現

static final int TREEIFY_THRESHOLD = 8; public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } final V putVal(i

HashMap jdk1.71.8概述

大家好,我是烤鴨:這是一篇關於HashMap的概述和底層原理的介紹。算是網上很多帖子的綜合和我自己的一點想法。HashMap在jdk1.8以前是陣列+連結串列。在jdk1.8以後是陣列+連結串列+紅黑樹。一點點分析資料結構。1. Map中的entry物件:static cla

Win10同時安裝jdk1.7jdk1.8

       已經安裝過jdk1.7,但是不能滿足需求,因為許多外掛、框架等新的功能需要jdk1.8才能使用,所以就想安裝1.8,不過1.7還不準備解除安裝,就考慮安裝多個jdk。 下載: 先下載jdk1.8,建議去官網下載,需要oracle賬號,這個可以免費註冊。

JDK1.71.8中List集合中sort方法排序問題【JAVA】

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

win7電腦上安裝jdk1.71.8

      跟進兩個專案,一個用的jdk是1.7的,一個用1.8的,之前兩個版本都有,但是那會用1.7的,有1.8在就報錯,就卸了,沒想到還是逃不過。。。下面是我的解決辦法   首先安裝jdk1.7版本,我的jdk 1.6 放在  D:\others\Java\jdk1.7

JDK1.7JDK1.8的ConcurrentHashMap

從JDK1.7版本的ReentrantLock+Segment+HashEntry,到JDK1.8版本中synchronized+CAS+HashEntry+紅黑樹,相對而言,總結如下思考1.JDK1.8的實現降低鎖的粒度,JDK1.7版本鎖的粒度是基於Segment的,包含

mac下同時安裝jdk1.7jdk1.8如何切換

1.檢視jdk的路徑 yaomingyangdeMacBook-Pro:bin yaomingyang$ which java /usr/bin/java yaomingyangdeMacBook-Pro:bin yaomingyang$ cd /usr/

jdk1.7jdk1.6的Collections.sort方法不一樣

Collections.sort(list, new Comparator<AAAVo>() {                           @Override                           public int compare(AAAVo vo1, AAA vo2