1. String对象
      String对象是java中重要的数据类型,在大部分情况下我们都会用到String对象。其实在Java语言中,其设计者也对String做了大量的优化工作,这些也是String对象的特点,它们就是:不变性,常量池优化和String类的final定义。

    1.1 不变性
      String对象的状态在其被创建之后就不在发生变化。为什么说这点也是Java设计者所做的优化,在java模式中,有一种模式叫不变模式,了解的童鞋也应该知道不变模式的作用:在一个对象被多线程共享,而且被频繁的访问时,可以省略同步和锁的时间,从而提高性能。而String的不变性,可泛化为不变模式。

    1.2 常量池优化

      常量池优化指的是什么呢?那就是当两个String对象拥有同一个值的时候,他们都只是引用了常量池中的同一个拷贝。所以当程序中某个字符串频繁出现时,这个优化技术就可以节省大幅度的内存空间了。例如:

     String s1  = "123";
    String s2 = "123";
    String s3 = new String("123");
    System.out.println(s1==s2); //true
    System.out.println(s1==s3); //false
    System.out.println(s1==s3.intern()); //true

      以上代码中,s1和s2引用的是相同的地址,故而第四行打印出的结果是true;而s3虽然只与s1,s2相等,但是s3时通过new String("123")创建的,重新开辟了内存空间,因引用的地址不同,所以第5行打印出false;intern方法返回的是String对象在常亮池中的引用,所以最后一行打印出true。

    1.3 final的定义
      String类以final进行了修饰,在系统中就不可能有String的子类,这一点也是出于对系统安全性的考虑。

  2. 字符串操作中的常见优化方法
    2.1 split()方法优化
      通常情况下,split()方法带给我们很大的方便,但是其性能不是很好。建议结合使用indexOf()和subString()方法进行自定义拆分,这样性能会有显著的提高。    

    2.2 String常量的累加操作优化方法
      示例代码:

     String s = "";
    long sBeginTime = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
    s+="s";
    }
    long sEndTime = System.currentTimeMillis();
    System.out.println("s拼接100000遍s耗时: " + (sEndTime - sBeginTime) + "ms"); StringBuffer s1 = new StringBuffer();
    long s1BeginTime = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
    s1.append("s");
    }
    long s1EndTime = System.currentTimeMillis();
    System.out.println("s1拼接100000遍s耗时: " + (s1EndTime - s1BeginTime) + "ms"); StringBuilder s2 = new StringBuilder();
    long s2BeginTime = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
    s2.append("s");
    }
    long s2EndTime = System.currentTimeMillis();
    System.out.println("s2拼接100000遍s耗时: " + (s2EndTime - s2BeginTime) + "ms");

      结果:

      

      上例所示,使用+号拼接字符串,其效率明显较低,而使用StringBuffer和StringBuilder的append()方法进行拼接,效率是使用+号拼接方式的百倍甚至千倍,而StringBuffer的效率比StringBuilder低些,这是由于StringBuffer实现了线程安全,效率较低也是不可避免的。所以在字符串的累加操作中,建议结合线程问题选择,应避免使用+号拼接字符串。

    2.3 StringBuffer和StringBuilder的选择
      上例中也使用过StringBuffer和StringBuilder了,两者只有线程安全方面的差别,所以呢,在无需考虑线程安全的情况下,建议使用性能相对较高的StringBuilder类,若系统要求线程安全,就选择StringBuffer类。

    2.4 基本数据类型转化为String类型的优化方案
      示例代码:
      

     Integer num  = 0;
    int loop = 100000; // 将结果放大100000倍,以便于观察结果
    long beginTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
    String s = num+"";
    }
    long endTime = System.currentTimeMillis();
    System.out.println("+\"\"的方式耗时: " + (endTime - beginTime) + "ms"); beginTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
    String s = String.valueOf(num);
    }
    endTime = System.currentTimeMillis();
    System.out.println("String.valueOf()的方式耗时: " + (endTime - beginTime) + "ms"); beginTime = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
    String s = num.toString();
    }
    endTime = System.currentTimeMillis();
    System.out.println("toString()的方式耗时: " + (endTime - beginTime) + "ms");

      以上示例中,String.valueOf()直接调用了底层的Integer.toString()方法,不过其中会先判空;+""由StringBuilder实现,先调用了append()方法,然后调用了toString()方法获取字符串;num.toString()直接调用了Integer.toString()方法,所以效率是:num.toString()方法最快,其次是String.valueOf(num),最后是num+""的方式。以下是结果截图:
      

      建议童鞋们避免使用+""的方式转换,最好是使用基本数据类型自带的toString()方法转换。就先分享到这儿吧!!!

