Java字符串优化


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参数,避免扩容时的数组复制操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值