String和StringBuffer

2.String

不可继承 和 不可变

它是final Class , 不可继承

public final class String implements java.io.Serializable, Comparable<String>, CharSequence 

用char类型的数组存储内容,final 修饰,且没有提供set(), 一旦初始化,值不能改变

private final char value[];

 初始化

String = 的形式:

String a="abc";  String b="abc";   创建1个对象  它的判断依据是String类equals(Object obj)的返回值

String a
="ab"+"cd"; 创建3个对象

new 的形式:

String a = new String("abc"); 创建两个对象, 一个在堆中, 一个在常量池中

()中的"abc"首先被创建, 存储在常量池;  在创建a ,存储在堆中,和其他的对象时一样的 ,如下图所示

 

+号连接

String c = "a" + "b " + c + "d"; 通过查看字节码文件,发现实现过程如下:

String c = new StringBuilder("ab").append(c).append("d").toString();

1. 前两字符串: "a" + "b" 产生一个新的对象 String new  ="ab"

2. new 和后面的字符串执行 append 操作, 产生一个 StringBuilder 对象

StringBuffer

 线程同步的,可变的对象,可变指的是属性的值

内部存储 : 可变的

用char类型的数组存储内容, 来自于父类,对外提供set(), 因此数组可变

char[] value;  

当进行append操作时, 实际上改变的是这个数组, 不会创建新的StringBuffer对象

扩充容量

当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展

int newCapacity = value.length * 2 + 2;

然后申请一段更大的内存空间,将当前char数组拷贝到新的位置

value = Arrays.copyOf(value, newCapacity);   //新的value

 

posted @ 2016-12-12 19:03  liuconglin  阅读(169)  评论(0编辑  收藏  举报