JAVA字符串的优化

Java 程序优化:字符串操作、基本运算方法等优化策略

看了这篇文档,略有所感,所以本篇算是一个读后感。和上篇JAVA一种提升输出速度的方法 进一步。

主要涉及了7种优化方式。

1.subString(begin,end):

subString是截取String中一段的方法,我在这个上面还吃过苦头的,之前做过一个大数据量的subString一直OOM,没找到解决办法,今天看到文中提到如果使用

return new String(string.substring(begin,end))
代替
return string.substring(begin,end)

会因为生成了新的string对象使得由substring()返回的内存泄露的string对象失去强引用而被回收保证了稳定,But,我敲了几个测试样例都没得到证明,母鸡whty,仍需验证。

2.使用StringBuilder|StringBuffer进行string连接

参见我之前写的blog,使用StringBuilder确实比string1+string2的方式快,可以写test验证,同时提到了使用stringbuffer在多线程下比stringBuilder更安全。

3.局部变量的比类变量的计算速度快

这个嘛,一般局部变量和类全局变量的设置首先考虑的不是速度,所以这个知道就好。

4.位运算速度快于乘除法

RT,没什么可说的

5.if-else优于switch

还是要看结构的设计

6.提取表达式

摘一段样例程序:

public class duplicatedCode {
 public static void beforeTuning(){
 long start = System.currentTimeMillis();
 double a1 = Math.random();
 double a2 = Math.random();
 double a3 = Math.random();
 double a4 = Math.random();
 double b1,b2;
 for(int i=0;i<10000000;i++){
 b1 = a1*a2*a4/3*4*a3*a4;
 b2 = a1*a2*a3/3*4*a3*a4;
 }
 System.out.println(System.currentTimeMillis() - start);
 }

 public static void afterTuning(){
 long start = System.currentTimeMillis();
 double a1 = Math.random();
 double a2 = Math.random();
 double a3 = Math.random();
 double a4 = Math.random();
 double combine,b1,b2;
 for(int i=0;i<10000000;i++){
 combine = a1*a2/3*4*a3*a4;
 b1 = combine*a4;
 b2 = combine*a3;
 }
 System.out.println(System.currentTimeMillis() - start);
 }

 public static void main(String[] args){
 duplicatedCode.beforeTuning();
 duplicatedCode.afterTuning();
 }
}

提取出来以后运行时间少了一半,主要还是因为少了重复计算。

7.减少循环次数

for(int i=0;i<999999;i++) {
        array[i]=i;
}
for(int i=0;i<999999;i+=3) {
    array[i]=i;
    array[i+1]=i+1;
    array[i+2]=i+2;
}

哪个更快?猜出来就明白了。

8.system.arrayCopy()

它快因为是native的,很多函数非native速度不一定比你one by one的赋值快哦~

substring()这个仍不解,谁明白,烦请指教,跪谢

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 01:05:16

JAVA字符串的优化的相关文章

关于java字符串编译优化问题

情景一:不好的字符串拼接习惯    起因是这样的:一个大牛在写了一篇关于java字符串优化问题的讲解,他提到:不要使用strObj+otherValue的方法将otherValue转换为字符串形式,因为底层操作会让你吓一跳的.那么底层的实质是怎么样的呢?他的意思是这样的: 比如:    String s = "I have"; int  total = 12; Dog dog = new Dog();     //假设Dog类重写了toString方法 String msg = s +

35 个 Java 代码性能优化总结

代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 代码优化细节 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的.为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写.如果指定了一个类为final,则该类所有的方法都是final的.Java编译器会寻找机会内联所有的final方法,内联对于提升Java

java常用重构优化总结--自己亲身体验

代码重构  6大原则:    单一职责原则(一个类最好最好只有一种行为动机,太多承担职责会导致耦合度太高).    开放封闭原则(功能可以扩展,但是不可以内部修改).    依赖倒转原则(应该依赖抽象而不应该依赖具体对象).    里氏代换原则(父类都替换成它的子类程序的行为没有变化. 正是有了里氏代换原则,才使得"开-闭"原则成为了可能).    接口隔离原则(为同一个角色提供宽.窄不同的接口,以对付不同的客户端).    迪米特法则(最少知道原则;如果两个类不必彼此直接通信,那么这

[JAVA] java程序性能优化

一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util.vector; class cel { void method (vector vector) { for (int i = 0; i < vector.size (); i++) // violation ; // ... } } 更正: class cel_fixed { void metho

Java 字符串操作实例

本文章向大家分享一些java中操作字符串的一些实例,需要的可以参考一下. Java字符串比较 Java查找字符串最后一次出现的位置 Java删除字符串中的一个字符 Java字符串替换 Java字符串反转 Java字符串查找 Java字符串分割 Java字符串小写转大写 Java测试两个字符串区域是否相等 Java字符串性能比较测试 Java字符串优化 Java字符串格式化 Java字符串连接

Java 代码性能优化总结

35 个 Java 代码性能优化总结 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率

Java程序性能优化:代码优化

现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比较短的同学挺有意义的. 一 循环条件下,循环体和判断条件中,都要避免对使用复杂表达式,减少对变量的重复计算 1.在循环中应该避免使用复杂的表达式. 在循环中,循环条件会被反复计算,应该避免把一些计算放在循环进行的部分中,程序将会运行的更快.比如: for(int i=0;i<list.size();

004 Java字符串的几个特性

在本系列教材的上一篇(003 Java字符串)中,对Java语言中String类的一些基本情况和整体架构进行了讲解和分析,相信大家已经很好地掌握了.本篇教程主要是补充一些String类的重要特性,帮助大家避免掉使用String过程中的一些陷阱. 首先,补充一个在JDK中使用非常频繁的概念:不可变类.所谓的不可变类是指该类的对象在生成以后就不会被改变了,关于不可变类的优点.缺点,特别是在Java并发编程时的优势,此处暂时略过不讲.那么如何定义一个不可变类呢?如果你有仔细观察String类的源码,你

JAVA服务器端性能优化----String

String的连接 方法1 使用+= String s = new String(); for (int i = 0; i < 10000; i++){ s+= "a"; } 方法2 使用带缓冲区的StringBuffer StringBuffer s = new StringBuffer(); for (int i = 0; i < 10000; i++){ s.append("a") } 方法1执行时间大概在2000ms左右,方法2却只要10ms左右