JAVA中String类和StringBuffer类的…
2013-10-08 18:38
375 查看
String类用来表示那些创建后就不会再改变的字符串,它是immutable的。而StringBuffer类用来表示内容可变的字符串,并提供了修改底层字符串的方法。
如果我们要进行字符拼接,那么使用StringBuffer类就比String类快很多倍。
举个简单的字符串拼接的例子,代码如下:
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("I love
you so much."),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。
可想而知,如果我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少次无谓的强制类型转换哪
例子
public class Untitled1 {
public Untitled1() {
}
public static void main(String[] args) {
Untitled1 untitled11 = new Untitled1();
String s1="STRING类的值是不是会变的->";
String s2=s1;
System.out.println(s2);
s1+="拼接测试"; //String 赋值实际上这个是NEW了一个新的对象了,S1变了
System.out.println(s2); //S2没有变,这是因为S2指向的地址还是最早的s1所在的地址
StringBuffer b1=new StringBuffer("StringBuffer类的值是会变的->");
StringBuffer b2=b1;
b2.append("拼接测试");//StringBuffer赋值,操作b2还是那个对象,
System.out.println(b1);//所以加一个字符进去b1指向的对象的值已经变了哦
}
}
结果:
STRING类的值是不是会变的->
STRING类的值是不是会变的->
StringBuffer类的值是会变的->拼接测试
转载自:http://wenwen.soso.com/z/q153497405.htm
如果我们要进行字符拼接,那么使用StringBuffer类就比String类快很多倍。
举个简单的字符串拼接的例子,代码如下:
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("I love
you so much."),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。
可想而知,如果我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少次无谓的强制类型转换哪
例子
public class Untitled1 {
public Untitled1() {
}
public static void main(String[] args) {
Untitled1 untitled11 = new Untitled1();
String s1="STRING类的值是不是会变的->";
String s2=s1;
System.out.println(s2);
s1+="拼接测试"; //String 赋值实际上这个是NEW了一个新的对象了,S1变了
System.out.println(s2); //S2没有变,这是因为S2指向的地址还是最早的s1所在的地址
StringBuffer b1=new StringBuffer("StringBuffer类的值是会变的->");
StringBuffer b2=b1;
b2.append("拼接测试");//StringBuffer赋值,操作b2还是那个对象,
System.out.println(b1);//所以加一个字符进去b1指向的对象的值已经变了哦
}
}
结果:
STRING类的值是不是会变的->
STRING类的值是不是会变的->
StringBuffer类的值是会变的->拼接测试
转载自:http://wenwen.soso.com/z/q153497405.htm
相关文章推荐
- java中如何把String类转成StringBuffer类?` 2010/12/26
- 黑马程序员—JAVA基础—String类、StringBuffer类
- java学习笔记(十)----String类和StringBuffer类
- Java基础13:String类;Stringbuilder类;Stringbuffer类;自动装箱
- JAVA基础 day13 String类和StringBUffer类的常用方法 基本数据类型包装类的学习
- 黑马程序员_Java面对对象——String类和StringBuffer类
- Java中String类StringBuffer类和StringBuilder类的区别
- 黑马程序员——Java常用类笔记(上)【Object类/Scanner类、String类/StringBuffer类、包装类】
- 黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用
- java 中的Number类 Character类 String类 StringBuffer类 StringBuilder类
- 【Java-常用类】String类,StringBuffer类,StringBuilder类
- java 学习 String类 和 StringBuffer类的用法 暑假第九天
- java中String类、StringBuffer类、StringBuilder类的区别(未完待续)
- JAVA中String类与StringBuffer类的区别
- java中String类和StringBuffer类实例详解
- JAVA中String类和StringBuffer类的区别
- Java中String类和StringBuffer类的区别
- java 学习 String类 和 StringBuffer类的用法 暑假第九天
- 黑马程序员————Java基础之String类与StringBuffer类
- Java中 String类、StringBuilder类、StringBuffer类 区别与如何选择