字符串
特点
- 引用数据类型
- 不可变性,
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 填充 |