String类的常用方法
方法 |
说明 |
int length() |
返回当前字符串长度 |
int indexOf(int ch) |
查找字符在该字符串中第一次出现的位置 |
int indexOf(String str) |
查找str字符串在该字符串中第一次出现的位置 |
int lastIndexOf(int ch) |
查找ch字符在该字符串中最后一次出现的位置 |
int lastIndexOf(String str) |
查找str字符串在该字符串中最后一次出现的位置 |
String subString(int beginIndex) |
获取从beginIndex位置开始到结束的子字符串 |
String subString(int beginIndex, int endIndex) |
获取从beginIndex位置开始到endIndex位置的子字符串 |
String trim() |
返回去除了前后空格的字符串 |
boolean equals(Object obj) |
将该字符串与指定对象比较,返回true或false |
String toLowerCase() |
将字符串转换为小写 |
String toUpperCase() |
将字符串转换为大写 |
char charAt(int index) |
获取字符串中指定位置的字符 |
String[] split(String regex,int limit) |
将字符串分割为子字符串,返回字符串数组 |
byte[] getBytes() |
将该字符串转换为byte数组 |
利用String创建新对象时,常量池的作用
![创建对象时常量池、堆、栈的不同的作用示意图](/1.png)
- 内存中,对象的引用是存在栈中,对象存储在常量池和堆中,常量池中的对象和堆中的对象的地址空间是完全不一样的。
String类型的不可变性
public static void main(String[] args){
String s1 = "imooc";
s1 = "hello," + s1;
System.out.println("s1=" + s1);
}
- 通过赋值操作对s1引用的值进行了改变,s1不再指向imooc所在的内存空间,而是指向了”hello,imooc”;
- 注意,在做字符串连接处理得时候并没有改变引用的方向,只是在指向引用的时候改变了引用指向的对象;
- 以上操作都是在常量池中完成的。
![修改String类型常量池对象时,内存中发生的操作示意图](/2.png)
字符串StringBuilder
String
和StringBuilder
的区别:String具有不可变性,而StringBuilder
不具备;
- 建议:当频繁操作字符串时,使用
StringBuilder
。使用String
类,频繁操作字符串时,会产生很多的中间变量与常量池垃圾,因此要采用StringBuilder
类;
StringBuilder
和StringBuffer
两者基本相似,StringBuffer是线程安全的,StringBuilder
则没有,所以StringBuilder
性能略高。一般都是单线程程序,所以一般都是用StringBuilder
。
StringBuilder
不会创建新的对象,因此可以大大提升性能。