String,StringBuffer,StringBuilder,char[] & volatile對雙重檢查鎖定的影響

昨天和師兄討論,單例的最好實現到底是什麼

果然一家之言有時候還是不可盡信:

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都要翻牆,我大天朝這是怎麼了快哭了

爲什麼 char[] 比String更適合儲存密碼

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編碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章