StringBuffer/StringBuilder/String关键点源码分析
2016-03-07 19:46
507 查看
花了好久时间都没能正常下载到一份JDK源码,后来灵机一动上github搜了一下,发现了好多别人push上去的JDK源码。有人还给出了自己分析研究源码的记录。
在这个目录下(jdk7u-jdk/src/share/classes/java/lang),就能看到StringBuffer.java , StringBuilder.java和String.java。下面对照源码,理清及格关键问题,就能更好的理解它们。
(2)进行字符串拼接时,String只能用“+”,每一次“+”都涉及到新内存的申请和旧内存的释放,这样效率较低。所以使用由扩容机制的StringBuffer/StringBuilder去做字符串拼接(append())效率会高。
(3)String用“+”做拼接,也并非效率就绝对低。比如下面的代码,用String反而效率最高
因为有JVM的优化,上面这行代码就相当于
String没有继承任何类,只实现了CharSequence等接口。final说明该类不能被继承。
StringBuilder
StringBuilder 继承了AbstractStringBuilder 。
StringBuffer
StringBuffer 继承了AbstractStringBuilder 。
AbstractStringBuilder 是何方神圣
AbstractStringBuilder 实现了CharSequence接口(String也实现了这个接口)。
而三者都实现了CharSequence接口,可见对于字符串处理,CharSequence的重要性。观其源码,CharSequence只是简单定义了下面几个方法,它们也就是字符串处理必须实现的最核心的方法:
String的value是final类型,这就说明了String对象是不可变的。
这里设置了初始值为16个字节。它的扩容函数如下:
所以,capacity的容量是这样增长的: 16, 34, 70, 142, 286…
而StringBuilder/String是这样实现length()的:
StringBuffer中大量使用了synchronized关键字,synchronized可以给代码块加锁。
JDK源码
在这个目录下(jdk7u-jdk/src/share/classes/java/lang),就能看到StringBuffer.java , StringBuilder.java和String.java。下面对照源码,理清及格关键问题,就能更好的理解它们。
1. 从使用/接口上,它们之间最大的区别是什么?
(1)String没有append()方法。StringBuffer/StringBuilder都有append()。(2)进行字符串拼接时,String只能用“+”,每一次“+”都涉及到新内存的申请和旧内存的释放,这样效率较低。所以使用由扩容机制的StringBuffer/StringBuilder去做字符串拼接(append())效率会高。
(3)String用“+”做拼接,也并非效率就绝对低。比如下面的代码,用String反而效率最高
String S1 = “This is only a” + “ simple” + “ test”;
因为有JVM的优化,上面这行代码就相当于
String S1 = "This is only a simple test";
2. 它们继承关系是怎样的?
Stringpublic final class String implements java.io.Serializable, Comparable<String>, CharSequence
String没有继承任何类,只实现了CharSequence等接口。final说明该类不能被继承。
StringBuilder
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
StringBuilder 继承了AbstractStringBuilder 。
StringBuffer
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
StringBuffer 继承了AbstractStringBuilder 。
AbstractStringBuilder 是何方神圣
abstract class AbstractStringBuilder implements Appendable, CharSequence
AbstractStringBuilder 实现了CharSequence接口(String也实现了这个接口)。
而三者都实现了CharSequence接口,可见对于字符串处理,CharSequence的重要性。观其源码,CharSequence只是简单定义了下面几个方法,它们也就是字符串处理必须实现的最核心的方法:
int length(); char charAt(int index); CharSequence subSequence(int start, int end); public String toString();
3. 它们对于字符数据存储的区别?
Class | The value for character storage |
---|---|
String | private final char value[]; |
StringBuffer,StringBuilder | char[] value = new char[capacity]; |
4. StringBuffer/StringBuilder是如何扩容的?
以StringBuffer为例,它的构造函数是这样实现的:public StringBuffer() { super(16); }
这里设置了初始值为16个字节。它的扩容函数如下:
void expandCapacity(int minimumCapacity) { int newCapacity = value.length * 2 + 2; //下面的代码省略 }
所以,capacity的容量是这样增长的: 16, 34, 70, 142, 286…
5. 为何说StringBuffer是线程安全的?
借用源码来解释,StringBuffer的length()方法实现如下:public synchronized int length() { return count; }
而StringBuilder/String是这样实现length()的:
public int length() { return count; }
StringBuffer中大量使用了synchronized关键字,synchronized可以给代码块加锁。
6 参考
/article/4403506.htmlJDK源码
相关文章推荐
- java中Queue简介
- java中队列Queue的使用
- 关于全局变量,局部变量的一些看法!!!
- UGUI 全方位了解
- RoboGuice 3.0 (一)入坑篇
- Java源码阅读之StringBuidler
- 1099. Build A Binary Search Tree (30) 给定二叉搜索树插值
- iOS开发------类似UI浏览器上方的滚动状态栏
- UIButton的contentEdgeInsets属性
- 为啥requests和urllib,urllib2,urllib3的URL编码行为存在这种差异?
- SoupUI Pro返回乱码
- 解决 PHP Interpreter is not configured Please configure PHP Interpreter to use built-in web server
- 关于order by注入利用rand(true)的一个疑问
- proxy-target-class="true" 与proxy-target-class="false"的区别
- 自定义导航栏按钮UIBarButtonItem 文字或图片(定制)
- UILabel的一些不常用属性,持续更新
- LeetCode 96. Unique Binary Search Trees
- 语言编程中返回false和true的易错点
- Java String、StringBuffer、StringBuilder比较
- UE4 学习笔记(一)--- TextBox 文本框用BluePrint做限制字符输入个数