20201224-魏凯

2020.12.24

1.String

1.1

String s = “hello”;

(1)当遇到“hello”会首先查找String常量池中是否存在相应的String实例

(2)若String常量池【不存在】相应的String实例,则构造新的实例并将该实例添加到String常量池

(3)将返回的String实例的地址赋值给s变量(此时就是s变量指向了String变量池)

1.2

String x = "hello" ;

(1)当遇到“hello”会首先查找String常量池中是否存在相应的String实例

(2)若String常量池【存在】相应的String实例,则直接返回String常量池中该实例的地址

(3)将返回的String实例的地址赋值给x变量(此时就是x变量指向了String常量池)

1.3

String x = s.intern();
  • 调用s的intern方法时,String常量池中并没有相应String实例
  • 所以将当前的String实例添加到String常量池并返回该实例的地址

(情况2:①调用s的intern方法时,String常量池中已经存在相应String实例

②因此s.intern()返回了String常量池中已经存在的String实例的地址,而不是返回s的实例地址)

1.4

String t = "青海长云暗雪山" ;
  • 尝试从String常量池中获取字符序列对应的String实例
  • 因为String常量池中已经存在相应的String实例,所以直接返回相应的String实例(情况2:因为未找到相应的String实例,所以需要创建新的String实例并添加到String常量池后再返回其地址)

2.StringBuffer

(1)StringBuffer类直接继承了AbstractStringBuffer【从JDK1.5开始】

(2)StringBuffer类是最终类【final class】

(3)StringBuffer实例中的实例变量是可变的

(4)StringBuffer类中定义的实例方法都会直接修改当前StringBuffer实例

(5)StringBuffer实例是可变的(字符缓冲区中的内容是可变的)

(6)常见的实例方法:deleteCharAt/setCharAt/trimToSize

(7)StringBuffer和StringBuilder都没有重写Object的equals方法

(8)可以将StringBuffer和StringBuilder转换为String实例后通过String类提供的contentEquals来比较

(9)String类提供了contentEquals(CharSequence)和contentEquals(StringBuffer)方法用来比较字符序列的内容是否相等

评论