控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

Java字符串处理效率分析

作者:未知 出处:cnblog 2012年12月11日 阅读:

 字符串操作是编写程序中最常见的行为,本文对String、StringBuilder、StringBuffer三个类在字符串处理方面的效率进行分析。

 
     Java中最常见也是应用最广泛的类就是String类。
 
     String:Strings are constant; their values cannot be changed after they are created.
 
     这是JDK对String的解释,意思是:String是常量,一旦创建后它的值不能被修改。
 
     先看String对象是如何创建的:
 
     String str1 = “abc”;
 
     String str2 = new String(“abc”);
 
     这是我们常见的两种形式。
 
     第一种方式创建的字符串会放在栈里,更确切的是常量池中,常量池就是用来保存在编译阶段确定好了大小的数据,一般我们定义的int等基本数据类型就保存在这里。其具体的一个流程就是,编译器首先检查常量池,看看有没有一个“abc”,如果没有则创建。如果有的话,则则直接把str1指向那个位置。
 
     第二种创建字符串的方法是通过new关键字,还是java的内存分配,java会将new的对象放在堆中,这一部分对象是在运行时创建的对象。所以我们每一次new的时候,都会创建不同的对象,即便是堆中已经有了一个一模一样的。
 
     下面的程序将验证上面的说法。
String str1 = "abc";
 String str2 = new String("abc");
 
 String str3 = "abc";
 String str4 = new String("abc");
 
 System.out.println(str1==str2);//false
         
 System.out.println(str1 == str3);//true
 System.out.println(str2 == str4);//false
 // When the intern method is invoked, if the pool already contains a
 // string equal to this String object as determined by the
 // equals(Object) method, then the string from the pool is returned.
 // Otherwise, this String object is added to the pool and a reference to
 // this String object is returned.
 str2 = str2.intern();
 System.out.println(str1==str2);//true
 
 false
 true
 false
 true
 
以上程序中用两种方式创建的4个对象,”==”比较的是地址,从结果可以看到str1和str3相同,指向同一个对象。而str2和str4比较返回结果是false,说明str2和str4指向的不是同一个对象。
 
     (上面用到了一个比较少见的方法:intern。在str2调用了intern方法后对str1和str2进行比较返回true,可以从代码注释中看明白,intern方法返回常量池中内容和该对象相同的对象,如果常量池中不存在,则将该对象加入到常量池中。)
 
package test;
 
 public class StringTest {
     public static void main(String[] args) {
         String str1 = "abc";
         str1 += "123";
     }
 }
从编译之后的class可以看出编译器自动引入了StringBuilder类,通过它的初始化方法创建了StringBuilder对象,通过append方法添加了内容,调用toString返回连接后的对象。以上内容证明了String对象是不可变的,连接操作实际是返回了新的对象。如果是循环多次进行连接,将不断的创建StringBuilder对象,append新内容,toString成String对象。这就带来了String类处理字符串更改操作的效率问题。
     String对象是不变的,那为什么可以进行str+=”abc”这样的操作?其实类似这样的操作是新生成了一个String对象,包含str和abc连接后的字符串。
 
public class StringTest {
     public static void main(String[] args) {
         long start, end;
 
         StringBuilder strBuilder = new StringBuilder(" ");
         start = System.currentTimeMillis();
         for (int i = 0; i < 100000; i++) {
             strBuilder.append(" ");
         }
         end = System.currentTimeMillis();
         System.out.println("StringBuilder append: " + (end - start) + "ms");
 
         String str = " ";
         start = System.currentTimeMillis();
         for (int i = 0; i < 100000; i++) {
             str += " ";
         }
         end = System.currentTimeMillis();
         System.out.println("String +: " + (end - start) + "ms");
     }
 }
可以看到String和StringBuilder在效率方便的差距。
 
     StringBuffer:A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified.
 
     StringBuilder:A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization.
 
     StringBuffer是可变的、线程安全的字符串。StringBuilder就是StringBuffer的非线程同步的版本,二者的方法差不多,只是一个线程安全(适用于多线程)一个没有线程安全(适用于单线程)。
 
 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统