StackOverflow 上面最流行的 7 個 Java 問題!

2021-03-02 Java技術棧

StackOverflow發展到目前,已經成為了全球開發者的金礦。它能夠幫助我們找到在各個領域遇到的問題的最有用的解決方案,同時我們也會從中學習到很多新的東西。

這篇文章是在我們審閱了StackOverflow上最流行的Java問題以及答案後從中挑出來的。即使你是一個有豐富經驗的開發者,也能從中學到不少東西。

一、分支預測

問題連結:

https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array

StackOverflow上最多投票的一個Java問題是:為什麼處理一個排序數組要比非排序數組快的多

為了回答這個問題,你需要使用分支預測(branch prediction)。分支預測是一種架構,旨在通過在真實的路徑發生前猜測某一分支的下一步來提升處理過程。

分支在這裡即一個if語句。這樣的話,如果是一個排序數組,那麼分支預測將會進行,否則不會進行。

StackOverflow上的一個回答者,連結:

http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array/11227902#11227902

試圖使用鐵路和火車來簡單介紹這個概念。假設你在鐵軌連接處要決定火車要走哪條路,你會選擇左邊還是右邊?

你可以攔住火車,然後問司機該往哪裡,但是這樣會讓整個過程變慢。因此你只能去猜正確的方向,那麼如何去猜呢?最好的辦法就是通過觀察目前這個火車每次經過時的路線,推測出正確的方向。

這就是分支預測:識別模式並使用它。

不幸的是,這個問題的提問者是分支預測失敗的受害者。因為他的分支沒有任何可以識別出的模式,所以預測出的行為是隨機的。

二、Java中的安全

問題連結:

http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java

另一個流行的Java問題是:為什麼在Java中有關密碼的地方更加喜歡使用char[]而不是String?其實原始的問題更加具體一些,就是問的在Swing中,password控制項有一個getPassword方法(返回char[]而不是getText()返回的String)。

其實這裡不用驚訝-這是一個安全問題。String是不可變的,意味著一旦它被創建了,那麼你就不可能去修改它。

這也意味著在GC之前,你對這些數據不能做任何處理。因此,只要有人能夠訪問你的內存,那麼String就有可能被他獲取到。

這也就是為什麼要使用char數組。你可以顯示地清除數據或者覆蓋它。這樣密碼這種敏感數據即使GC還沒有進行也不會再在系統留下痕跡。另外,關注微信公眾號:Java技術棧,在後臺回覆:Java,可以獲取我整理的 N 篇 Java 教程,都是乾貨。

三、異常

問題連結:

http://blog.takipi.com/the-top-10-exceptions-types-in-production-java-applications-based-on-1b-events/

即使很多開發者傾向於忽略對受檢異常的處理,StackOverflow上仍然有很多關於異常的問題。

其中一個最流行的問題是:什麼是NullPointerException,我該怎麼處理它?對此,我們並沒有感到驚訝,因為這個問題也是在生產環境的Java應用中排名第一的異常。

實際上,當NullPointerException(或者其他exception)在系統出現的時候,我們可以發出一個告警。因為這種異常一般情況下都是業務代碼邏輯有問題造成(筆者注)。

四、為什麼這段代碼使用隨機字符串列印出了」hello world」

問題連結:

http://stackoverflow.com/questions/15182496/why-does-this-code-using-random-strings-print-hello-world

這個問題給出了下面的代碼,並列印出了」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();  
}  

其實,選擇一組隨機的整數並不是隨機的。給定一個seed參數(在這個例子中是-229985452和-147909649), 那麼每次隨機,同樣的seed則會產生同樣的輸出。

Random(-229985452).nextInt(27)產生的前六個數字:8, 5, 12, 12, 15, 0

Random(-147909649).nextInt(27)產生的前六個數字:23, 15, 18, 12, 4, 0

這樣,最終輸出的就是」hello world」。

五、為什麼兩個時間戳相減(in 1927)得出一個奇怪的結果?

問題連結:

http://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result

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,但實際的輸出卻是353。其實,這是一個時區的問題。

1927年12月31號24:00,上海時間往回調整了5分鐘52秒,因此」1927-12-31 23:54:08」發生了兩次,Java將後面一次實例化成了本地的這個時間。因此和前一秒的差距成了353。

我們需要指出,如果你試著來運行這段代碼,結果並不一定是353。Jon Skeet指出了這一點,連結:

http://stackoverflow.com/a/6841479/5982245

