java String StringBuilder StringBuffer
开篇
看了源码之后会发现有关java的String知识点面试的确很无聊,但凡看过代码的基本上都知道,所以我们去面试别人就用这个去面试别人就是为了验证别人有没有看过源码?
String源码分析
- String通过char value[]的字符数组来保存数据。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
private static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[0];
public String() {
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
}
StringBuilder源码分析
- StringBuilder继承自AbstractStringBuilder类,数组存储对象在基类中实现
- StringBuilder的方法没有加锁操作,非线程安全
public final class StringBuilder extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
/** use serialVersionUID for interoperability */
static final long serialVersionUID = 4383685877147921099L;
public StringBuilder() {
super(16);
}
public StringBuilder(int capacity) {
super(capacity);
}
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
}
StringBuffer源码分析
- StringBuffer继承自AbstractStringBuilder类,数组存储对象在基类中实现
- StringBuffer的方法有加锁操作,线程安全
- StringBuffer内部通过toStringCache变量提高toString()性能
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
private transient char[] toStringCache;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
static final long serialVersionUID = 3388685877147921107L;
public StringBuffer() {
super(16);
}
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
@Override
public synchronized int length() {
return count;
}
@Override
public synchronized int capacity() {
return value.length;
}
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
}
共同基类AbstractStringBuilder
- AbstractStringBuilder作为StringBuilder和StringBuffer的基类
- AbstractStringBuilder通过char[] value保存字符串
- AbstractStringBuilder内部包含count字段进行计数
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
@Override
public int length() {
return count;
}
public int capacity() {
return value.length;
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Python全栈 Web(JavaScript 函数、数组)
循环: for循环 简化版while循环 语法: for(表达式1;表达式2;表达式3) { 循环体 } 表达式1:循环条件初始化 表达式2:循环终止条件 表达式3:更新循环条件 流程: 1.先执行表达式1 声明条件 并且自走一次 2.表达式2 与循环条件的boolean值 3.进行循环操作 4.表达式3 更新循环条件 返回判断表达式2 for 和 while对比: 相同: 先判断条件然后在进行循环操作 不同: while:优先使用在不确定循环次数的场合下 for:优先使用在已知循环次数的条件下 通常用来遍历数据结构 循环的嵌套: 允许一个循环内部再出现一个循环 for(var i = 0; i <= 10; i++){ for(var x = 0; x <= 10; x++){ 循环体 } } 外层循环走以次内层循环走一轮 函数: function 是一段被定义好并且可以独立反复执行 并包含多条执行语句的代码块 在JS中创建函数: function 函数名 (参数){ 函数体 [返回值] //[] 代表可省略 } 参数列表; 如果没有参数为空 有则用逗号隔开多个参数 调用...
-
下一篇
Java 泛型的使用
本文旨在为完全不懂泛型,但是感觉泛型很神奇,想试一试的小伙伴使用,没有过于深入挖掘原理,文章相对肤浅。不喜勿喷哦。 一、类 泛型使用 泛型类必须为引用类型的代码格式 public class TestTwo<T> { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } } 使用类 public static void main(String[] args) { TestTwo<String> stringTest = new TestTwo<>(); stringTest.setT("中国"); System.out.println(stringTest.getT()); TestTwo<Integer> integerTest = new TestTwo<>(); integerTest.setT(1); System.out.println(integerTest.getT()); } 当泛型传入什么类型,则可以处...
相关文章
文章评论
共有0条评论来说两句吧...