目录
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工程师