相信大家都知道,对于字符串的处理是很多编程语言经常要做的事情,对于java来说,它自带了丰富的字符串类,例如String,StringBuilder, StringBuffer;但是对于初学者来说有时候很困惑它们之间的区别,我通过查阅相关的资料,进行了一些总结,因此也就有了这篇博客的来源了。首先先来分别介绍一下它们,然后在解释它们之间的区别。
一.String
String类也就是字符串类型,它虽然不属于Java的基本数据类型,但是我们在使用的时候却可以当作基本数据类型一样使用,例如直接用String str = "hello java".来进行声明初始化,但是String类对象一旦创建就不可更改(可能有人会觉得我可以修改啊,别急,我下面会有说明),它作为类对象,也自然有自己的构造方法,主要有以下构造方法:
- String()可以产生一个空字符序列。
- String(char a[])可以使用一个字符数组创建String对象
- String(char a[],int offset,int length)提取字符数组a的一部分创建一个String对象,参数offset表示开始截取字符串的位置,length表示截取的长度。
二.StringBuilder
StringBuilder被称为字符串生成器,也是Java的一个类对象,新创建的StringBuilder对象初始容量为16个字符,我们也可以自定义初始长度,它的优点就是可以动态地添加,删除和插入字符串操作,在需要频繁修改字符串的情况下具有很高的效率。StringBuilder可以根据需要自动增长长度以适应需求。
可以通过StringBuilder str = new StringBuilder(“hello java");创建StringBuilder对象。
它的出现提供一个与StringBuffer类兼容的API,可以看作是一个阉割版的StringBuffer类,在单线程的情况下,执行效率优于StringBuffer类,由于StringBuilder不保证同步,因此它属于非安全线程的类,在多线程的情况下,我们应该使用StringBuffer.
三.StringBuffer
StringBuffer跟StringBuilder类都继承AbstractStringBuilder 父类,前面也说过,后者是前者的阉割版,但是StringBuffer属于线程安全的类,它们用法很多都相似,这里就不啰嗦了。
总结一下该如何选择使用它们,首先对于String类,它不可修改,在你操作使用例如:
String str = "hello";
str = str+"java";
实际上str+"java"会重新生成一个String对象,而不是返回原有str对象的引用,因此我们可以想象如果在需要频繁修改字符串的情况下,它将产生大量的String对象,这样就会占用大量系统资源开销,变得很慢。
对于StringBuilder来说,它有以下操作:
StringBuilder str = new StringBuilder("hello");
str.append("java");
也实现的字符串连接,但是它返回的是原有str对象的引用,比起String来说,可以减少系统资源使用。我们可能在写程序的时候感受的不是非常明显,我下面写个例子可以看出它们之间的巨大差别:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
//String
long startTime = System.nanoTime();
String str = "hello";
for(int i=0;i<100000;i++){
str = str+" java";
}
long endTime = System.nanoTime();
long needTime = endTime - startTime;
System.out.println("String需要时间:"+needTime);
//StringBuilder
startTime = System.nanoTime();
StringBuilder str2 = new StringBuilder("hello");
for(int j=0;j<100000;j++){
str2.append(" java");
}
endTime = System.nanoTime();
needTime = endTime - startTime;
System.out.println("StringBuilder需要时间:"+needTime);
}
}
执行结果:
String需要时间:20140751578
StringBuilder需要时间:5644226
可以看出它们之间的区别简直是天壤之别,我们在写程序的时候应该注意到这些。我们在大多数情况下应该使用StringBuilder来进行字符串处理。如果没有频繁的修改,那么StringBuilder的优势并不明显,欢迎大家探讨。
分享到:
相关推荐
java压缩字符串
JAVA的字符串拼接与性能 概述:本文主要研究的是JAVA的字符串拼接的性能,原文中的测试代码在功能上并不等价,导致concat的测试意义不大。不过原作者在评论栏给了新的concat结果,如果有兴趣的同学建议自己修改代码...
java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...
Java分割字符串
java 分解字符串 java 分解字符串 java 分解字符串
java 创建字符串类 java 创建字符串类 java 创建字符串类
java判断字符串是否是json或json数组; 简单小方法,很实用;简单实用的方法;亲测可用;嗯嗯嗯呃呃呃呃呃呃呃
java 分割字符串 java 分割字符串
Java获取随机字符串Java获取随机字符串Java获取随机字符串
java字符串处理取出括号内的字符串 都是我自己试过可以用的j
0是KMP方法中的next function 1是检索该字符串是否存在所需字符串,2是检索出现几次
JAVA日期与字符串的转换 1) 将一个Date类型的变量转换为字符串 2) 将一个字符串转换Date类型的变量
java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字...
JAVA连接字符串到配置文件
主要介绍了Java中字符串去重的特性,是Java8中引入的一个新特性,至于是否真的用起来顺手就见仁见智了...需要的朋友可以参考下
java中求字符串表达式的值看起来很伤脑筋,但如果你用BeanShell,一切都变得很简单。
95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip...
java解析xml字符串,添加属性,更新属性等
87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip...