本文最后更新于 294 天前,其中的信息可能已经有所发展或是发生改变。
字符串
特点
- 引用数据类型
- 不可变性,
Java中的String是不可变的,任何对String对象的修改都会新建一个String对象
java9之前底层是字符数组,java9及之后底层是字节数组,节省内存资源
- 是线程安全的,多个线程共享同一个字符串对象
创建
| 方法 |
描述 |
String str = "test" |
str变量指向"test"字符串,如果字符串常量池中不存在"test",会在字符串常量池中创建一个String对象 |
String str = new String("test") |
在堆内存中创建一个String对象,如果字符串常量池中不存在"test",会在字符串常量池中创建一个String对象 |
方法
查询
| 方法 |
描述 |
char charAt(int index) |
返回指定索引的字符 |
int length() |
返回字符串长度 |
int indexOf(String str,[int formIndex]) |
全局搜索返回子串第一次出现的索引或从指定位置开始搜索,不存在返回-1 |
int lastIndexOf(String str,[int formIndex]) |
全局搜索返回子串最后一次出现的索引或从指定位置反向开始搜索,不存在返回-1 |
比较
|int compareTo(String anString)|按字典顺序比较两个字符串,相同返回,小于返回-1,大于返回1|
|boolean contais(CharSequence sequence)|检查字符串是否包含指定的字符序列|
|boolean startWith(String prefix)|判断字符串是否以指定前缀开始|
|boolean endWith(String suffix)|判断字符串是否以指定后缀结束|
|boolean equlas(Object anObject)|比较两个字符串是否相等|
|boolean equalsIgnoreCase(Object anObject)|比较两个字符串是否相等,忽略大小写|
操作
| 方法 |
描述 |
String subString(int start,[int end]) |
返回指定索引开始的子字符串,或指定范围内的子字符串 |
String replace(String target,String replacement) |
返回新字符串,出现target子串的位置替换为replacement子串 |
String trim() |
返回新字符串,去除前后空格 |
String toLowerCase() |
返回新字符串,所有字符转换为小写 |
String toUpperCase() |
返回新字符串,所有字符转换为大写 |
String[] split(String regex) |
使用正则表达式将字符串分解为子串,返回一个字符串数组 |
String concat(String str) |
返回新字符串,原字符串与指定字符串进行拼接,会复用字符串常量池,而+=拼接每次都会创建新的字符串对象 |
String intern() |
将字符串添加到字符串常量池中并返回 |
byte[] getBytes() |
将字符串拆分为字节数组 |
char[] toCharArray() |
将字符串拆分为字符数组 |
静态方法
| 方法 |
描述 |
static String format(String str,...place) |
通过占位符格式化字符串,%d数值类型,%s字符串 |
static String valueOf() |
将基本数据类型或对象转换为字符串,对象转换的字符串为对象toString()输出的值,如果对象为null,返回字符串"null" |
static String join(CharSequence delimiter,CharSequence... elements) |
通过分隔符拼接字符或字符串,也可以传入字符串数组或者是字符串集合 |
字符串常量池
- 为了提高性能,
JVM设置了字符串常量池(Spring pool)
- 创建
Spring对象时,JVM会检查常量池是否存在该Spring对象,如果存在则返回已有对象,如果不存在则创建一个新的Spring对象并放入字符串常量池
StringBuffer与StringBuilder
特点
- 可变字符串,不需要像
String对象每次修改都要重新创建一个新的对象
- 位于
java.lang包
- 底层使用字符数组(
char[])实现
比较
|
.StringBuffer |
StringBuilder |
| 性能 |
低 |
高 |
| 线程安全 |
安全 |
不安全 |
| 场景 |
多线程,要保证线程安全的场合 |
单线程,性能要求较高的场合 |
方法
| 方法 |
描述 |
StringBuiler append(String str) |
将指定的字符串拼接到StringBuiler对象的末尾 |
StringBuilder insert(int offset,String str) |
在指定位置插入字符串 |
StringBuilder delete(int start,int end) |
删除[start,end)区间的字符 |
String toString() |
将StringBuilder转换为String对象 |
int capacity() |
返回当前StringBuilder的容量 |
void setLength(int newLength) |
设置StringBuilder的新长度,如果新长度小于当前长度,会截断字符串,如果新长度大于当前长度,会使用\0填充 |