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效率不少
- Java之String与StringBuffer
- Java基础之String与StringBuffer
- Java开发之String与StringBuffer
- Java-String与StringBuffer
- Java String与StringBuffer
- Java之String与CharSequence、StringBuffer与StringBuilder之间区别
- java中的String与StringBuffer
- java中的String与StringBuffer
- [Java]String、StringBuilder与StringBuffer
- 【Java】String、StringBuilder与StringBuffer
- java:String、StringBuffer与StringBuilder
- Java基础之String,StringBuffer与StringBuilder的区别浅谈
- java之String、StringBuffer、StringBuilder
- java之String,StringBuffer,StringBuilder,
- Java之String、StringBuffer、StringBuilder
- Java之String、StringBuffer、StringBuilder
- 认识String之二:String与StringBuffer
- 【String】String与StringBuffer
- LeetCode-Unique Paths
- 深入理解JavaScript系列(19):求值策略
- flv 格式分析
- 怎么实现ppt格式转为pdf文件
- Android Volley支持多个cookie
- Java之String与StringBuffer
- 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解
- 简单的Hessian实例
- Codeforce 85E (二分答案+二分图染色)
- 通过linux的tc工具简单实现上传和下载的流量控制
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
- flv 格式分析2
- windows下安装,配置gcc编译器
- MySQL:Table XXX is marked as crashed and should be repaired