Java之String与StringBuffer

来源:互联网 发布:伺服电机编程实例 编辑:程序博客网 时间:2024/05/22 17:26

通过Java之关于你所不知道的String这篇文章,我们已经大概了解了JAVA中String的相关知识。

这里,我们主要探讨Java中String和StringBuffer的区别。

说起StringBuffer,先来查看JDK1.6文档:

java.lang Class StringBufferjava.lang.Object  extended by java.lang.StringBufferAll Implemented Interfaces:Serializable, Appendable, CharSequencepublic final class StringBufferextends Objectimplements Serializable, CharSequence

首先String类:

它是final类型,是不可改变对象,一旦创建,就不能修改它的值;

对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新值存入;


再看StringBuffer类:

它是一个可变对象,对它进行修改的时候,不用想String那样重新创建对象;

它只能通过构造函数创建对象;

对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.通过它的append方法向其赋值。


这里我们发现没有,其实StringBuffer也是final声明的,那为什么StringBuffer就是可变对象,String就不是呢?

我们先来看看final的定义:

对于基本类型,final使数值恒定不变;而对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径。


这里找到一个网友的评论是这样描述的:

final是修饰变量的,不是修饰对象本身的


举例说明:
final String s = "hello";
这里final是修饰变量s的,而不是修饰"hello"
至于说String不能修改,是因为String类是immutable的,就是不能修改的意思,immutable也是一个修饰符



final StringBuffer sb = new StringBuffer("hello");
这里final修饰了sb,sb就不能指向其它对象了
比如sb = new StringBuffer("hi");这样是不允许的
但是sb所指向的那个对象本身还是可以改变的
比如sb.append(" world");是允许的,因为sb并没有变,sb仍然指向的是那个对象,变化的是对象本身

而final修饰类时,是指不能再被继承,跟能不能更改是两码事


特意查看了下String的文档有一段是这样描述的正好验证了上边网友的结论:



在字符串连接操作中StringBuffer的效率要明显比String高:
String对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
StringBuffer对象实例化后,只对这一个对象操作。


这里用一个测试程序来验证:

public class Test {public static void main(String args[]) {String str = "abc";StringBuffer sb = new StringBuffer("abc");Runtime runtime = Runtime.getRuntime();long start = System.currentTimeMillis();long startFreememory = runtime.freeMemory();for (int i = 0; i < 10000; i++) {str += i;//测试StringBuffer时候把注释打开//sb.append(i);}long endFreememory = runtime.freeMemory();long end = System.currentTimeMillis();long start2 = System.currentTimeMillis();long startFreememory2 = runtime.freeMemory();for (int i = 0; i < 10000; i++) {//str += i;//测试StringBuffer时候把注释打开sb.append(i);}long endFreememory2 = runtime.freeMemory();long end2 = System.currentTimeMillis();System.out.println("String操作耗时:" + (end - start) + "ms," + "内存消耗:"+ (startFreememory - endFreememory)/1024 + "KB");System.out.println("StringBuffer操作耗时:" + (end2 - start2) + "ms," + "内存消耗:"+ (startFreememory2 - endFreememory2)/1024 + "KB");}}
打印结果:

String操作耗时:2809ms,内存消耗:976KB
StringBuffer操作耗时:16ms,内存消耗:166KB


我们可以看到StringBuffer来处理串联字符要比String效率不少

0 0
原创粉丝点击