首頁  >  文章  >  Java  >  關於 Java 的10個謊言

關於 Java 的10個謊言

黄舟
黄舟原創
2017-01-18 15:21:381342瀏覽

Java程式設計語言

java 是一種可以撰寫跨平台應用軟體的物件導向的程式設計語言,是由Sun Microsystems公司於1995年5月推出的Java程式設計語言和Java平台(即JavaEE(j2ee) , JavaME(j2me), JavaSE(j2se))的總稱。


下面的這些都算是比較高級的問題了,面試中一般也很少問到,因為它們可能會把麵試者拒之門外。不過你可以自己找個時間實踐一下。

1. System.exit(0)會跳過finally區塊的執行

System.setSecurityManager(new SecurityManager() {
        @Override
        public void checkExit(int status) {
            throw new ThreadDeath();
        }
    });
    try {
        System.exit(0);
    } finally {
        System.out.println("In the finally block");
    }

這段程式碼為什麼會輸出In the finally block?為什麼沒有列印出堆疊追蹤資訊呢?

2. String str = “Hello”;其中str是一個字串物件 跟C++不同的是,Java裡的變數要不是基礎類型,就是引用。變數不可能是物件。這意味著像這樣的表達式:

String str = "Hello";
    String text = "Bye";
    str == text; // 比较两个引用,而不是内容
    str = text; // 把text的引用赋值给str

大多數情況下其實沒有太大的區別,不過這麼寫容易引起困惑。

final StringBuilder sb = new StringBuidler();
    sb.append("Hello"); // 这个引用是final类型的,而不是这个实例。
    method(sb); // 可以通过方法来修改这个实例,不过这个变量是无法修改的

3. Java的記憶體外洩跟C++程式設計師理解的一樣

記憶體外洩在維基百科上的定義是」在電腦科學中,如果程式沒有正確地管理好記憶體分配,就會出現記憶體外洩。在在物件導向程式設計中,如果記憶體中的一個物件無法在程式碼中存取不到的話,這就是記憶體外洩。記憶體外洩這個術語在Java中意味著:記憶體中存在著不該存在的對象,通常來說是有些不再使用的資源卻仍儲存在集合中。

4. 多執行緒程式設計很難

如果你沒有經驗的話,多執行緒程式設計的確很難。如果你只是把一堆程式碼丟到一堆線程中去執行,那樣出了問題根本沒辦法解決,只能是一團糟。 但如果你能進行線程的按需分配,控制線程間的交互,使用一些團隊中的成員也能明白的簡單的模式,問題就變得簡單多了。當然還有一個挑戰就是你得讓團隊中的所有人都遵循你的這個規則:-)

5. 不用關心不同操作間性能的不同

最近聽說有個問題,它涉及到了整數的相加,記憶體訪問,取模,以及輸出到控制台。儘管在這些操作裡面,每一個都比前面一個要慢一個數量級,但這哥們就是想優化這裡面最快的操作,加法,還用了些更昂貴的操作來替換它。 如果你真的想要優化效能,你最好用一個廉價的操作來替換掉那些昂貴的操作,如果你的瓶頸在硬體這塊,比方說要從硬碟裡面讀取大量的文件,修改軟體的程式碼是沒啥用了,因為問題根本不在這。

6. 隨機數都是隨機的

一組特定的隨機數就像是某種模式的數字。這個問題我在這篇文章中已經講到過了。很多人都不相信隨機數產生器產生的數字其實是不隨機的。

7. 應該盡量避免使用浮點數,因為它們會產生隨機錯誤

對於同一個操作而言,浮點數每次都會產生相同的錯誤。錯誤是可預測的,因此也是可控制的。如果你清楚你要做的事情是什麼,並且堅持使用一些簡單的規則,比如說對結果進行舍入操作,那麼浮點數出的錯也不會比BigDecimal要多,除此之外它的可讀性更強,而且效率快了百倍以上(同時產生的垃圾對像也更少了)。

8. 時區是永恆不變的

之所以會有這個誤解是因為,隨著時間的變化,時區是在改變的。這意味著歐洲/倫敦在新紀元的時候是1970/1/1 01:00而不是00:00,為什麼?因為倫敦在1968年到1971年這兩年間的時間內使用的是夏令時間。

在過去的這些年裡面,還有不少時區也發生了變化。莫斯科以前是東三區(GMT+3),現在是東四區(GMT+4)(從2011年3月27日開始)。如果你看下2010年的時間,你會發現它是東三區而不是東四區。

還有些事你聽起來或許會覺得很意外:

1721年的瑞典的2月有30天。

1751年英格蘭的第一天是3月25日,和法國相比差了11天。

美國採用公曆紀年後,它往前追溯了上百年,這樣原先記錄的那些日期都可以用兩種日曆來進行表示(通常為了更精確會同時提供兩個日期)。例如喬治華盛頓的生日從1731年2月11變成了1732年2月22年。

9. 當你在執行緒中讀取一個非volatile變數時,你最終能讀取它更新的那個值。

前幾天這個問題在StackOverflow上出現過兩回了。一般來說,JIT編譯器優化程式碼的時候會將這個執行緒沒有修改到的非volatile類型的欄位進行內聯。一旦這個程式碼被編譯了(你可以透過-XX:+PrintCompilation看到),你在另一個執行緒對這個欄位進行的修改它很可能就永遠看不到了。加上隨機的同步區塊或列印語句可以延後這個最佳化的執行,或是擾亂JIT編譯器,讓它不去執行這個最佳化。

10. Java面試題都是正確的

有很多Java面試題要么是過時了(超過10年沒有更新了,和現在的Java版本已經脫節),要么是誤導大家的,甚至可能是錯的。不幸的是這些答案都沒有檢查過就被到處傳來傳去。

我會參考Stackoverflow上面的答案,因為這裡的答案同行審查做的更好些。總的來說,像rose india這樣的網站就不要上了,上面的答案的品質差的離譜。如果你喜歡刨根究底的話,可以看看上面一篇文章裡有多少拼字錯誤(類別名稱以及專業術語)或錯誤的言論。存在這些問題的一個原因在於沒有一個有效的回饋機制來修正這些錯誤。

以上就是關於 Java 的10個謊言的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn