小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

溫故而知新,重溫 Java 7 的那些“新”特性

 佬總 2019-12-19

2009 年 4 月 20 日,Java 的親生父親 Sun 被養(yǎng)父 Oracle 以 74 億美元收購,這在當(dāng)時(shí)可是一件天大的事。有不少同學(xué)都擔(dān)心 Java 的前途,我當(dāng)時(shí)傻不啦嘰地也很擔(dān)心:自己剛學(xué)會(huì)如何通過記事本編寫 Java 代碼,然后通過 cmd 打印 Hello World 呢,這一下難道白學(xué)了?

但其實(shí)這種擔(dān)心是多余的,因?yàn)?Java 并不會(huì)陪葬,畢竟行業(yè)內(nèi)有太多基于 Java 的軟件系統(tǒng)在運(yùn)行,Java 牽扯了太多人的飯碗。10 年過去了,Java 果然沒有陪葬,我仍然堅(jiān)守在 Java 的陣線上。

2011 年 7 月 7 日,代號(hào)「海豚(Dolphin)」的 Java 7 首次推出,這也是 Java 歷史上一次非常重要的版本更新。同時(shí)推出了非常多實(shí)用的新特性,比如說創(chuàng)建泛型實(shí)例時(shí)自動(dòng)類型推斷、switch-case 語句支持字符串類型、新增 try-with-resources 語句等等。

這么多年過去了,Java 7 的“新”特性顯然都變成老古董了——它們似乎也不需要我再贅述了,但好像不是這樣的。前幾天我發(fā)了一篇文章,用到了其中一個(gè)新特性,竟然有同學(xué)表示從來沒見過這個(gè)新特性,特意在交流群里@我,要我說清楚怎么回事(代碼折疊了,隨后貼出來)。

當(dāng)時(shí)我就在想啊,原來技術(shù)從來沒有“新與舊”之說,只有知不知道。所以借此機(jī)會(huì),我就再來“贅述”一下 Java 7 的那些最經(jīng)常使用的新特性吧。

01、數(shù)值中可使用下劃線分隔符聯(lián)接

之前圖片中的代碼沒有展示全,現(xiàn)在我把具體的代碼貼出來。

try { AsynchronousFileChannel channel = AsynchronousFileChannel.open(file); Future<Integer> result = channel.read(ByteBuffer.allocate(100_000), 0);} catch (IOException e) { e.printStackTrace();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中 100_000 就是讀者要我解釋清楚的那個(gè)特性:在數(shù)值類型的字面值中使用下劃線分隔符聯(lián)接。

人腦不總是很善于記住很長串的數(shù)字,所以在處理長串?dāng)?shù)字時(shí)會(huì)采用分割法,比如說電話號(hào)碼要用一個(gè)分隔符“-”隔開,銀行卡號(hào)會(huì)每隔四位有一個(gè)空格等等。

數(shù)字中沒有用逗號(hào)(,)和中劃線(-)作為分隔符,是因?yàn)樗鼈兛赡軙?huì)引發(fā)歧義,取而代之的是下劃線(_)。這個(gè)不起眼的特性,讓我們開發(fā)人員在處理數(shù)字上輕松多了,畢竟 100_000100000 (忍不住查了一遍 0 的個(gè)數(shù),害怕多寫或者少寫)辨識(shí)度高得多。

下劃線(_)位置并不固定,你可以隨意擺放,舉例如下:

int a = 100_000, b = 100000, c = 10_0000;System.out.println(a==b); // trueSystem.out.println(b==c); // trueSystem.out.println(a==c); // true
  • 1
  • 2
  • 3
  • 4

需要注意的是,下劃線僅僅能在數(shù)字中間,編譯器在編譯的時(shí)候自己主動(dòng)刪除數(shù)字中的下劃線。反編譯后的代碼如下所示:

int a = 100000;int b = 100000;int c = 100000;System.out.println(a == b);System.out.println(b == c);System.out.println(a == c);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

02、 switch-case 語句支持字符串類型

我們都知道,switch 是一種高效的判斷語句,比起 if/else 真的是爽快多了。示例如下:

