from:http://www.zihou.me/html/2011/01/27/2726.html
String和StringBuffer有何区别?或许我们所熟知的是String是定长而StringBuffer是变长的,这种说法当然是没错的,而事实上,在一般的情况下,String和StringBuffer两者用起来是没有任何区别的。
那么所说的一般情况是指那些情况呢?比如我们定义一个字符变量:
String str = “”;
StringBuffer str = new StringBuffer(“”);
我们只是对这变量进行一些常规的字符操作,比如用来得到form表单提交的字符串等等,在这种情况下,去区分String和StringBuffer的区别是没有任何意义的。那么在什么非一般的情况下来做这种区分有意义呢?
假如有这样一个需求,有至少50万个词,需要你将一个词一个词连接起来(每个词后加回车符),然后写入到文件中,那么此时,你该选择String还是StringBuffer呢?如果这时你还认为像上面所说的那样随便选择一个就行了的话,那么结果很可能就会变得恐怖起来,因为你的程序很可能在运行到一半的时候会挂掉!而你还以为是程序哪里错了,是不是出现了死循环?实际上,你的程序逻辑并没错,你只是错在用了String而不是StringBuffer上。
String的构造函数是这样写的:
public String() {
this.offset = 0;
this.count = 0;
this.value = new char[0];
}
构造出了一个空的字符数组,而StringBuffer却是构造出了一个16个元素的字符数组,如下:
public StringBuffer() {
super(16);
}
而这还并不能说明情况,再看看StringBuffer的append方法:
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
if (len == 0) return this;
int newCount = count + len;
if (newCount > value.length)
expandCapacity(newCount);
str.getChars(0, len, value, count);
count = newCount;
return this;
}
如果当前新的个数(已有的数组长度加上新增加的Str长度)大于了目前数组已有的长度,那么就会调用expandCapacity(newCount);进行扩容,expandCapacity的方法如下:
void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}
扩充规则是:
在已有数组长度上加1,然后乘以2得到一个新的容量值newCapacity,如果新的容量值小于0,那么将Integer.MAX_VALUE赋给newCapacity,如果是minimumCapacity > newCapacity,则将newCapacity = minimumCapacity;最后再生成一个扩容后的新的数组。
StringBuffer的这个扩容机制就是与String截然不同的地方,也是StringBuffer在处理大容量数据时优于String的地方,也就是利用数组的扩容,理论上,StringBuffer的最大容量可以达到Integer.MAX_VALUE的长度,而String,我查看了其源码,没有发现这样的扩容机制。
再回到上面说的那个问题,这个也不是我随意想出来的一个问题,事实上是我在实际工作中遇到的一个问题,当时我用String的时候,发现程序运行不下去,在确认程序绝对没错之后,我猛然想起了平常一说就会挂在嘴边的String和StringBuffer的区别,才突然意识到这里可能正是这两者的区别所在,于是将String改为了StringBuffer,之后程序运行顺利,庞大的数据也能顺利连接起来。
所以做个总结就是:当你需要用字符串来处理大量数据的时候,一定要记得用StringBuffer而不是String,反之,两者均可用。
在Java中,有好多的对象彼此间像String和StringBuffer一样很相似,在很多情况下两者所应用的效果也是非常类似没差别,只有在一些特殊的情况下,比如大量数据处理、高并发线程等等情况下,两者间的区别才非常明显地显现出来,这就是我们要在程序编写中尽量要意识到的问题。
分享到:
相关推荐
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候...
Java面试题-每日一题:String、StringBuffer、StringBuilder的区别
"String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...
### JAVA中String与StringBuffer的区别 在Java编程语言中,`String` 和 `StringBuffer` 都是非常重要的类,它们用于处理字符串数据。虽然它们都实现了字符串操作的功能,但它们之间存在一些重要的区别,这些区别...
最后,让我们总结一下 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别和用法。String 类型是不可变的对象,性能不好,适合不需要修改的字符串对象。StringBuffer 类型是可变的对象,性能好,...
在Java编程语言中,`String`与`StringBuffer`是两个重要的字符串处理类,它们各自具有独特的特性和用途,尤其在面试或笔试中常被提及作为考察应聘者对Java基础知识掌握程度的重要知识点。 ### `String`类:不可变性...
Java中String和StringBuffer的区别实例详解 Java中String和StringBuffer都是用来存储字符串的对象,但是它们之间有着很大的区别。下面我们来详细介绍Java中String和StringBuffer的区别实例详解。 首先,String是不...
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在性能和使用场景上有显著的区别。 首先,`String`类是不可变的,这意味着一旦创建了一个`String`对象,它的内容就不能改变。...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
下面是Java中String和StringBuffer类的一些基本知识点。 1. 声明方式:String和StringBuffer都是final类,String继承自Object实现了Serializable、Comparable<String>和CharSequence接口,而StringBuffer继承自...
在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在使用场景和性能上有显著的区别。了解这些差异对于编写高效、优化的代码至关重要。 首先,`String`类是不可变的。这意味着...
在Java中,处理字符串主要涉及到两个类:String和StringBuffer。这两个类虽然在功能上有许多相似之处,但它们在实现和性能上却有很大的差别。 首先我们来理解String。String类在Java中是不可变的,这意味着一旦一个...
在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
### StringBuffer与String的区别详解 #### 一、概念与特性 **String** 是 Java 中一个不可变的类,代表了字符序列。一旦一个 String 对象被创建后,其内容就不能被改变。这使得 String 类非常适合用来表示常量或者...
在Java编程语言中,String和StringBuffer是两个重要的类,它们在处理文本数据时有着显著的区别。String类代表不可变的字符序列,一旦创建,其值就不能改变。这意味着每次对String对象进行修改(如拼接操作)都会创建...