String
一、String的结构类图
二、String的基本概念
1.String对象用于保存字符串,也就是一组字符的序列。
2.字符串常量对象是用双引号括起来的字符序列。
3.字符串的 字符使用unicode字符编码,一个字符占两个字节。
4.String类实现了Serializable接口,可以实现串行化,即可以在网络传输。实现了Comparable接口,可以进行比较。
5.String类被final修饰,不能被继承。
6.String类中有一个private final char[] value属性,用于存放字符串的内容。value被final修饰,不可以被更改,即value不能指向新的地址,但是单个字符的内容可以被修改。
三、String的两种创建方式
1.直接赋值 String s = ”zhang“;
先从常量池查找是否有zhang数组空间,如果有直接指向,如果没有则重新创建然后指向。最终s指向的是常量池的空间地址。
2.调用构造器 String s2 = new String(”zhang“);
现在堆中创建对象,里面有value属性,value属性指向常量池的zhang数组空间。如果常量池没有zhang则重新创建然后指向,如果有,直接通过value属性指向。最终s2指向的是堆中的空间地址。
四、字符串特性
1.String是一个final类,代表不可变的字符序列。
2.字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的。
五、String类常用方法
StringBuffer
一、StringBuffer的结构类图
二、StringBuffer的基本概念
1.StringBuffer的直接父类是AbstractStringBuilder。
2.StringBuffer实现了Serializable接口,即StringBuffer对象可以串行化。
3.在父类中AbstractStringBuilder的char[] value没有被final修饰,则value存放的字符串内容存放在堆中。
4.StringBuffer类被final修饰,不能被继承。
三、String和StringBuffer的区别
1.String保存的是字符串常量,里面的值不能被更改每次String类的更新实际上就是更改地址,效率较低。
2.StringBuffer保存的是字符串变量,里面的值可以更改。每次StringBuffer的更新实际上可以更新内容。不用每次更新地址,效率较高。
四、StringBuffer的四种构造器
五、String和StringBuffer的转换
六、StringBuffer常用方法
七、测试题
StringBuilder
一、结构类图
二、StringBuilder的基本概念
1.一个可变的字符序列,此类提供了一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果在单线程情况下,使用StringBuilder会比StringBuffer效率更高。
2.在StringBuilder上的主要操作是append和insert方法,可重载这些方法以接受任意类型的数据。
3.StringBuilder继承AbstractStringBuilder类。
4.实现了Serializable接口,说明StringBuilder的对象可以串行化(对象可以网络传输,保存到文件)
5.StringBuilder被final修饰,不能够被继承。
6.StringBuilder对象字符序列仍然存放在父类的char[] value,因此字符序列在堆中。
7.StringBuilder的方法没有做互斥的处理,即没有synchronized关键字,因此在单线程情况下使用。
三、String、StringBuffer、StringBuilder的区别比较
1.StringBuffer和StringBuilder非常类似,均代表可变的字符序列,而且方法也一样。
2.StringBuffer 可变字符序列,效率较高(增删),线程安全。
3.StringBuilder 可变字符序列,效率最高(增删),线程不安全。
4.String 不可变字符序列,效率较低,但是复用性较高。
String s = ”hello“创建了一个字符串,s += ”123“,实际上原来的hello字符串已经丢弃了,现在又产生了一个字符串”hello123“,如果多次执行这些改变内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作存在循环中,会极大影响程序性能。因此,对String做大量修改时,不要再使用String,而是把String转换成StringBuffer或StringBuilder对象,单线程使用StringBuilder,多线程使用StringBuffer。