每天学点java性能优化之字符串处理优化

<pre code_snippet_id="1604271" snippet_file_name="blog_20160310_1_3195965" name="code" class="java">
 

在java语言中,java的设计者对String对象进行了大量的优化,其主要表现在以下3个方面,“不变性”“针对常量池优化”“类的final定义”。

1.不变性是指String对象一旦生成,则不能再对其进行改变。主要作用在于当一个对象需要被多线程程序共享,并且访问频繁时,可以省略同步和锁的等待时间,从而大幅度提高系统性能。不变模式是一个可以提高多线程程序的性能,降低多线程程序复杂度的设计模式。后面文章会有介绍。

2.针对想城池的优化。当两个String对象用友相同的值时,它们只引用常量池中的同一个拷贝。当同一个字符串反复出现时,这个技术可以大幅度节省内存空间。

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1==str2);//true
System.out.println(str1==str3);//false
System.out.println(str1==str3.intern());//true 该方法中的intern方法,返回程序在常量池中的引用
 

3.String对象为final类,不可能有任何子类,这对系统安全性考虑。其次是出于提高虚拟机效率方面考虑,但在jdk1.5以后效率提高并不明显,不做考虑。  

下面介绍我们在java编程中字符串常用的优化处理

1.subString()方法的内存泄漏 。我们经常使用subString()方法来截取字符串,但这种是以偏移量来截取字符串的方法,利用空间来换取时间效率,但是当字符串是一个大字符串,而我们截取的字符串很小的时候,会造成内存大量浪费。(具体原因可以参考源码来理解我说的)所以在用该方法截取字符串的时候,可以利用 new String (str.subString(begin,end))方法重新构造一个字符串,这样之前的字符串的强引用消失,gc会进行回收,避免内存浪费。

2.字符串分割和查找

2.1 String.split()方法使用简单,功能强大,但在性能敏感的系统中频繁使用这个方法不大可取。

2.2 使用效率更高的StringTokenizer类分割字符串

StringTokenizer st = new StringTokenizer(orgStr, ";");
while(st.hasMoreElements()) {
System.out.println(st.nextToken());
     }

2.3更优化的字符串分割方法

String tmp = orgStr;
while(true){
	String splitStr = null;
	int j = tmp.indexOf(';');
	if(j<0)break;
	splitStr = tmp.substring(0,j);
	tmp=tmp.substring(j+1);
}
tmp = orgStr;
 

    2.4 charAt()方法和indexOf()效率一样高,它返回指定位置的字符。应用:例如在判断字符串以什么开头和以什么结尾的时候,利用charAt()方法效率要高于startWith()和endWith()方法,大家可以借鉴使用。
    2.5 在构造长字符串累加操作的时候利用StringBuffer和StringBuilder代替String的拼接,避免浪费多于内存空间。
例如:String result = "String"+"and"+"String"+"append";首先由"String"和"and" 两个字符串生成"Stringand"对象,然后生成"StringandString"最后生成“StringandStringappend”对象。所以从理论上,这个代码效率不高。但是这里有一点,代码编译的时候这里进行了优化,此段代码编译结果是String result = "StringandStringappend";java编译时对静态字符串进行了连接操作,所以实际执行效率很高。但这里不建议利用编译器的优化,建议用StringBuffer和StringBuilder进行字符串拼接操作,这两个对象在构建的时候有容量参数这一影响性能的参数不容忽视,在补指定容量参数的时候,默认是16个字符。在追加字符串的时候,如果超过实际char数组的长度会进行扩容,(扩容测试时将原有的容量大小翻倍),如果能够预先评估大小可有效减少此步骤的操作,提高系统性能。



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值