String与StringBuffer的区别?
来源:互联网 发布:云计算概念股龙头老大 编辑:程序博客网 时间:2024/04/27 22:56
StringBuffer必须new出来,StringBuffer的append的效率比string的+=的效率高,
1、String 类提供了许多字符串处理的功能,不过,一旦创建了String对象,则它的内容就永远不会改变,
2、StringBuffer类创建和动态操作字符串.每个StringBuffer对象都能够存储由其容量指定的字符,如果超出了对象的容量,则容量就会自动地扩大,以容纳多出来的字符.
3、String类对象是常量字符串,而StringBuffer对象是可修改的字符串.
4、如果程序频繁地执行字符串连接操作,或其他的字符串修改操作,则使用StringBuffer类来实现这些修改操作,可以提高效率.
====================================================================
如果该字符串不会变更,则总是使用String对象,将提高性能.
其实发现还有很大的区别,看了看以前scjp的考题
public class Test {
public static void stringReplace (String text) {
text = text.replace('j' , 'i');
}
public static void bufferReplace (StringBuffer text) {
text = text.append("C");
}
public static void main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
答案是 javajavaC
这是String参数传递,是不可变的(immutable).
而题目中第七行text = text.append (“C”),append方法会改变text中的值
而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。
string的值永远不会改变!
String a = "a";//假设a指向地址0x0001,
a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址
StringBuffer则不同,直接改变指向的地址中保留的值
还有
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的,所以等于false.
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
true。
====================================================================
结合这个看看吧!
public class Foo {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
}
A.“AB,B” B.“A,B” C.“AB,A” D.“AB,AB”//选A..
====================================================================
String str="You are nice.";
str+="I love you so much.";
如果用StringBuffer类的话,代码如下:
StringBuffer str= new StringBuffer("You are nice.");
str.append("I love you so much.");
从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:
经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"You are nice."和"I love you so much."创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。
- StringBuffer以及StringBuffer与String的区别
- String与StringBuffer的区别?
- string与stringBuffer的区别
- string与stringbuffer的区别
- string与stringbuffer的区别
- String与StringBuffer的区别
- String与StringBuffer的区别
- string与stringbuffer的区别
- String与StringBuffer的区别?
- String与StringBuffer的区别?
- String与StringBuffer的区别
- StringBuffer与String的区别
- String与StringBuffer的区别
- String与StringBuffer的区别
- String 与StringBuffer的区别
- String与StringBuffer的区别?
- StringBuffer与String的区别
- String与StringBuffer的区别
- xz
- 十天学会ASP之第六天
- 苏格拉底与失恋者的对话——失去不合适的恋人是一种幸福
- VC++6.0中内存泄漏检测(转)
- 用vs2005要习惯于clean solution and build solution
- String与StringBuffer的区别?
- 男人会等一个女人多久
- 让一个脚本自动定时运行,设置、启动 linux定时脚本 (crontab详解)
- 十天学会ASP之第七天
- Understanding Linux Network Internals 第二十六章 翻译稿:邻居子系统的概念
- [转载] Python 常用模块整理
- 十天学会ASP之第八天
- 为你的论坛、网站加入涂鸦功能
- SQL6031N 在 db2nodes.cfg 文件的行号"1" 上出错。原因码为"10"。