前言
以前學習的過程當中,天天都是老師說這個是JDK7之後可使用,那個是JDK8之後可使用,天天都記的很混亂,今天專門忙裏偷閒,歸攏整理下JDK7的新特性,對於JDK的新特性,後期會進行整理更新,但願能夠幫助到有須要的朋友。java
一,語法上
String s = "test"; switch (s) { case "test" : System.out.println("test"); case "test1" : System.out.println("test1"); break ; default : System.out.println("break"); break ; }
// 全部整數 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 };
注意:實現java.lang.AutoCloseable接口的資源均可以放到try中,跟final裏面的關閉資源相似; 按照聲明逆序關閉資源 ;Try塊拋出的異常經過Throwable.getSuppressed獲取sql
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()); } } }
public static void main(String[] args) throws Exception { try { testthrows(); } catch (IOException | SQLException ex) { throw ex; } } public static void testthrows() throws IOException, SQLException {}
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 = 52;// 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
//使用泛型前 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<>());
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;
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的一些新特性
經過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; }
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; } }
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) ……
三. 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、併發工具加強
最大的加強,充分利用多核特性,將大問題分解成各個子問題,由多個cpu能夠同時解決多個子問題,最後合併結果,繼承RecursiveTask,實現compute方法,而後調用fork計算,最後用join合併結果。app
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(); } }
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);
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() { phaser.arriveAndAwaitAdvance(); // await all creation task.run(); } }.start(); } // allow threads to start and deregister self phaser.arriveAndDeregister(); }
結尾
因爲我的能力問題,還有不少須要改進的地方,若有錯誤,煩請各位大佬私信或留言進行批評指正,在下定當及時更正!dom