String、StringBuffer、StringBuidler 知识整理
2024-08-26 22:53:14
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。这里也就解释文章开头提出的第二个问题。
简单的整理记录一下。不对的地方欢迎指正。
最新文章
- C++命名规范
- Opencv step by step - 阈值化
- EMCA创建em资料库时报错
- static关键字的使用总结
- VO、DTO、DO、PO
- 微信小程序开发-tabbar组件
- 认识多线程中start和run方法的区别?
- JN_0003:JS定义变量的3种方式
- normalize.css的使用
- 【转】vs IIS破除文件上传限制最全版
- linux下PHP手动添加扩展库
- mariadb主从备份
- 【51NOD-0】1008 N的阶乘 mod P
- Jquery学习笔记(8)--京东导航菜单(2)增加弹框
- Linux内核开发
- window7 和ubuntu 双系统时 ubuntu不能引导怎么办?
- 【动态规划】bzoj1638 [Usaco2007 Mar]Cow Traffic 奶牛交通
- INSPIRED启示录 读书笔记 - 第4章 产品管理与产品设计
- CMAKE 编译报错
- MyEclipse修改Servlet模板
热门文章
- dump_stack使用
- OSError: [Errno 13] Permission denied: &#39;/Library/Python/2.7/site-packages/django&#39;
- error MSB8008: 指定的平台工具集(V120)未安装或无效。
- Android system :led_class驱动
- Centos7配置NFS
- POJ - 2823 Sliding Window (滑动窗口入门)
- python random模块(获取随机数)
- php优秀框架codeigniter学习系列——CI_URI类学习
- Java学习笔记26(异常)
- Javascript中的闭包 O__O ";…