1. String对象的特点。
Java中String类的实现,主要由3个部分组成:char数组、偏移量和String的长度。
String对象的构造函数:
String(int offset ,int count , char value[]){
this.value = value;
this.offset = offset;
this.count = count;
}
String对象的3个特点:
不变形:对象一旦生成,就无法改变;
针对常量池的优化:当两个String对象拥有相同的值,他们会引用常量池的统一拷贝,大幅度节省内存空间;
类的final定义:不能拥有任何子类。
2. subString()方法的内存泄漏。
查看源代码:
public String substring(intbeginIndex , int endIndex){
return((beginIndex == 0) && (endIndex == count)) ? this : new String(offset +beginIndex , endIndex – beginIndex , value);
}
这种通过偏移量来截取字符串的方法中,String的原生内容value[]也被复制到子串中。
设想,假如原始的字符串很大,截取的字符串长度却很短,那么截取的字符串中包含了原生字符串的所有内容,并占据了相应的内存空间。这种算法提高了运算速度却浪费了大量的空间。
如果取子串操作出现在循环中,为避免内存泄漏,在写程序时应该写new String(str.subString(begin,end)),而不是str.subString(begin,end);
与subString()类似的使用String(int offset , int count , char value[])构造方法的方法还有:toString(int/long),concat(String),replace(char,char),toLowerCase(Locale),toUpperCase(Locale)和valueOf(char),可能造成一样的内存泄漏。
3. 字符串分割和查找。
(1)最原始的字符串分割: public String[]split(String regex)
对于正则表达式的支持,是的split()函数具有强大的功能,但是,简单的字符串分割性能却很差。
(2)效率更高的StringTokenizer类分割字符串:
构造函数:publicStringTokenizer(String str , String delim)
示例代码:
String orgStr="1;23;45;67;345;2345";
StringTokenizer st = new StringTokenizer(orgStr , “;”);
for(int i=0;i<10000;i++) {
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
st=new StringToken(orgStr , “;”);
}
(3)更为优化的方式:使用indexOf()和subString()函数
String orgStr="1;23;45;67;345;2345";
String tmp=orgStr;
for (int i = 0; i < 1; i++) {
while(true){
String splitStr=null;
int j=tmp.indexOf(";");
if(j<0){
splitStr=tmp;
System.out.println(splitStr);
break;
}
splitStr=tmp.substring(0 , j);
System.out.println(splitStr);
tmp=tmp.substring(j+1);
}
tmp=orgStr;
}
3种方法最后一种效率最高,但是可读性也最差。
4. 使用效率更高的charAt()方法代替startsWith()和endsWith()方法:
比如:
orgStr.startsWith(“abc”);
if(orgStr.charAt(0)==’a’&& orgStr.charAt(1)==’b’ && orgStr.charAt(2)==’c’);
5. 使用StringBuilder和StringBuffer而避免使用String常量的累加。
使用的时候应该设置合理的capacity参数,避免扩容时的数组复制操作。