java性能优化--字符串优化处理的更多相关文章

  1. Java 性能优化之 String 篇

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/ Java 性能优化之 String 篇 String 方法用于文本分析 ...

  2. 有哪些Java性能优化方法?

    面试官:"有性能优化经验没?"  应聘者:"有一点."   面试官:"那你们从哪些方面做了优化?"   应聘者:"sql优化.JV ...

  3. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  4. Java 性能优化手册 — 提高 Java 代码性能的各种技巧

    转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...

  5. 10种简单的Java性能优化

    你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧. 最近“全网域(Web Scale)”一词被炒得火热,人 ...

  6. 【转】10种简单的Java性能优化

    10种简单的Java性能优化 2015/06/23 | 分类: 基础技术 | 14 条评论 | 标签: 性能优化 分享到: 本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加 ...

  7. 44个Java性能优化

    44个Java性能优化 首先,代码优化的目标是: 减小代码的体积 提高代码运行效率 代码优化细节 1 .尽量指定类.方法的final修饰符 ​ 带有final修饰符的类是不可派生的.在Java核心AP ...

  8. Java 性能优化的55个细节(珍藏版)

    在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ...

  9. Java性能优化的50个细节,我必须分享给你!

    来源:blog.csdn.net/dongnan591172113/article/details/51790428 ;i<list.size();i++) ,len=list.size();i ...

随机推荐

  1. 创建一个简单的Django项目

    1.首先,启动pycharm,点击File->New Project,如下图所示. 2.在New Project对话框中,选择Django,在Location中设置项目路径以及项目名称,在App ...

  2. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  3. 【python】UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

    header中干掉 "Accept-Encoding": "gzip, deflate, br", 注意:

  4. 【hibernate-validator+SpringMVC】后台参数校验框架

    hibernate-validator+SpringMVC 简介:简单说,就是对Entity进行校验. 1.导包,没有很严谨的对应关系,所以我用了比较新的版本,支持更多的注解. <depende ...

  5. java中方法的重载和覆盖

    java中方法的重载和覆盖 先来了解一下这两个名词的含义. 重载: 在一个类当中才可以重载,方法名相同,参数个数不同或参数个数相同而参数类型不同. 覆盖: 又称重写,在派生类(子类)中重写基类(父类) ...

  6. resolv.conf 的超时(timeout)与重试(attempts)机制

    /etc/resolv.conf 有两个默认的值至关重要,一个是超时的 timeout,一个是重试的 attempts,默认情况下,前者是 5s 后者是 2 次.这个估计很多工程师都不是很在意,一般情 ...

  7. 高性能微服务网关.NETCore客户端Kong.Net开源发布

    前言 项目地址:https://github.com/lianggx/Kong.Net 你的支持使我们更加强大,请单击 star 让更多的 .NETCore 认识它. 拥抱开源的脚步,我们从来都是一直 ...

  8. 半小时学会V语言

    半小时学会V语言 1. V语言简介 V是一个静态类型.编译型的编程语言,目标是构建可维护软件.与Go语言相似,并受Oberon,Rust和Swift语言影响.V语言非常简单,只需要半小时就能学会这门语 ...

  9. 记一次SQL优化。

    程序是数据库的用户,为打造良好的用户体验,我们一直在努力. 此次介绍一个基于SQL的数据库优化.SQL的优劣对数据库的性能影响非常关键. 查询只涉及如下表结构中的三个字段.如下 开发原始SQL SEL ...

  10. 20152016-acmicpc-neerc-northern-subregional-contest J:Journey to the "The World's Start"(单调队列+DP+二分)

    http://codeforces.com/gym/100801/attachments 题意:给出n-1张不同的票,票价分别为 pi,每张票每次最多可以坐 r 个站(1<=r<n),并且 ...