一、String
1 String的两种实例化方式
1.1 字面量定义
String s = "javaEE";
- 通过字面量定义的方式所声明的字符串,都会定义在方法区中的字符串常量池中,变量s直接保存常量池中字符串常量的地址值。
1.2 通过new + 构造器
String s = new String("javaEE");
- 通过new + 构造器方式所声明的字符串,会在堆和常量池中都创建对象,变量s中保存堆中变量的地址值,堆中的变量保存常量池中字符串常量的地址值。
2. String类的细节阐述
- String声明为final的,不可被继承。
- String实现了Serializable接口,表示字符串是支持序列化的;实现了Compareable接口,表示String可以比较大小。
- String内部定义了final char[] value用于存储字符串数据
- String代表不可变的字符序列,简称:不可变性
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 当对现有的字符串进行连接操作时,也需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 当调用String的replace()方法修改指定字符或字符串时,也需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 字符串的拼接
- 常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量。
- 只要有其中一个是变量,结果就在堆中。
- 如果拼接的结果调用intern()方法,返回值就在常量池中。
3. String的常用操作
3.1 字符串的长度
int length();
3.2 得到索引处的字符
char charAt(int index);返回字符串索引处的字符,返回值为char类型
3.3 判断是否为空
boolean isEmpty();
3.4 比较字符串内容
boolean equals(Object obj);
3.5 获取字符串的子串
String substring(int beginIndex, int endIndex);
3.6 切分字符串为数组
String[] split(String regex);返回一个数组,根据给定正则表达式的匹配拆分此字符串。
二、StringBuffer
1. StringBuffer的实例化方式
StringBuffer stringBuffer = new StringBuffer("javaEE");
2. 细节阐述
- StringBuffer:可变字符序列;线程安全的的,效率低;底层用char[]存储
3. 常用操作
3.1 增加
append(xxx);
3.2 删除
delete(int start, int end);
3.3 修改
setCharAt(int n , char ch);/replace(int start, int end, String str);
3.4 查询
charAt(int n);
3.5 插入
insert(int offset, xxx)
3.6 长度
int length();
3.7 反转
StringBuffer.reverse();
三、StringBuilder
- StringBuilder的操作方法和StringBuffer一样,两者唯一的区别就是,StringBuffer是线程不安全的,效率高。