Java中String类型和StringBuilder类型的总结


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创建新对象时,常量池的作用

创建对象时常量池、堆、栈的不同的作用示意图

  • 内存中,对象的引用是存在栈中,对象存储在常量池和堆中,常量池中的对象和堆中的对象的地址空间是完全不一样的。

String类型的不可变性

public static void main(String[] args){
    //String的不可变性:只有通过赋值,字符串才会发生改变
    //String对象一旦被创建,则不能修改,是不可变的
    //所谓的修改其实是创建了新的对象,所指向的内存空间不变
    String s1 = "imooc";    //在常量池中生成一个imooc对象,在栈中会有一个引用指向imooc对象
    s1 = "hello," + s1; //在常量池中又生成了新的hello imooc对象,把s1的引用指向新的hello imooc对象,原先的imooc引用被废除掉了.
    System.out.println("s1=" + s1);
}
  • 通过赋值操作对s1引用的值进行了改变,s1不再指向imooc所在的内存空间,而是指向了”hello,imooc”;
  • 注意,在做字符串连接处理得时候并没有改变引用的方向,只是在指向引用的时候改变了引用指向的对象;
  • 以上操作都是在常量池中完成的。

修改String类型常量池对象时,内存中发生的操作示意图

字符串StringBuilder

  • StringStringBuilder的区别:String具有不可变性,而StringBuilder不具备;
  • 建议:当频繁操作字符串时,使用StringBuilder。使用String类,频繁操作字符串时,会产生很多的中间变量与常量池垃圾,因此要采用StringBuilder类;
  • StringBuilderStringBuffer两者基本相似,StringBuffer是线程安全的,StringBuilder则没有,所以StringBuilder性能略高。一般都是单线程程序,所以一般都是用StringBuilder
  • StringBuilder不会创建新的对象,因此可以大大提升性能。

文章作者: 南航古惑仔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 南航古惑仔 !
  目录