提高String和StringBuffer性能的技巧

技巧|性能

String和StringBuffer之概览
  创建字符串的较佳途径
  滞留字符串带来的优化
  连接字符串时的优化技巧
  借助StringBuffer的初始化过程的优化技巧
  关键点 String和StringBuffer之概览
  非可变对象一旦创建之后就不能再被改变,可变对象则可以在创建之后被改变。String对象是非可变对象,StringBuffer对象则是可变对象。为获得更佳的性能你需要根据实际情况小心谨慎地选择到底使用这两者中的某一个。下面的话题会作详细的阐述。(注意:这个章节假设读者已经具备Java的String和StringBuffer的相关基础知识。) 创建字符串的较佳途径你可以按照以下方式创建字符串对象:
1. String s1 = "hello"; 
    String s2 = "hello"; 
2. String s3 = new String("hello");
    String s4 = new String("hello"); 上面哪种方式会带来更好的性能呢?下面的代码片断用来测量二者之间的区别。
StringTest1.javapackage com.performance.string;/** This class shows the time taken for creation of
 *  String literals and String objects.
 */public class StringTest1 {public static void main(String[] args){    // create String literals
    long startTime = System.currentTimeMillis();
    for(int i=0;i<50000;i++){    String s1 = "hello";
    String s2 = "hello";
    }    long endTime = System.currentTimeMillis();
    System.out.println("Time taken for creation of String literals : "
                  + (endTime - startTime) + " milli seconds" );    // create String objects using 'new' keyword       
    long startTime1 = System.currentTimeMillis();
    for(int i=0;i<50000;i++){    String s3 = new String("hello");
    String s4 = new String("hello");
    }    long endTime1 = System.currentTimeMillis();
    System.out.println("Time taken for creation of String objects : "
                  + (endTime1 - startTime1)+" milli seconds");
    }
}
这段代码的输出:
Time taken for creation of String literals : 0 milli seconds
Time taken for creation of String objects : 170 milli seconds JVM是怎样处理字符串的呢?
  Java虚拟机会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。  所以结论是,JVM会内在地为字符串字面量维护一些唯一的String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过new关键字创建的String对象而困扰,不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。下一小节会向大家展示更多的信息。 下图展示了未使用intern()方法来创建字符串的情况。
    你可以自己使用==操作符和String.equals()方法来编码测试上面提到的区别。==操作符会返回true如果一些引用指向一个相同的对象但不会判断String对象的内容是否相同;String.equals()方法会返回true如果被操作的String对象的内容相同。对于上面的代码会有s1==s2,因为s1和s2两个引用指向同一个对象,对于上面的代码,s3.equals(s4)会返回true因为两个对象的内容都一样为”hello”。你可以从上图看出这种机制。在这里有三个独立的包含了相同的内容(”hello”)的对象,实际上我们不需要这么三个独立的对象――因为要运行它们的话既浪费时间又浪费内存。   那么怎样才能确保String对象不会重复呢?下一个话题会涵盖对于内建String机制的兴趣。 
[1] [2] [3] 下一页  

时间: 2024-10-27 03:13:04

提高String和StringBuffer性能的技巧的相关文章

提高 DHTML 页面性能_javascript技巧

摘要:本文说明了某些 DHTML 功能对性能的重大影响,并提供了一些提高 DHTML 页面性能的技巧. 目录 简介 成批处理 DHTML 更改 使用 innerText 使用 DOM 添加单个元素 扩展 SELECT 元素中的选项 用 DOM 更新表 编写一次,使用多次 请勿过多使用动态属性 数据绑定很有效 不要在 document 对象中设置 expando 属性 避免切换类和样式规则 查找父项之前,先折叠文本范围 其他资料 简介 动态 HTML (DHTML) 在 Microsoft Int

stringbuffer-介于String和StringBuffer的性能问题

问题描述 介于String和StringBuffer的性能问题 都说String是final,那么在第二次赋值的时候,实际上是新开辟了内存空间,新建了String对象赋值,在多次赋值的情况下,这样是很浪费性能 StringBuffer在开辟了一次内存之后,多次append都不会新建对象,所以不浪费什么的 我早上无意间看了下源码,StringBuffer在初始化的时候,默认16位长度的字节数组,OK,底层用的数组实现,那必然涉及到自动扩展,果然,字符数超出长度则自动复制内容,原长度 * 2 + 2

详细分析Java中String、StringBuffer、StringBuilder类的性能_java

我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义查看API会发现,String.StringBuffer.StringBuilder都实现了 CharSequence接口,虽然它们都与字符串相关,但是其处理机制不同. String:是不可改变的量,也就是创建后就不能在修改了. StringBuffer:是一个可变字符串序列,它与String一样,在内存中保存的都是一个有序的字符串序

在DB2中提高INSERT性能的技巧(1)_DB2

正在看的db2教程是:在DB2中提高INSERT性能的技巧(1).INSERT 处理过程概述 首先让我们快速地看看插入一行时的处理步骤.这些步骤中的每一步都有优化的潜力,对此我们在后面会一一讨论. 在客户机准备 语句.对于动态 SQL,在语句执行前就要做这一步,此处的性能是很重要的:对于静态 SQL,这一步的性能实际上关系不大,因为语句的准备是事先完成的. 在客户机,将要插入的行的各个 列值组装起来,发送到 DB2 服务器. DB2 服务器确定将这一行插入到哪一页中. DB2 在 用于该页的缓冲

js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)_javascript技巧

问题缘由:负责公司的开发平台研发工作,考虑的知识产权的保护工作,必须要考虑java的加密技术和js脚本的加密技术.在目前java加密很容易破解的情况下,还是先搞定js的加密和压缩,一方面可以提高页面加载性能,另外一方面也希望辛苦研发出来的成果得到一定的保护. 研究过程: 1.先强烈鄙视一下哪些随便转载文章的家伙,给我制造了很大的麻烦!!网上很多帖子都不靠谱.. 2.首先想了解jquery使用什么压缩的, 网上找了半天,说法不一样,后来还是在jquery官网的最频繁问题中找到了答案,但这已经是绕了

快”在细节 J2EE程序的性能优化技巧

j2ee|程序|技巧|性能|优化 应用J2EE平台开发的系统的性能是系统使用者和开发者都关注的问题,本文从服务器端编程时应注意的几个方面讨论代码对性能的影响,并总结一些解决的建议. 关键词:性能,Java,J2EE,EJB,Servlet,JDBC 一.概要 Java 2 Platform, Enterprise Edition (J2EE)是当前很多商业应用系统使用的开发平台,该技术提供了一个基于组件的方法来设计.开发.装配和部署企业级应用程序.J2EE平台提供了一个多层结构的分布式的应用程序

Java性能优化技巧汇总_java

本文实例汇总了Java性能优化技巧.分享给大家供大家参考.具体分析如下: 这里参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量使用final修饰符. 带有final修饰符的类是不可派生的.在JAVA核心API中,有许多应用final的例子,例如java.lang.String.为String类指定final防止了使用者覆盖length()方法.另外,如

心得总结:Java性能优化技巧集锦

技巧|心得|性能|优化 一.通用篇 "通用篇"讨论的问题适合于大多数Java应用. 1.1 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法.clone()方法不会调用任何类构造函数. 在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单.例如,下面是Factory模式的一

Java性能优化技巧集锦

技巧|性能|优化 =================================== 摘要: =================================== 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代码的效率. =================================== 提纲: ===================