StackOverflow:7個你從未見過的Java問題最佳答案

2021-02-20 51CTO技術棧

對開發人員來說, 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秒的一個變化。

有一些問題是關於:有沒有一種異常是可以被拋出的,但是沒人可以捕獲它, 應用會崩潰麼?或者這樣的問題也可以變成「有沒有代碼可以讓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 上面最流行的 7 個 Java 問題!
    它能夠幫助我們找到在各個領域遇到的問題的最有用的解決方案,同時我們也會從中學習到很多新的東西。這篇文章是在我們審閱了StackOverflow上最流行的Java問題以及答案後從中挑出來的。即使你是一個有豐富經驗的開發者,也能從中學到不少東西。
  • StackOverflow 上面最流行的 7 個 Java 問題!| 值得一看
    它能夠幫助我們找到在各個領域遇到的問題的最有用的解決方案,同時我們也會從中學習到很多新的東西。這篇文章是在我們審閱了StackOverflow上最流行的Java問題以及答案後從中挑出來的。即使你是一個有豐富經驗的開發者,也能從中學到不少東西。
  • Stackoverflow問答:Java是傳值還是傳引用?
    來自:並發編程網 - ifeve.com原文:http://stackoverflow.com
  • StackOverflow Java API 問題 Top10
    在 Stack Overflow 中已經有數以百萬計的問題,並且很多答案有著很高的質量。這就是為什麼 Stack Overflow 的答案經常位於 Google 搜索結果的頂部。儘管 Stack Overflow 上很多問題已經有了答案,每天還是會有很多問題被提出,很多問題仍然沒有被回答或者沒有獲得滿意的答案。那麼當 Stack Overflow 不能解決問題時如何去尋找答案。
  • Stack Overflow: 我們如何賺錢
    我們不在乎,原因在這兒:https://stackoverflow.blog/2016/02/why-stack-overflow-doesnt-care-about-ad-blockers/ 。Stack Overflow 的廣告現在是怎麼樣的呢?簡而言之,我們不會增加廣告的數量,而是去改善現有廣告的質量。
  • 用StackOverflow訪問數據實現主成分分析(PCA)
    rstudio :: conf 2018https://www.rstudio.com/resources/videos/understanding-pca-using-shiny-and-stack-overflow-data/高維數據此次分析使用的是去年
  • Java學習必不可少的十大網站
    這是我為學習java的同學們準備的網站集合。這些網站提供新聞,常見問題或訪談問題的答案,精彩的講座等。質量是好的網站的關鍵因素。我認為它們都具有最高的質量。在下文中,我還將分享如何使用這些網站進行學習或娛樂。1.
  • java集合容器之Stack
    從名字看他就是一個stack,因此具有數據結構中棧的一般特性(後進先出),平時用起來相對較多一點,但是也是非常簡單。這篇文章我們將從源碼的角度來分析一下Stack。OK,開始今天的文章。一、認識StackStack繼承自Vector。底層是通過數組實現的。
  • 程式設計師學Java要關注的6個網站,你知道幾個呢?
    學習Java開發除了使用Github、google、stackoverflow這三大程式設計師利器之外,還需要哪些網站呢?下面w3cschool給程式設計師小夥伴們分享java學習的6個網站:0、SourgeForgeSourgeForge是開源軟體開發者進行開發管理的集中式網站。有相當豐富的Java開放原始碼的著名的軟體。
  • 最常見的10種Java異常問題!
    2.異常管理的最佳實踐箴言如果可以正確處理異常,則應將其捕獲並處理,否則應將其拋出。3. 為什麼在try代碼塊中聲明的變量不能在catch或者finally中被引用?它倆拋出的異常確實不同,但這是JDK的問題,當時開發這兩個接口的開發人員不是同一波,所以我們沒必要去糾結這個問題。
  • String是java的基礎變量嗎?
    什麼意思看不起我?咦,有點模糊?終於:」chifanzuilihai.lang.stackoverflow...「(「這個平時沒有接觸過」)好吧,其實沒有什麼變化,又隨意的問了下一個問題面試結束後,我決定把這個問題,並建索引!String是java的基礎變量嗎?不是的。什麼?!確實不是的,8個基礎變量裡只有char,沒有String。為什麼?!問高司令,他規定的。那String是什麼?!!
  • 如何優雅地列印一個Java對象?
    真沒想到,這個問題的訪問量像阿爾泰山一樣高,訪問量足足有 29+ 萬次,這不得了啊!說明有很多很多的程式設計師被這個問題困擾過。來回顧一下提問者的問題吧。然後創建了一個該類的對象,並嘗試列印它:Cmower cmower = new Cmower("張三");System.out.println(cmower);但是輸出的結果並不是他想要的:com.cmower.java_demo.stackoverflow.printObject.Cmower
  • Java Thread 那些事
    如果你不恰當的使用了ReentrantLock或者ReentrantReadWriteLock類,就有可能陷入BLOCKED狀態,這個也是我們調優中經常會遇到的情況,解決方案也很簡單,找到等待上鎖的地址,分析是否發生了Thread starvation。至於TIME_WAITING狀態,官方文檔也講解的比較好,即你在調用下面方法時,線程會進入該狀態。
  • Stack Overflow 調查顯示:Rust 是最受歡迎的程式語言
    Shell 排在第 6, Python 出現在第 7,系統程式語言 C ++ 進了前 10 名。但是調查顯示,這些都不是開發人員想要使用的程式語言。使用最廣泛的前十名中只有三種語言在最受歡迎的列表中:分別是 Python,JavaScript 和 C#。最受歡迎語言排名第一的是Mozilla 開發的系統程式語言 Rust。
  • Java Top 100熱門問答(Stackoverflow)
    Creating a memory leak with Java [closed] 用戶AutumnLight正在翻譯該問題Why is printing 「B」 dramatically slower than printing 「#」?
  • Stack Overflow 發布 2016 開發者調查報告:JavaScript 最受歡迎...
    但 PHP 的受歡迎程度則比去年下跌了 4 個百分點,Stack Overflow 分析認為是由於 Node 和 Angular 的崛起。蘋果 Mac OS X 首次超過 Windows 登頂,而第三名 Linux 與 Windows 7 的的差距也不大。當然,如果把所有的 Windows 版本都算上的話,微軟還能保持份額第一的位置。
  • StackOverflow 發布 2016 年開發者調查報告
    在南非,牛肉很便宜(其他消費品也是如此),而且每年開發者每年的工資能買到超過25,000個巨無霸。在美國和烏克蘭有5年經驗的開發人員吃得也很好。中國開發者的購買能力似乎也不錯。工資與幸福感的關係via:stackoverflow.com作為一個開發者你有什麼想說的?畢竟有些調查比較顛覆我們的想法~
  • 阿里螞蟻金服Java程式設計師面試的11個問題,你會幾個呢?
    比如阿里巴巴java面經、小米java面經、網易java面經等,吸引了大多數的程式設計師們的圍觀。最後,來看下阿里螞蟻金服Java程式設計師面試的11個問題:0、自我介紹1、介紹一下你做過的項目2、項目中遇到的最大挑戰是什麼?