stackoverflow_Stackoverflow:您尚未发现的7个最佳Java答案
stackoverflow
您可以在Stackoverflow上找到哪些最有趣的答案?
Stackoverflow是開發人員的金礦。 它可以幫助我們找到遇到的特定問題的最有用答案,并且我們總是從中學習新事物。
在以下文章中,我們研究了最受歡迎的Java問題和答案,并決定重點介紹一些我們發現的珍貴寶石。 即使您是經驗豐富的開發人員,也總會有一些新東西要學習。
所有人的Java答案
Java是Stackoverflow上第二受歡迎的標簽 ,與它相關的問題超過一百萬。 在上周,有超過4,600個問題上傳到該網站,毫無疑問,它是最大,最活躍的在線開發人員社區。
這些信息與Stackoverflow的2016年開發人員調查結果緊密相關,在該調查中,有56,033名編碼員被問到他們選擇哪種語言。 Java排在第三位:
2016年最受歡迎的技術。來源:Stackoverflow
我們已經知道Java統治著就業市場 ,可以肯定地假設您也曾經訪問過Stackoverflow一次或兩次來找到問題的答案。 但是,即使您只是隨便瀏覽Stackoverflow而沒有特定的問題,也會彈出很多有趣的事情。 讓我們看看其中一些寶石。
1.分支預測
在Stackoverflow上最受爭議的Java問題之一是:“ 為什么處理排序數組比未排序數組更快? ”。 為了回答這個問題,您需要使用分支預測。 它是一種架構,旨在通過猜測在選擇實際路徑之前特定分支的運行方式來改善應用程序流程。 如果您愿意,可以進行有根據的猜測,但這實際上并不是猜測。
for (int i = 0; i < 100000; ++i){// Primary loopfor (int c = 0; c < arraySize; ++c){if (data >= 128)sum += data;}}這里的分支是if語句。 在這種情況下,如果對數組進行排序,則分支預測將起作用。 如果未排序,它將無法正常工作。
Mysticial已嘗試使用鐵路和火車以更簡單的方式對此進行解釋。 想象一下,您經營一個路口,需要確定火車的行駛方向,您會選擇向左還是向右? 當然,您可以停止火車,并問駕駛員哪種方法是正確的方法,但這會使整個過程緩慢,笨拙且令人討厭。 您需要猜測。 您如何確定自己的猜測是正確的? 查看當前列車的過去行駛情況,了解每次行駛的方向。
那就是分支預測:識別模式并遵循它們。
不幸的是,在這種情況下,提出主要問題的用戶是分支預測失敗的受害者。 發生這種情況是因為分支沒有可識別的模式,因此嘗試預測其動作是非常隨機的。
2. Java的安全性
Java用戶經常會提出的另一個常見問題是:“ 為什么 Java中使用char []而不是String來代替String? ”。 這個問題本身更具體一些,詢問為什么Swing密碼字段具有getPassword()(返回char [])方法而不是getText()(返回String)。
這里不足為奇–這是一個安全問題。 字符串是不可變的,這意味著您無法在創建字符串后對其進行修改。 這也意味著您無法在GC敲門前清除數據。 如果有機會有人可以訪問您的內存,則可以使用帶有密碼的字符串來供他使用。
這就是為什么您應該使用char數組的原因。 完成處理后,您將可以明確擦除數據,也可以用其他任何方式覆蓋數據。 即使在GC運行之前,敏感數據也不會出現在系統中的任何位置。
3.例外
即使許多開發人員更喜歡忽略檢查的異常 ,但仍有許多關于Java中異常的問題。 這是您應該在代碼中解決的主要問題,而忽略該問題并不能解決它。
最受質疑的問題之一是“什么是NullPointerException,以及如何解決它?”。 我們對這種異常的流行程度并不感到驚訝,因為它在生產Java應用程序中也被列為第一大異常類型 。
在Takipi,我們實際上可以選擇在系統上引入新的NullPointerException(或任何其他異常)時設置警報。 檢查一下 。
4.怪癖和魔術
時不時地,您在Stackoverflow中遇到一個令人困惑的問題,它會教給您一些新知識。 我們選擇了一些我們最喜歡的寶石:
問題提出了以下打印聲明,打印出“ 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(); }System.out.println(randomString(-229985452) + " " + randomString(-147909649));答案是沒有湯匙。 這意味著選擇隨機的整數集將不是隨機的。 相反,該實例將遵循以特定種子參數(在這種情況下為-229985452或-147909649)開頭的隨機數生成算法。 每次您要求一個隨機模式時,相同的種子將生成相同的模式-這將打印出您好世界。
用戶Eng.Fouad完美地解釋了這一點:
在新的Random(-229985452).nextInt(27)中,隨機產生的前6個數字是:
8、5、12、12、15、0
新的Random(-147909649).nextInt(27)生成的前6個數字是:
23、15、18、12、4、0
當您將這些數字添加到字符`(即96)的整數表示中時,您將獲得“ hello world”:
104 –>小時
101 –> e 108 –> l 108 –> l 111 –> o
119 –> w
111 –> o
114 –> r 108 –> l 100 –>天
在下面的問題中,用戶解析兩個日期字符串,它們相隔一秒引用時間,并進行比較。
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); }由于它們相距1秒,因此沒有得到1的結果,而是得到了結果353(排隊怪異的音樂)。 這有一個非常基本的解釋:這是時區問題。 1927年12月31日,上海時間倒退了5分52秒,Java將其解析為該本地日期/時間的瞬間。
我們確實必須指出,如果您嘗試從原始問題中運行代碼,它將產生不同的結果。 正如喬恩·斯基特(Jon Skeet) 在回答中指出的那樣 ,在2014年時區數據庫項目中,更改時間已移至1900-12-31,現在僅343秒更改。
這是一個顯而易見的問題:如果引發了異常但沒有人可以捕獲它,應用程序會崩潰嗎? 或如問題所問:“是否有可能在Java中構建一小段代碼,使假定的java.lang.ChuckNorrisException無法捕獲?”。
簡短的答案是有可能的,但其中涉及“但是”。 您可以編譯引發ChuckNorrisException的代碼,并定義一個在運行時不會擴展Throwable的類ChuckNorrisException。 僅憑這一點還不足以使其正常工作,并且您必須禁用字節碼驗證程序。 jtahlborn給出的答案將帶您完成整個過程。
如果您是Java難題的粉絲,則可能需要查看我們的Java Deathmatch游戲。
5.哈希圖
我們在Stackoverflow上遇到的最常見問題之一與哈希映射有關。 許多用戶想知道集合之間的區別以及何時應該在另一個之上使用集合。
這里的關鍵要素是迭代順序。 使用HashMap,您將沒有有關訂單的信息,并且當您向集合中添加更多元素時,該訂單可能會更改。 使用TreeMap,您將獲得排序的迭代,而使用LinkedHashMap,您將獲得FIFO順序。
如果您對此仍然感到困惑,我們的Rebel Labs朋友會幫您制作一張方便的圖表 ,說明一個收藏相對于另一個收藏的好處。
最后的想法
對Java的了解并不重要,您可以學到更多。 Stackoverflow可以幫助解決代碼中的特定問題,但它也是了解有關我們認為我們從頭到尾知道的事情的新信息的絕佳來源。
如果您遇到一個有趣的問題,激烈的辯論或其他怪癖,我們很樂意在下面的評論中聽到。
翻譯自: https://www.javacodegeeks.com/2016/07/stackoverflow-7-best-java-answers-havent-seen.html
stackoverflow
總結
以上是生活随笔為你收集整理的stackoverflow_Stackoverflow:您尚未发现的7个最佳Java答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄金收储备案流程(黄金收储备案)
- 下一篇: Linux安装界面中不包含()(linu