浅谈String和StringBuffer的区别
来源:互联网 发布:阡陌软件官网 编辑:程序博客网 时间:2024/06/05 14:58
前几天的一个面试官问到我String和StringBuffer的区别,当时我回答的不是很理想,这几天在网上看了一下大家的博客,自己也看了一下JDK中String,StringBuffer的内部实现,在这里记录一下。
关于String和StringBuffer的区别,我首先想到的是String创建对象是定长的,而StringBuffer创建的对象是可以动态改变长度的,当对字符串进行动态拼接时,StringBuffer的append()方法比String的+=效率高,那为什么String长度不可改变,而StringBuffer长度是可以改变的呢,这是为什么呢,我们可以看看String和StringBuffer的源码。
String类:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ /** The value is used for character storage. */ private final char value[]; public String() { this.offset = 0; this.count = 0; this.value = new char[0]; }}
可以看到,String类是被final修饰的,这就是说String类是最终类,不能被继承。String类包含一个私有的char类型的数组,同时这个数组被final修饰,意思是创建之后不能被修改,当调用String的默认构造方法,this.value = new char[]; char类型数组被创建,当然我们常用的都是都是有参的。由此可见,String对象的值是放在一个char[]里的,而这个char[]是被定义成final的。
StringBuffer类:
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{ public StringBuffer() { super(16); }}
AbstractStringBuilder类:
abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The value is used for character storage. */ char[] value; AbstractStringBuilder() { } AbstractStringBuilder(int capacity) { value = new char[capacity]; }
StringBuffer继承了AbstractStringBuilder类,而在AbstractStringBuilder类里可以清楚的看到,定义了一个char[] ,注意额,这个数组没有被定义成final,StringBuffer的默认构造方法调用父类的构造方法,默认长度是16。当我们调用append()方法时,如果然来的空间不足,那么AbstractStringBuilder最终会调用Arrays这个类,重新创建一个字符数组,然后将原来那个数组copy到这个新的数组中。而实现copy功能是System类的arrayCopy方法,这是一个本地方法。
Array类的copyOf()方法:
public static char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
System类的arraycopy()方法:
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
至此,分析完毕,然来写博客这么累。
- 浅谈String和StringBuffer的区别
- 浅谈String、StringBuffer、StringBuilder的区别
- 浅谈String 和StringBuffer
- String 和 StringBuffer的区别
- String 和StringBuffer的区别
- 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的区别
- paint you a rainbow
- android 开发错误点滴积累--Asset资源管理
- C++/OC 混编
- 二叉树的三种遍历的相互转化——已知先序中序求后序
- PCA(opencv)
- 浅谈String和StringBuffer的区别
- YYXT之IT工作小记(七)
- HTTP1.1协议常用请求头和响应头内容--精简版
- JAVA中this用法小结
- 2012 ACM/ICPC杭州网赛总结 #by nobody
- objective-C 中使用@Class和 #import区别
- 第一个smarty 小管理网站的总结
- 数据库 活锁和死锁
- 选择排序的c实现