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

来源:互联网 发布:佳能相机镜头 知乎 编辑:程序博客网 时间:2024/05/16 18:29
<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);//trueSystem.out.println(str1==str3);//falseSystem.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数组的长度会进行扩容,(扩容测试时将原有的容量大小翻倍),如果能够预先评估大小可有效减少此步骤的操作,提高系统性能。



0 0