`
microcoder
  • 浏览: 2779 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java之字符串

 
阅读更多
相信大家都知道,对于字符串的处理是很多编程语言经常要做的事情,对于java来说,它自带了丰富的字符串类,例如String,StringBuilder, StringBuffer;但是对于初学者来说有时候很困惑它们之间的区别,我通过查阅相关的资料,进行了一些总结,因此也就有了这篇博客的来源了。首先先来分别介绍一下它们,然后在解释它们之间的区别。

一.String

String类也就是字符串类型,它虽然不属于Java的基本数据类型,但是我们在使用的时候却可以当作基本数据类型一样使用,例如直接用String str = "hello java".来进行声明初始化,但是String类对象一旦创建就不可更改(可能有人会觉得我可以修改啊,别急,我下面会有说明),它作为类对象,也自然有自己的构造方法,主要有以下构造方法:

  1. String()可以产生一个空字符序列。
  2. String(char a[])可以使用一个字符数组创建String对象
  3. 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的优势并不明显,欢迎大家探讨。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics