String在JVM內存中的存儲java
使用String str1 = "abc";方式建立的字符串存放在常量池中;數組
使用String str2 = new String("abc");方式建立的字符串存放在堆中;此方式更佔內存;安全
String類的hashCode()方法,equals()方法多線程
hashcode()方法是Object類中的方法,默認返回JVM中的32位內存地址;String重寫了hashCode()方法併發
public int hashCode() { int h = hash; //Default to 0 ### String類中的私有變量, if (h == 0 && value.length > 0) { //private final char value[]; ### Sting類中保存的字符串內容的的數組 char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
String的比較,==是運算符,比較的是引用變量自己,而不是引用變量指向的對象;app
equals()方法是Object中的方法,默認使用==比較;String類重寫了equals()方法;工具
//一個字符串常量的引用使用equals()方法是自動裝箱 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value;//value屬性獲取字符數組 int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
String類是不可變類,任何對String的改變都 會引起新的String對象的生成,動態的構建String數據應該用StringBuffere類。性能
String類爲何要設計成不可變:https://my.oschina.net/kailuncen/blog/1483860ui
線程安全:this
先說一下集合的故事,HashTable是線程安全的,不少方法都是synchronized方法,而HashMap不是線程安全的,但其在單線程程序中的性能比HashTable要高。StringBuffer和StringBuilder類的區別也是如此,他們的原理和操做基本相同,區別在於StringBufferd支持併發操做,線性安全的,適 合多線程中使用。StringBuilder不支持併發操做,線性不安全的,不適合多線程中使用。新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。
經常使用字符串工具類
/* 對象轉換爲字符串,對象爲null時轉化爲空字符串*/ public static String convertNullToEmpty(Object obj) { return obj == null ? "" : String.valueOf(obj); } /* 對象轉換爲字符串,避免"null"的出現*/ public static String objectToString(Object obj) { return obj == null ? null : obj + ""; } /* 判斷字符串 是否 爲數字*/ public static boolean isNumeric(String str) { Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(str); if (!isNum.matches()) { return false; } return true; } public static boolean isEmpty(String str) { if (null == str || "null".equals(str) || "".equals(str)) return true; else { return false; } }