String wanger = '王二';switch (wanger) {case '王二':	System.out.println('王三他哥哥王二');	break;case '王三':	System.out.println('王二他弟弟王三');	break;default:	System.out.println('王二他妹妹王六');	break;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

switch-case 語句在處理字符串的時(shí)候,會(huì)先將 switch 括號(hào)中的字符串和 case 后的字符串轉(zhuǎn)成 hashCode,所以字符串不能為 null,否則會(huì)拋出 NullPointerException。反編譯后的代碼如下所示:

String wanger = '王二';switch (wanger.hashCode()) { case 936926 : if (wanger.equals('王三')) { System.out.println('王二他弟弟王三'); return; } break; case 937057 : if (wanger.equals('王二')) { System.out.println('王三他哥哥王二'); return; }}System.out.println('王二他妹妹王六');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

03、try-with-resources 語句

try-with-resources 的基本設(shè)想是把資源(socket、文件、數(shù)據(jù)庫連接)的作用域限定在代碼塊內(nèi),當(dāng)這塊代碼執(zhí)行完后,資源會(huì)被自動(dòng)釋放。

在此之前,資源的釋放需要在 finally 中主動(dòng)關(guān)閉,不管 try 中的代碼是否正常退出或者異常退出。就像下面這樣:

BufferedReader in = null;try {	in = new BufferedReader(new FileReader('cmower.txt'));	int charRead;	while ((charRead = in.read()) != -1) {		System.out.printf('%c ', (char) charRead);	}} catch (IOException ex) {	ex.printStackTrace();} finally {	try {		if (in != null)			in.close();	} catch (IOException ex) {		ex.printStackTrace();	}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

這樣的代碼看起來就像老太婆的裹腳布,又臭又長;有了 try-with-resources 之后,情況大有改觀,不信你看:

try (BufferedReader in = new BufferedReader(new FileReader('cmower.txt'));) { int charRead; while ((charRead = in.read()) != -1) { System.out.printf('%c ', (char) charRead); }} catch (IOException ex) { ex.printStackTrace();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

是不是清爽多了!把需要釋放的資源放在 try 后的 () 中,連 finally 也不需要了。不過,需要注意的是,上面的代碼還需要優(yōu)化,應(yīng)該為每一個(gè)資源聲明獨(dú)立的變量,否則的話,某些特殊的情況下,資源可能無法正常關(guān)閉。

try (FileReader fr = new FileReader('cmower.txt'); 	BufferedReader in = new BufferedReader(fr);) {	int charRead;	while ((charRead = in.read()) != -1) {		System.out.printf('%c ', (char) charRead);	}} catch (IOException ex) {	ex.printStackTrace();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

try-with-resources 特性依賴于一個(gè)新定義的接口 AutoCloseable,需要釋放的資源必須要實(shí)現(xiàn)這個(gè)接口。

不過,try-with-resources 在本質(zhì)上仍然使用了 finally 去釋放資源,只不過這部分工作不再由開發(fā)者主動(dòng)去做——從反編譯后的結(jié)果可以看得出來:

try { Throwable var1 = null; Object var2 = null; try { FileReader fr = new FileReader('cmower.txt'); try { BufferedReader in = new BufferedReader(fr); int charRead; try { while ((charRead = in.read()) != -1) { System.out.printf('%c ', (char) charRead); } } finally { if (in != null) { in.close(); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

04、創(chuàng)建泛型實(shí)例時(shí)自動(dòng)類型推斷

在這個(gè)特性出現(xiàn)之前,有關(guān)泛型變量的聲明略顯重復(fù),示例如下:

Map<String, ArrayList<String>> wanger = new HashMap<String, ArrayList<String>>();
  • 1

這樣的代碼簡直太長了,很多重復(fù)的字符,難道編譯器不能推斷出泛型的類型信息嗎?Java 7 實(shí)現(xiàn)了這個(gè)心愿。

Map<String, List<String>> wanger = new HashMap<>();List<String> chenmo = new ArrayList<>();wanger.put('chenmo', chenmo);
  • 1
  • 2
  • 3

這個(gè)看似簡單的特性省去了不少敲擊鍵盤的次數(shù)。

05、最后

除了上面我列出的這 4 個(gè)常用的新特性,Java 7 還有一些其他的特性,比如說 multi-catch,可以在一個(gè) catch 語句中捕獲多個(gè)異常;比如說對(duì)集合(Collections)的增強(qiáng)支持,可以直接采用 []、{} 的形式存入對(duì)象,采用 [] 的形式按照索引、鍵值來獲取集合中的對(duì)象等等。

但總體上,我列出的那 4 個(gè)特性最為常用,其學(xué)習(xí)的意義更大。如果你覺得漏掉了某些更為常用的特性,歡迎你在文末提出來。

歡迎關(guān)注「沉默王二」公眾號(hào),后臺(tái)回復(fù)關(guān)鍵字「java」即可免費(fèi)獲取「Java 程序員進(jìn)階必讀資料」。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多