StackOverflow:7個你從未見過的Java問題最佳答案
本文由碼農網 – 李俊英原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
對開發人員來說, StackOverflow就像一個金礦。對具體的問題,它能幫我們找到最有用的答案,並且我們也可以從上面學習新的知識。
下面的內容,通過這些最常見的JAVA問題與答案,並著重的標記出我們找到的精華問題。即便你是一個經驗豐富的開發人員,這些也是值得去學習的。
JAVA問題縱覽
JAVA是StackOverflow上 第二流行的標籤 ,有超過100萬個問題與JAVA有關。僅在上個禮拜,就有4600個問題被提出,毫無疑問這裡是開發者們最大也是最為活躍的線上社群。
此資訊同樣也出自StackOverflow 2016年的開發者調查中 ,56033名開發者被問到關於開發語言的選擇,JAVA是第三位。因為在市場上JAVA佔據著主導,因此我們估計讀者也曾經有那麼一兩次的去訪問StackOverflow來尋找答案。但是,即使你隨意的在StackOverflow上閒逛,也會發現很多有趣的問題,下面讓我們來看看這些精心選出的問題。
分支預測
在StackOverflow上最經常被問到的一個問題就是” 為什麼處理一個排序過的陣列比一個未排序的陣列要快 ?”回答這樣的問題,你得了解分支預測。
分支預測是一種期望可以提升應用流程的架構,旨在一條路徑在真正被執行前就可以被提前的猜出。當然它不僅僅是一個完全意義上的猜測,而是一個有目的性的猜測。
分支在這裡就是一個“IF 語句”。在此情況下,如果陣列是排序過的,分支預測將起作用,不然則無法工作。 Mysticial 試著用一種簡單的方式來解釋這個問題,以鐵路和火車為例子。想像一下,你駕駛火車來到一個交匯點,接下來你需要決定火車走哪條線。你會選擇左還是右?當然,你也可以停下火車問問司機哪一條路是正確的,但是這卻會降低整個火車執行的速度,並讓火車的行進過程變的更加複雜。你也可以猜一下,但是你如何確保你猜的一定是對的呢?瞭解下這趟火車之前的司機都是怎麼做的,並且知道在此之前他們都是如何選擇道路的,這是一個非常好的主意。
這就是分支預測:找到模式並且使用他們。
不幸的是,多數情況下能問出這樣問題的多半是一個失效的分支預測的受害者。由於分支沒有可識別的模式,想要去猜測就真的只能是一個隨機的猜測了。
JAVA的安全性
另一個流行的JAVA問題是“為什麼在JAVA的密碼管理中,更傾向去使用char[]而不是String?”更具體一些的問法是:為什麼在JAVA Swing中的密碼輸入框方法是:getPassword(return char[]), 而不是getText(return String)
毫無意外的,這裡是一個安全問題。因為String 是不可變的,這意味著你一旦建立了它則無法修改。同樣也意味著在GC前你無法徹底的刪除掉它。在某些情況下,如果有人黑進了你的記憶體,那麼被儲存成String的密碼則可以被人獲取的。
這就是為什麼 你需要使用字元陣列。你可以在使用完後顯式的清除它,或者你也可以用其他的別的東西去覆蓋它。這樣敏感的資訊就不會在系統的其他地方出現,即使此時GC還沒有啟動。
異常
即使有很多開發人員會忽略異常檢查,但是依然有很多問題是關於JAVA異常的。在你的程式碼中這是一個值得引起你注意的問題,忽略它並不能使它消失。
最常見的一個問題是“什麼是 NullPointerException,並如何消除它“, 看到這樣的問題有如此多的人問,我們毫不驚奇。在JAVA的生產環境中,空指標異常也確實是排名第一的異常型別。
Takipi 介紹了一種檢查空指標異常或者其他異常的一種新的方法。
一些有趣的問題
StackOverflow上總有些有趣的問題可以教授你一些新的知識。我們選瞭如下內容
為何如下程式碼可以使用Random String來列印出”Hello World”?
public static String randomString(int i) { Random ran = new Random(i); StringBuilder sb = new StringBuilder(); while (true) { int k = ran.nextInt(27); if (k == 0) break; sb.append((char)('`' + k)); } return sb.toString(); }
如果是一組選擇好的隨機數,那麼事實上他們並不是真正隨機的。隨機數的演算法是根據種子引數來進行計算的,(當前則是 -229985452 或者 -147909649)。每一次當申請一個隨機數的時候,它會根據相同的隨機數種子來生成一個相同的值 – 列印出”hello world”。
Random(-229985452).nextInt(27)
前六個隨機數是:8,5,12,12,15,0.
Random(-147909649).nextInt(27)
前六個隨機數是:23,15,18,12,4,0
當你將這些數字轉換成字元的時候
104 –> h
101 –> e
108 –> l
108 –> l
111 –> o
119 –> w
111 –> o
114 –> r
108 –> l
100 –> d
你將獲得hello world
為何兩個相差一秒的時間相減會有奇怪的結果
public static void main(String[] args) throws ParseException { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str3 = "1927-12-31 23:54:07"; String str4 = "1927-12-31 23:54:08"; Date sDt3 = sf.parse(str3); Date sDt4 = sf.parse(str4); long ld3 = sDt3.getTime() /1000; long ld4 = sDt4.getTime() /1000; System.out.println(ld4-ld3); }
Java version:
java version "1.6.0_22" Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)
Timezone(TimeZone.getDefault()):
sun.util.calendar.ZoneInfo[id="Asia/Shanghai", offset=28800000,dstSavings=0, useDaylight=false, transitions=19, lastRule=null] Locale(Locale.getDefault()): zh_CN
輸出結果是353 (譯者注:在JDK 1.8上未能重現這個問題, 原題注的JAVA版本是1.6)
很顯然只有一秒的差距,但是得到的結果確實353,一個最基本的解釋是:時區的問題。在1927年12月31日,上海的時區往後移動了5分鐘52秒。
值得一提的是,如果你嘗試著去執行這段程式碼,可能會有不同的結果。根絕Time Zone Database Project 2014 專案。這一時區的改變被挪到了1900-12-31,,因此可能有個343秒的一個變化。
不可捕獲的ChuckNorrisException
有一些問題是關於:有沒有一種異常是可以被丟擲的,但是沒人可以捕獲它, 應用會崩潰麼?或者這樣的問題也可以變成“有沒有程式碼可以讓java.lang.ChuckNorrisException變成無法捕獲的異常?“。
簡單的回答是:這是可能的,但是那是有一些前提的。你可以編譯一段程式碼丟擲ChuckNorrisException,然後再定義一個ChuckNorrisException類,但是這個類卻不在執行時繼承自Throwable。但是僅僅如此還是不夠的,你必須禁用二進位制碼檢查。“StackOverflow”上有一個答案可以提供這樣的一個完整例子 (點選訪問)
如果你喜歡類似的問題,你可以檢視 Java Deathmatch 遊戲
Hash Maps
在StackOverflow上還有一種常見的問題是與hash maps有關的。很多開發人員都想知道集合類中的不同類的區別,以及在何時用哪一個。
核心的問題是迭代的順序。在HashMap中是沒有任何與順序有關的資訊的,並且元素的順序在你插入集合的時候就已經被改變了。在TreeMap中,你可以得到一個已被排序的集合,在LinkedHashMap中,你可以得到一個先進先出(FIFO)的集合。
如果你還有疑惑,我們的朋友Rebel Labs製作了 一個圖 來解釋這些集合間的關係。
結束語
無論你對JAVA有多瞭解,總有些的知識是需要你學習的。StackOverflow不僅僅是問問題的地方,也是可以徹底的學習新知識的地方。
譯文連結:http://www.codeceo.com/article/7-java-question-in-stackoverflow.html
英文原文:StackOverflow: Seven of the Best Java Answers That You Haven’t Seen
翻譯作者:碼農網 – 李俊英
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- Stackoverflow上人氣最旺的10個Java問題Java
- 6個你可能從未使用過的Python技巧!Python
- 十個最常見的Java字串問題Java字串
- 超過百萬的StackOverflow Flutter 問題-第二期Flutter
- Oracle面試過程中常見的二十個問題Oracle面試
- 你從未聽說過的 JavaScript 早期特性JavaScript
- 你可能從未聽說過這15個HTML元素方法!HTML
- 那些年,我們見過的 Java 服務端“問題”Java服務端
- 我從未見過如此神經病的打牌遊戲遊戲
- java 常見問題Java
- 常見的Java面試問題Java面試
- 初學Java會遇見的幾個問題分享!Java
- mamute是一個類似stackoverflow的Q&A問答系統Java引擎Java
- 深入淺出 eBPF|你要了解的 7 個核心問題eBPF
- java中list的常見問題。Java
- 看過無數Java GC文章,這5個問題你也未必知道!JavaGC
- C語言新手最常見的問題!你在這裡跌倒過嗎?C語言
- 我從未見過如此“魔幻”的E3釋出會
- 10個最常見的JavaScript問題JavaScript
- 5種你可能從未聽說過的程式語言
- Java 常見問題彙總Java
- JAVA系列:HashMap常見問題JavaHashMap
- JAVA常見開發問題Java
- 你應當知道的7個Java工具Java
- 最常見的15個Java多執行緒,併發面試問題Java執行緒面試
- Vue中的EventBus使用時你遇到過這個問題嗎???Vue
- 前端自動指令碼中常見的幾個問題,你遇到了嗎?前端指令碼
- 軟體外包的7個問題
- 入行 AI 的幾個常見問題AI
- 武裝你的WEBAPI-OData常見問題WebAPI
- CSM|在企業中推行敏捷,這些常見的問題你遇到過嗎?敏捷
- Java常見問題集錦(轉)Java
- 網站建設過程中常見的問題網站
- 九個問題帶你-從入門到熟悉 HTTPSHTTP
- 40個Java集合面試問題和答案,面試奇葩問題,你掌握了嗎?Java面試
- 15個問題告訴你如何使用Java泛型Java泛型
- 【常見Web應用安全問題】—7、CRLFinjectionWeb
- Java面試常問的幾個問題Java面試