java jdk1.7與jdk1.8 區別
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.7與jdk1.8 區別
1.jdk7語法上 1.1二進位制變數的表示,支援將整數型別用二進位制來表示,用0b開頭。 // 所有整數 int, short,long,byte都可以用二進位制表示 // An 8-bit 'byte' value: byte aByte = (by
java集合之----HashMap原始碼分析(基於JDK1.7與1.8)
一、什麼是HashMap 百度百科這樣解釋: 簡而言之,HashMap儲存的是鍵值對(key和value),通過key對映到value,具有很快的訪問速度。HashMap是非執行緒安全的,也就是說在多執行緒併發環境下會出現問題(死迴圈) 二、內部實現 (1)結構 HashM
JDK1.7與JDK1.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.7與jdk1.6區別
FtpClient 在jdk1.7,變成了private的,所以沒辦法通過new去例項化,為此百度了一些,總結一下1.6到1.7的變化 //ftpClient = new FtpClient(); 原有的new 方法 ftpClient = FtpClie
對於JVM記憶體模型的理解(對比jdk1.7與1.8)
首先介紹一下java虛擬機器規範所規定的java記憶體模型:1.程式計數器(java記憶體模型中唯一不會發生oom的空間),負責記錄正在執行的虛擬機器位元組碼地址,如果是native方法,則計數器值為空,執行緒私有區2.java虛擬機器棧,生命週期與執行緒相同。描述java方
jdk1.7與jdk1.8切換問題
前言 在做不同的java專案時候,很可能來回切換jdk,由於小編的jdk1.7是安裝版的,jdk1.8是綠色版的,當做不同的專案時候,就來回切換jdk了,遇到了一下問題。 遇到的問題 修改
JDK1.7和1.8中HashMap與ConcurrentHashMap總結比較
談到HashMap和ConcurrentHashMap,必然會聯想到一些其他集合結構,比如HashTable,Vector等,先理一下他們的區別吧。其實HashTable和Vector已經被廢棄了,HashTable和Vector以及ConcurrentHashMap都是執行緒安全的同步結構,區別是
ConcurrentHashMap JDK1.7和JDK1.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
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;quot;&amp;quot;)在JDK1.7和JDK1.8中的區別
問題描述:今天幫同門作華為的筆試題,我在自己電腦上除錯好的程式碼上傳後會報陣列越界的異常,這讓我非常的難受,經過認真查詢問題的原因發現,我本地用的是JDK1.7,而上傳後用的是JDK1.8編譯執行,String.split("")在JDK1.7和JDK1.8中切割後是有差別的
jdk1.7和jdk1.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.7,jdk1.8,jdk1.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.7和Jdk1.8的完美切換
步驟1.安裝JDK1.7; 步驟2.配置JDK環境變數; 參見:Windows10下配置JDK環境變數 步驟3.檢查JDK是否安裝成功命令,java -version;java;javac; 步驟4.安裝JDK1.8; 步驟5.安裝完成後 刪除系統環境變數path的C
JDK1.7和JDK1.8下載
由於JDK官網下載緩慢,所以特此分享已上傳網盤的JDK,方便與大家使用 JDK1.8 連線:https://pan.baidu.com/s/15RTqCJGK4FJt5y_p7g4qlA 密碼:00tk JDK1.7 連線:https://pan.baidu.com