Java——重要但容易忽略的知識
本文將一點一滴的累計記錄Java中的一些細節知識。不只是加以說明,而是所有的細節都找到來源,以官方文件、知名社群的介紹為主。
StringTokenizer和String.split
//Use StringTokenizer StringTokenizer st = new StringTokenizer("this is a test"); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); }
//Use split String[] results = "this is a test".split("\\s"); for (String result:results){ System.out.println(result); }
關於StringTokenizer和String.split的差異說法很多。官方文件http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html 有定性說明(附註:最新的JDK8 API文件中也是相同的說明)。
StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
大意是StringTokenizer是一個歷史遺留類,為了保證向後相容性而保留這個類。推薦在新的程式碼中使用split或regex替換。
至於網上的測評資料說StringTokenizer比String.split效率更高,由於沒有親測就不妄加評論了。作為專案管理者,從風險和可靠性的角度考慮,在專案規範和程式碼review的過程中,還是以官方文件為準。
transient和volatile關鍵詞的使用
transient volatile Set<K> keySet = null;
transient volatile Collection<V> values = null;
transient是變數修飾符,表明該欄位不是物件持久狀態的一部分,儲存的時候不用儲存,比如序列化這個物件時,該欄位是不會儲存的。
volatile也是變數修飾符,只能用來修飾變數。volatile修飾的成員變數在每次被執行緒訪問時,都強迫從共享記憶體中重讀該成員變數的值。 而且,當成員變數發生變化時,強迫執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同一個值。