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