浅谈String 和StringBuffer

原创 2007年10月03日 11:00:00

浅谈String 和StringBuffer

    首先让我们看个例子:

String s1 = "abc";

String s2 = s1;

s1 += "增加的;

System.out.println("String s1->" + s1);

System.out.println("------------------------------");

System.out.println("String s2->" + s2);

System.out.println("******************************");

StringBuffer a1 = new StringBuffer("abc");

StringBuffer a2 = a1;

a1.append("增加的);

System.out.println("StringBuffer a1->" + a1);

System.out.println("------------------------------");

System.out.println("StringBuffer a2->" + a2);

 

输出结果

String s1->abc增加的

------------------------------

String s2->abc

******************************

StringBuffer a1->abc增加的

------------------------------

StringBuffer a2->abc增加的

 

从得出的结果看你是不是觉得有点以外那么现在我们就来分析它为什么会得出这样的结果。

上图就是程序需要创建的一些对象,

    看左图,创建了两个String对象s1和s2,它们同时指向同一个对象abc,当程序执行s1+="增加的";这个语句的时候,其实不是把s1的内容改变为原s1+"增加的"的内容这么简单, 而把创建一个新的String, 内容为s1 + "增加的"的内容,然后再把s1这个引用重新指向新创建的String,.其实这就是所谓的String不可变性.即对象abc不可改变。

    看右图,创建两个StringBuffer对象a1和a2,他们同时指向同一个对象abc,当程序执行a1+="增加的";这个语句的时候,直接改变对象abc的内容为"abc增加的",这里并不象String先要创建一个对象,而是直接改变对象的内容,其实这就是所谓的StringBuffer可变性,即可以改变对象abc。

 

下面来说说为什么JAVA有了String类型还要设计StringBuffer类型呢?

    首先,我毕竟不是JAVA的Designer,所以我也不知道他们为什么要这样设计,我只是从程序得到的一些结果,一些表象的东西去分析它,从而得出自己的观点和看法。

    当创建一个String对象后,一个引用(s1)就指向一个具体的对象(o1),当再创建一个对象(o2)且用s1指向o2,这时o1就成了孤立的对象,没有任何引用指向它,一旦频繁创建这样的对象就会造成资源浪费。所以我们采用了StringBuffer,当String确定后再调用StringBuffer类的toString()方法转化为String对象。看如下一个例子大家就会明白了:

 

String temp = "a";

long time1 = new Date().getTime();

for (int i = 0; i < 10000; i++) {

    temp += "b";

}

long time2 = new Date().getTime();

System.out.println(time2 - time1);

 

由于String类是支持非可变性的,所以,当执行temp += "b";的时候,实际上是另外创建了一个对象,而tmp原来指向的那个对象就成了垃圾(当它没有其它引用的时候),这样的话一个循环就会产生100多对象,可以相象内存的浪费。如果循环1000次,100000次呢?可想而知。

 

但是如果换成StringBuffer呢?

 

StringBuffer temp = new StringBuffer("a");

long time1 = new Date().getTime();

for (int i = 0; i < 1000; i++) {

    temp.append("b");

}

long time2 = new Date().getTime();

System.out.println(time2 - time1);

 

由于StringBuffer类是支持可变性的,所以执行temp.append("b");的时候,实际上它只是改变了对象的内容,并没有去创建对象,这样就节约了内存资源。

 

下面是一个String 和StringBuffer运行耗时的一个对照表,大家看了就知道StringBuffer的性能好了:

呵呵,大家看了这个表肯定跟我一样的感觉哈,不可思议呀!!

 

总结:String类是不一个不可变的类,StringBuffer类是一个可变的类。当在需要创建 大量重复对象时,StringBuffer比String的性能更优。

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

浅谈String、StringBuffer、StringBuilder

String: 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象。查看源码就会发现String类为final型的(当然也不可被继承),而且通过查看JDK文档会发现几乎每...

【java】浅谈 Java 字符串(String, StringBuffer, StringBuilder)

String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)  简要的说, String 类型和 StringBuffer 类型的主...

浅谈 Java 字符串(String, StringBuffer, StringBuilder)

原文链接:https://segmentfault.com/a/1190000002683782 我们先要记住三者的特征: String 字符串常量StringBuffer 字符串变量(线...

浅谈String和StringBuffer的区别

前几天的一个面试官问到我String和StringBuffer的区别,当时我回答的不是很理想,这几天在网上看了一下大家的博客,自己也看了一下JDK中String,StringBuffer的内部实现,在...

java中的String,StringBuffer和StringBuilder浅谈

结论: (1)String类对象是不可改变的,任何对String对象的改变都会隐形的重新构建一个新的对象,释放原来的String对象 (2)StringBuffer类是可以改变的,任何对StringB...

浅谈 Java 字符串(String, StringBuffer, StringBuilder)

转载自https://segmentfault.com/a/1190000002683782 我们先要记住三者的特征: String 字符串常量StringBuffer 字符串变量(线...

浅谈Java中数据在内存中的状态,以及String、StringBuffer、==、equals、数组等问题

首先,我们知道,Java中的数据类型分为两种,基本数据类型和引用数据类型。而基本数据类型,为什么不直接使用他们的包装类呢,例如Integer、Long等等呢?下面是Thinking in Java 中...

java String和StringBuilder、StringBuffer浅谈

java面试中经常会问到这两者之间的区别,学习记录一下。基本概念: String String是对象而不是原始类型,它是个final类,不能被继承,同时它也是不可变对象,一旦创建一个String对...

浅谈String,StringBuffer,StringBuilder

String,StringBuffer,StringBuilder的区别三个类的区别由三个类的源代码可以看出,三者存储字符串都是存储在字符char[]里面String类源代码: StringBuff...

浅谈String,StringBuffer与StringBuilder

String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)  简要的说, String 类型和 StringBuff...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)