String类
String在JVM内存中的存储
使用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的比较,==是运算符,比较的是引用变量本身,而不是引用变量指向的对象;
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/1483860
StringBuffere类与StringBuilder类
- append()
- deleteCharAt()
- insert()
- reverse()
- length()
线程安全:
先说一下集合的故事,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;
}
}