String、StringBuffer、StringBuidler、这三个家伙,大家都不陌生,肯定也都会用。三者异同大家都能说出来,但是其根本原因是什么呢?带着下面问题,学习一下。

第一、String与后两者不同,为什么String对象不可变,后两者对象可变呢?

第二、线程安全方面,为什么StringBuffer比StringBuidler安全呢?

1.我们首先看String的源码(截取一小部分):

 public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
我标红的地方就是关键,String中的字符串是通过数组char来存储的,而它的修饰符是final,这就解释了为什么String对象不可变的原因。
private final char value[]; /** Cache the hash code for the string */
private int hash; // Default to 0

2.看看StringBuilder源码

它继承了AbstractStringBuilder这个类。

     @Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}

在append()方法里,会调用父类AbstractStringBuilder的append()的方法。

 父类append方法如下                 代码2

 1     // Documentation in subclasses because of synchro difference
@Override
public AbstractStringBuilder append(CharSequence s) {
if (s == null)
return appendNull();
if (s instanceof String)
return this.append((String)s);
if (s instanceof AbstractStringBuilder)
return this.append((AbstractStringBuilder)s); return this.append(s, 0, s.length());
}
     @Override                  代码3(标识用)
public AbstractStringBuilder append(CharSequence s, int start, int end) {
if (s == null)
s = "null";
if ((start < 0) || (start > end) || (end > s.length()))
throw new IndexOutOfBoundsException(
"start " + start + ", end " + end + ", s.length() "
+ s.length());
int len = end - start;
ensureCapacityInternal(count + len);
for (int i = start, j = count; i < end; i++, j++)
value[j] = s.charAt(i);
count += len;
return this;
}

上述代码3中的12行value在源码中定义是 char[] value;  没有final关键字。

3.说说StringBuffer

它也是继承了AbstractStringBuilder这个类,

     @Override
public synchronized StringBuffer append(CharSequence s) {
toStringCache = null;
super.append(s);
return this;
}

在append方法中,加入了synchronized关键字,所以在多想城称重,StringBuffer是安全的,但是安全的代价就是影响了一些速度,因此速度肯定慢于StringBuilder。这里也就解释文章开头提出的第二个问题。

简单的整理记录一下。不对的地方欢迎指正。

最新文章

  1. C++命名规范
  2. Opencv step by step - 阈值化
  3. EMCA创建em资料库时报错
  4. static关键字的使用总结
  5. VO、DTO、DO、PO
  6. 微信小程序开发-tabbar组件
  7. 认识多线程中start和run方法的区别?
  8. JN_0003:JS定义变量的3种方式
  9. normalize.css的使用
  10. 【转】vs IIS破除文件上传限制最全版
  11. linux下PHP手动添加扩展库
  12. mariadb主从备份
  13. 【51NOD-0】1008 N的阶乘 mod P
  14. Jquery学习笔记(8)--京东导航菜单(2)增加弹框
  15. Linux内核开发
  16. window7 和ubuntu 双系统时 ubuntu不能引导怎么办?
  17. 【动态规划】bzoj1638 [Usaco2007 Mar]Cow Traffic 奶牛交通
  18. INSPIRED启示录 读书笔记 - 第4章 产品管理与产品设计
  19. CMAKE 编译报错
  20. MyEclipse修改Servlet模板

热门文章

  1. dump_stack使用
  2. OSError: [Errno 13] Permission denied: &#39;/Library/Python/2.7/site-packages/django&#39;
  3. error MSB8008: 指定的平台工具集(V120)未安装或无效。
  4. Android system :led_class驱动
  5. Centos7配置NFS
  6. POJ - 2823 Sliding Window (滑动窗口入门)
  7. python random模块(获取随机数)
  8. php优秀框架codeigniter学习系列——CI_URI类学习
  9. Java学习笔记26(异常)
  10. Javascript中的闭包 O__O &quot;…