昨天和師兄討論,單例的最好實現到底是什麼
果然一家之言有時候還是不可盡信:
volatile對雙重檢查鎖定的影響和 IoDH 對單例來說都是個不錯的實現,此外還有枚舉。師兄提到IoDH的內部類可能會導致加載失敗,萬分之一的機率會使單例加載失敗。一個單例都這麼多東西搞。
關於併發中Java鎖的分析。
寫了冉教授的爬蟲項目,現在看來做這個沒什麼用的項目真實浪費時間浪費精力,嗨,罷了,爭取這兩天搞掂。
就在剛剛,簡陋地完成了項目的任務,突然想複習一下以前看過的百田的筆試題目:
1. String ,StringBuffer StringBuilder之間的差別
以下在博文中寫的都是並非三者間的完整差別,只是我此前並不知道也不瞭解的差別:
String:除了是immutable也是線程安全,但是String 的 substring 方法有發生內存leak(泄露)的可能,中文博文,英文博文,解決方法是 new String(str.substring(begin,end));在原substring中新建一個string。
StringBuffer 與 String:個人理解的最大卻別是 immutable與mutable,對String使用“+”每次都會返回一個新的String,而StringBuffer和StringBuilder則在原來的基礎上更改,而StringBuffer是較舊的,StringBuilder是java5以後纔出現的,同時StringBuffer是thread-safe,StringB
byte[] d = a.getBytes();
System.out.println(Arrays.toString(d));
uilder不是,所以應該適當選用,如果是做算法題目的話當然是StringBuilder。StringBuffer和StringBuilder的api是非常相似的。
另外,上個Javarevisited都要翻牆,我大天朝這是怎麼了
1. String是immutable的,在內存堆或者常量池中會存在很長一段時間,gc纔會回收它,所以不安全,任何對String set的操作都沒用,因爲它會返回一個new string,但是就是隻能被動等待gc回收,但是char[] 的話可以自己set爲0000000,由程序員把握。
2. Java推薦使用JPasswordField的getPassword() 返回 char[] ,java team 都這麼推薦了。
3. 如果你一不小心答應了string,那是答應了整個string,密碼明文顯示,但是如果答應 char[] 答應的是內存地址,除非使用 Arrays.toString(charArrayName),就這角度上說安全性都比String要好。
下面是將String轉爲char[]
String a = "hello,world";
char[] b = a.toCharArray();
System.out.println(Arrays.toString(b));
另外String的api有必要記憶一下:
Modifier and Type | Method and Description |
char | charAt(int index) |
int | codePointAt(int index) returns the character unicode code point |
int | codePointBefore(int index) |
int | codePointCount(int beginIndex, int endIndex) what? |
int | compareTo(String anotherString) lexicographically 字典順序排序 |
int | compareToIgnoreCase(String str) |
String | concat(String str) |
boolean | contains(CharSequence s) |
boolean | contentEquals(CharSequence cs) |
boolean | contentEquals(StringBuffer sb) 不明白,StringBuffer實現了CharSequence接口上面那個不就夠了嗎 |
static String | copyValueOf(char[] data) returns a String that represents the charracter sequence in the array specified |
static String | copyValueOf(char[] data ,int offset, int count) |
boolean | endsWith(String suffix) |
boolean | equals(Object anObject) |
boolean | equalsIgnoreCase(String anotherString) |
static String | format(Locale l ,String format, Object... args) what? |
static String | format(String format, Object... args) what? |
byte[] | getBytes() |
byte[] | getBytes(Charset charset) |
測試代碼:
byte[] d = a.getBytes();
System.out.println(Arrays.toString(d));
結果:
輸出unicode編碼。