關於java.lang.String理解中的一些難點


最近溫習java的一些基礎知識,發現以往對String對象認識上的一些不足。特匯總如下,主要是幫助記憶,如能對其他朋友有些啟發,不勝欣喜。

 

String在JVM中內存駐留問題 JVM的常量區(Constant Pool)中維持了大部分創建的string (Interned Strings)。舉例, Sring a="ABC";String b="ABC"; 當JVM為a賦值時會在常量區生成一個String Constant,當b也賦值為“ABC”時,那么會在常量池中查看是否存在值為“ABC”的常量,存在的話,則把b的指針也指向“ABC”的地址,而不是新生成一個String Constant。 JDK1.6中Interned Strings存儲在Permanent Space的常量池中; JDK1.7中Interned Strings已經不再存儲在Permanent Space中,而是放到了Heap中; JDK8中PermanentSpace已經被完全移除,InternedStrings也被放到了MetaSpace中。     String.substring()方法 返回新的String對象,JAVA6返回的新對象與原有對象底層共享存儲空間char[]數組,通過偏移和長度構造了一個"新"的String,導致substring對象被引用時,原對象即使沒有被引用也不能被銷毀;JAVA7之后返回的新對象會新建底層的存儲空間     +與concat()的區別 1.  concat是String方法,String重載了“+”操作符(提醒下:Java不支持其他操作符的重載) 2. concat方法在參數為空時返回原字符串,不為空時返回新的String對象;而+在兩個操作數都是常量時可能返回內存中已有的Interned String引用,操作數存在變量時必定新建String對象     對於敏感信息,為何使用char[]要比String更好? String是不可變的。這意味着一旦創建了字符串,如果另一個進程可以進行內存轉儲,在GC發生前,(除了反射)沒有方法可以清除字符串數據。 使用數組操作完之后,可以顯式地清除數據:可以給數組賦任何值,密碼也不會存在系統中,甚至垃圾回收之前也是如此。 所以,是的,這是一個安全問題 – 但是即使使用了char數組,僅僅縮小了了攻擊者有機會獲得密碼的窗口,它值針對制定的攻擊類型。     如何通過空白字符拆分字符串
String 的 split()方法接收的字符串會被當做正則表達式解析,
"\s"代表空白字符,如空格" ",tab制表符"\t", 換行"\n",回車"\r".
而編譯器在對源代碼解析時,也會進行一次字面量轉碼,所以需要"\\s".
  String[] strArray = aString.split("\\s+");     String vs StringBuilder vs StringBuffer StringBuilder 是可變的,因此可以在創建以后修改內部的值 StringBuffer 是同步的,因此是線程安全的,但效率相對更低

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com