提到 string、stringbuilder、 stringbuffer、大家都应该非常熟悉,
通常的理解是:
string 对象为final的,一旦被创建,就不能改变。
stringbuffer 是可变对象,append(),不会新建对象,同时是线程安全的,
stringbuilder 为线程不安全。
有了上面的理解也就可以很容易的知道什么时候该用什么了,
仔细想想,好像不对的吧?声明为final的类只是不可以被继承,怎么了成了string 对象是不可变的理由呢?
仔细查看源码会发现。其实 stringbuilder和stringbuffer 都被声明为 final。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence
Stringbuilder 类声明:
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
Stringbuffer 类声明:
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
其实string 和stringbuiler 、Stringbuffer 的真正区别如下:
String 中使用 final char [] 来保存string的内容:
/** The value is used for character storage. */ private final char value[];
在 stringbuiler 、Stringbuffer 的声明中,发现他的继承自相同的抽象类,并且实现了相同的借口,
在AbstractStringBuilder 类中使用 char [] 来保存String的内容:
/** * The value is used for character storage. */ char value[];
所以,string 为不可变对象,并不是因为string类被声明了final了,而是string类中用于保存string内容的数组被声明了final了。
然后随便验证一下关于string 类新建string的传说,查看看涉及到改变string内容的方面。。都可以看到类似下面的代码
return new String
然后在看 stringbuiler 、Stringbuffer类,发现他们的方法大体一样。。只不过stringbuffer 的方法声明都有 synchronized 关键字, 所以 stringbuffer 是线程安全的。
另外看看两个类的方法体都只是在调用父类的对应的方法。所以两个类除了线程安全性不同。其他操作基本一样。
深入 AbstractStringBuilder 类,发现
默认构建长度为16的数组,
每次的增长公式为:(length + 1) * 2,
每次只有当长度不够的时候才会扩展,不会提前扩展。
大量使用 System.arraycopy 函数实现拷贝的功能
本站支持 pay for your wishes
相关推荐
String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的
String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别
String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证
给大家简单介绍下C#中String StringBuilder StringBuffer三个类的用法,需要的的朋友参考下吧
String ,StringBuffer与StringBuilder的区别
介绍了String、StringBuffer、StringBuilder的使用方法,以及理论知识
String、StringBuffer 和 StringBuilder 的区别 碎碎念 简单认识这三个对象 String StringBuffer StringBuilder 深入理解 String、StringBuilder、StringBuffer 从设计角度理解 String StringBuilder StringBuffer ...
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
简单的介绍了String、StringBuffer和StringBuilder的区别
String及StringBuffer和StringBuilder的区别
在Android/Java开发中,用来处理字符串常用的类有3种: String、StringBuilder、StringBuffer。 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer、...
string,stringbuffer,stringbuilder
string,stringBuffer,stringBuilder
目录StringStringBuffer与StringBuilder总结 String ...StringBuffer与StringBuilder 这两者基本相似,都是可变字符串对象,主要区别为线程是否安全。 总结 最后,引用菜鸟教程下的总结以及相关评论: S
Java中String,StringBuffer与StringBuilder的区别和用法。
String,StringBuilder,StringBuffer
javase部分String的相关基础知识,String的构造方法总结比较以及各自的应用场景(代码举例),常用的容器类StringBuilder和StringBuffer的关系比较(图示)以及两者的区别联系和具体哪中场景下用哪个类。
对于很多Java行业的菜鸟来说,弄清楚String;StringBuffer;StringBuilder三者之间的区别是很有必要的,很多面试面试官都会问到这个知识点。集合网络上很多牛人的各种经典分析的总结,花了两个小时概括总结得出了现在...