在時區資料庫項目2014版中,這個改變的時間點改到了1900-12-31,因此成了344秒的差距。另外,關注微信公眾號:Java技術棧,在後臺回覆:Java,可以獲取我整理的 N 篇 Java 教程,都是乾貨。

六、無法被捕獲的ChuckNorrisException

問題連結:

http://stackoverflow.com/questions/13883166/uncatchable-chucknorrisexception

這裡有一個很明顯的問題:如果有exception被拋出,但是沒有任何辦法去catch,那麼應用會崩潰嗎?或者如這個問題所問:是否可以寫一段Java代碼讓一個假設的java.lang.ChuckNorrisException無法被捕獲。

答案是可以,但是這裡有一個」但是」。你可以編譯一段代碼拋出一個ChuckNorrisException,但是在Runtime時動態生成一個並不繼承於Throwable接口的ChuckNorrisException類。當然,為了讓這個過程可以進行,你需要關閉掉字節碼驗證。jtahlborn給出了完整的解決辦法。連結:

http://stackoverflow.com/a/13883510/5982245

七、哈希表

哈希表是另外一個在StackOverflow上流行的問題系列。許多用戶都想要知道所有集合類之間的區別,什麼時候該使用哪種集合。

迭代順序是主要考慮的因素。使用HashMap則忽略了所有的順序信息,也就是獲取元素的順序和你插入元素的順序是沒有任何關係的;使用TreeMap則會得到一個排序好的迭代集合;使用LinkedHashMap則是一個FIFO的順序。

