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

来源:互联网 发布:佳能相机镜头 知乎 编辑:程序博客网 时间:2024/06/05 17:51
<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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 翠研珠宝被坑了怎么办 领导是小人我该怎么办 微信二维码重置了怎么办 衣服有蝽的卵怎么办 人坐牢去了房贷怎么办 人死了欠的房贷怎么办 体育生文化没过怎么办 舍友偷了钱没证据怎么办 舍友要一直开空调怎么办 和大学室友相处不愉快怎么办 和舍友三观不合怎么办 室友欠200钱忘了怎么办 和舍友闹矛盾了怎么办 被宿舍人孤立了怎么办 分到一个爱管事的舍友怎么办 添加了村人名录怎么办 打csgo出现卡顿怎么办 csgo创意工坊下载慢怎么办 电脑全是英文死机了怎么办 亿盛国际出金后不到账怎么办 玩游戏的界面很大怎么办电脑 文件缺失导致电脑无法启动怎么办 眼睛里拉出白丝怎么办 脚扭了脚面肿了怎么办 伪音唱歌嗓子疼怎么办 小孩吊水手肿了怎么办 棉质地的裙子起褶子怎么办 孕妇吃了马苋菜怎么办 三非黑人抓住了怎么办 33岁了写字好丑怎么办 裤子熨焦了发亮怎么办 黑裤子熨亮了怎么办 。P手机没有钤声怎么办 处处被小人其欠负怎么办??? 衣服开了一个口怎么办 脸上长痘痘留下的坑怎么办 脸部被打得皮肤怎么办 打脸引起耳朵疼怎么办 被打了耳痛耳鸣怎么办 苹果6视频锁屏怎么办 抠耳朵抠疼了怎么办