目录
String
String的不可变性
常用方法
StringBuilder
String
String的不可变性
- String 对象一旦被创建,则不能修改,是不可变的
- 所谓的修改其实是创建了新的对象,所指向的内存空间不变
- 用String操作字符串时,会产生很多中间变量,也会产生很多在常量池中废弃的数据
- 应用场景:如果有少量字符串操作,可以使用String
- String类型也有常量池的概念
常用方法
- 方法equels()比较两个字符串内容是否相等,返回值是boolean类型的值;
- 方法compareTo()比较两个字符串大小,返回值是int类型的值;
public class StringDemo4 {public static void main(String[] args){// String 的不可变性// String 对象一旦被创建,则不能修改,是不可变的// 所谓的修改其实是创建了新的对象,所指向的内存空间不变String s1 = "imooc";// s1不再指向imooc所在的内存空间,而是指向了"hello,imooc"
// s1 = "hello," + s1;String s2 = "hello," + s1;System.out.println("s1 = " + s1);System.out.println("s2 = " + s2);String s3 = new String("hello, imooc");// s3指向堆中的空间,// s3.substring(0, 5)得到的是hello,存储在常量池中,然后将常量池的hello输出System.out.println("子串:" + s3.substring(0, 5));System.out.println("s3 = " + s3);// concat,是把s4和s1的内容连接起来,然后把连接后的值输出,但是连接操作并没有改变s1和s4的值,s4的值还是hi,String s4 = "hi, ";System.out.println("s4.concat(s1):" + s4.concat(s1));System.out.println("s4: " + s4);}
}
输出
s1 = imooc
s2 = hello,imooc
子串:hello
s3 = hello, imooc
s4.concat(s1):hi, imooc
s4: hi,
例子:关于常量池
- String str1 = "imooc";,在常量池放入"imooc",在栈空间给str1开辟一个空间,str1指向常量池的"imooc"
- String str2 = "imooc";,因为常量池中已经存在"imooc",无需再放入,在栈空间给str2开辟一个空间,所以直接让str2指向过去,即此时str2和str1指向的同一块空间
- String str3 = new String("imooc");,这边用了new关键字,在堆空间开辟一块空间,在栈给str3开辟空间,让str3指向堆中的空间,故和str1、str2不指向同一块空间
- String str4 = new String("imooc");,这边用了new关键字,在堆空间新开辟一块空间,在栈给str4开辟空间,让str4指向堆中的空间,故和str3不指向同一空间,每new一次,堆中就会开辟一个新的空间。
String str1 = "imooc";
String str2 = "imooc";
String str3 = new String("imooc");
String str4 = new String("imooc");
StringBuilder
- String具有不可变性,用String操作字符串时,会产生很多中间变量
- 也会产生很多在常量池中废弃的数据,使用StringBuilder可以避免这种情况。
- String比StringBuilder的执行效率要低,因为在运行时产生一些String对象,这样会耗费一些时间
- StringBuilder VS StringBuffer,二者基本相似,StringBuffer是线程安全的,StringBuilder则没有,所以性能略高。在执行速度熵:StringBuilder>StringBuffer
- 应用场景:
- 如果有少量字符串操作,可以使用String,否则使用StringBuilder
public class StringBuilderDemo1 {public static void main(String[] args){// 定义一个字符串"你好"StringBuilder str = new StringBuilder("你好");// 在"你好"后面添加内容,将字符串变成"你好,imooc"// 在原来的对象上进行更改,没有生成新的对象,也没有产生常量
// str.append(',');
// str.append("imooc!");
// System.out.println(str);System.out.println("str = " + str.append(',').append("imooc!"));System.out.println("str = " + str);// 将字符串变成"你好,iMOOC!"/*** 两种方法:* 1、使用delete方法删除mooc,然后再插入MOOC* 2、使用replace方法直接替换*/
// System.out.println("str = " + str.delete(4, 8).insert(4,"MOOC"));System.out.println("str = " + str.replace(4, 8, "MOOC"));//在字符串"你好,iMOOC"中去除"你好"并输出, substring的返回值是String类型System.out.println(str.substring(0, 2));}
}
输出:append、insert、delete等都是在现在的对象上操作的,不会产生新的对象
str = 你好,imooc!
str = 你好,imooc!
str = 你好,iMOOC!
你好
参考: 慕课网-Java工程师