如果你還是對這些感到困惑,這裡有一個相關說明的圖表可以參考(Rebel Labs製作。連結:

http://zeroturnaround.com/wp-content/uploads/2016/04/Java-Collections-cheat-sheet.png

八、總結

對於Java,其實關鍵的不在於你懂多少,而是在於你可以一直學到更多的東西。

StackOverflow不僅在code上的一些問題可以幫助我們,也有助於我們回過頭來去深入地學習一些我們已經知道的知識。

相關焦點

  • StackOverflow 上面最流行的 7 個 Java 問題!| 值得一看
    它能夠幫助我們找到在各個領域遇到的問題的最有用的解決方案,同時我們也會從中學習到很多新的東西。這篇文章是在我們審閱了StackOverflow上最流行的Java問題以及答案後從中挑出來的。即使你是一個有豐富經驗的開發者,也能從中學到不少東西。
  • StackOverflow:7個你從未見過的Java問題最佳答案
    對具體的問題,它能幫我們找到最有用的答案,並且我們也可以從上面學習新的知識。下面的內容,通過這些最常見的JAVA問題與答案,並著重的標記出我們找到的精華問題。即便你是一個經驗豐富的開發人員,這些也是值得去學習的。JAVA問題縱覽JAVA是StackOverflow上 第二流行的標籤 ,有超過100萬個問題與JAVA有關。
  • Stackoverflow問答:Java是傳值還是傳引用?
    來自:並發編程網 - ifeve.com原文:http://stackoverflow.com
  • StackOverflow Java API 問題 Top10
    在這篇文章中,將探討使用開原始碼(jExample)是否能夠回答排序前列的 API 相關問題。API 相關問題指的是如何使用 APIs 解決任務的問題。我們對 Stack Overflow 排在前面的問題進行了分析。對於每一個問題,最佳答案顯示在最前面,然後是從 Java API examples (jExample) 中給出的解決方法。
  • Stack Overflow: 我們如何賺錢
    如果你對上面提到的都不感興趣,當然也沒關係。除了幫助你找到最匹配的公司,我們還有 「Jobs」和「Developer Story」這兩個產品去支持我們的核心使命:幫助所有的開發者,包括那些暫時還不想找工作的。
  • 用StackOverflow訪問數據實現主成分分析(PCA)
    rstudio :: conf 2018https://www.rstudio.com/resources/videos/understanding-pca-using-shiny-and-stack-overflow-data/高維數據此次分析使用的是去年
  • Java學習必不可少的十大網站
    這是我為學習java的同學們準備的網站集合。這些網站提供新聞,常見問題或訪談問題的答案,精彩的講座等。質量是好的網站的關鍵因素。我認為它們都具有最高的質量。在下文中,我還將分享如何使用這些網站進行學習或娛樂。1.
  • Stack Overflow 調查顯示:Rust 是最受歡迎的程式語言
    JavaScript 仍然是專業開發人員中使用最廣泛的程式語言,這使得這六年間成為 Web 開發語言的巔峰,其他 Web 技術包括 HTML(排名第 2),CSS(第3)和PHP(第9)。面向業務的語言也被廣泛使用,其中排名第 4 是 SQL,第 5 是 Java,第 8 是 C#。Shell 排在第 6, Python 出現在第 7,系統程式語言 C ++ 進了前 10 名。
  • java集合容器之Stack
    從名字看他就是一個stack,因此具有數據結構中棧的一般特性(後進先出),平時用起來相對較多一點,但是也是非常簡單。這篇文章我們將從源碼的角度來分析一下Stack。OK,開始今天的文章。一、認識StackStack繼承自Vector。底層是通過數組實現的。
  • 程式設計師學Java要關注的6個網站,你知道幾個呢?
    Java現在仍然是非常流行的程式語言。學習Java開發除了使用Github、google、stackoverflow這三大程式設計師利器之外,還需要哪些網站呢?下面w3cschool給程式設計師小夥伴們分享java學習的6個網站:0、SourgeForgeSourgeForge是開源軟體開發者進行開發管理的集中式網站。有相當豐富的Java開放原始碼的著名的軟體。
  • Stack Overflow 發布 2016 開發者調查報告:JavaScript 最受歡迎...
    但 PHP 的受歡迎程度則比去年下跌了 4 個百分點,Stack Overflow 分析認為是由於 Node 和 Angular 的崛起。Stack Overflow 還調查了最流行的技術組合。蘋果 Mac OS X 首次超過 Windows 登頂,而第三名 Linux 與 Windows 7 的的差距也不大。當然,如果把所有的 Windows 版本都算上的話,微軟還能保持份額第一的位置。
  • StackOverflow 發布 2016 年開發者調查報告
    JavaScript是最流行的程式語言。程式設計師,工程師還是開發人員但實際上女性開發者的比例比上面的數值更大。我們知道,這項調查沒有足夠代表那些開發者更可能成為女性的國家,如亞洲國家,如韓國,印度和中國。最喜歡,最害怕和最感興趣最喜歡
  • Java Thread 那些事
    OK,在簡單介紹完幾個重點的線程狀態後,我們通過幾個具體的case來了解下Thread stack:Case 1:NIO 中的Acceptor "qtp589745448-36 Acceptor0 SelectChannelConnector@0.0.0.0:8161" prio=10 tid=0x00007f02f8eea800
  • String是java的基礎變量嗎?
    什麼意思看不起我?咦,有點模糊?終於:」chifanzuilihai.lang.stackoverflow...「(「這個平時沒有接觸過」)好吧,其實沒有什麼變化,又隨意的問了下一個問題面試結束後,我決定把這個問題,並建索引!String是java的基礎變量嗎?不是的。什麼?!確實不是的,8個基礎變量裡只有char,沒有String。為什麼?!問高司令,他規定的。那String是什麼?!!
  • 最紅語言Python跌落榜三,Rust最受喜愛!Stack Overflow 2020報告出爐
    ,最討厭的語言、最想要使用的語言、什麼崗位最賺錢(全球)、薪水與語言和年齡學歷分布情況。在最近五年裡,最紅語言Python從榜二落到了榜三(感覺榜二和榜三差別不大)。Rust作為大家最愛的語言榜首,這個結果不算意外,之前2016-2019年它都是榜一,這個語言的語法以及性能和C++有點類似,主要是為了解決高並發和高安全性問題的。TypeScript這個語言是微軟在2012年開源的,最後是可以編譯成JavaScript語言的。
  • Java Top 100熱門問答(Stackoverflow)
    Creating a memory leak with Java [closed] 用戶AutumnLight正在翻譯該問題Why is printing 「B」 dramatically slower than printing 「#」?
  • 阿里螞蟻金服Java程式設計師面試的11個問題,你會幾個呢?
    比如阿里巴巴java面經、小米java面經、網易java面經等,吸引了大多數的程式設計師們的圍觀。有些人就栽在這些基礎的東西上面,可能就這樣失去一個月薪過完的機會。1、常考的Java知識點複習:對於Java常考的知識點,用博客進行總結,以後要跳槽的時候也可以用到。可謂是一次總結就能實現多次利用的效果。
  • 最常見的10種Java異常問題!
    前言本文總結了有關Java異常的十大常見問題。目錄檢查型異常(checked) vs. 非檢查型異常(Unchecked)為什麼在try代碼塊中聲明的變量不能在catch或者finally中被引用?為什麼 Double.parseDouble(null) 和 Integer.parseInt(null) 拋出的異常不一樣呢?