目录
StringBuffer类和StringBuilder类介绍
StringBuffer类和StringBuilder类的更新原理
StringBuffer类和StringBuilder类的常用方法
String类基本介绍
String对象用来保存字符串,字符串即是用 " " 括起来的字符序列。String类是开发中经常使用的类,肯定非常重要啦,所以到这章的时候大家一定要认真学啊。
String类的两种实例化方式
public class String2 {
public static void main(String[] args) {
//直接赋值
String str = "小黄";
//调用构造方法赋值
String str1 = new String("小黄");
}
}
方式1:直接赋值:直接把字符串常量赋给字符串对象;
方式2:调用String类提供的构造方法(public String(String str))。
说明:两种实例化方式的区别:
直接赋值:在静态常量池中创建“小黄”的数据空间,str对象直接指向该数据空间。其实就是创建了一个String类的匿名对象;引用最终指向常量池;
调用构造方法:同样在常量池创建了数据空间,在堆中创建了value数组(该数组为char数组),str对象先指向了该数组,然后该数组又指向了常量池中的空间。引用最终指向堆。
注意:系统会先检查常量池是否有该数据空间,如果没有,就创建一个,如果有,就用引用指向现有的数据空间。示例:
public class String2 {
public static void main(String[] args) {
//直接赋值
String str = "小黄";
String str3 = "小黄";
String str4 = "小古";
//调用构造方法赋值
String str2 = new String("小黄");
//进行字符串的比较
System.out.println(str == str3);
System.out.println(str == str2);
System.out.println(str == str4);
}
}
运行结果:
true
false
false
说明:1:“==”比较的是对象的地址;
2:当常量池已经存在”小黄“的数据空间时 ,str3会直接指向已有的内存空间;所以str和str3的地址相同;
3:当常量池不存在”小古“的数据空间时,会创建一个来存放,新创建的内存空间地址肯定和”小黄 “的地址不同;
4:调用构造方法时,new关键字表示开辟新的内存空间,所以地址和常量池的地址不同;
String类特点
1:String类中存在一个value数组用于字符串存储(private final char[] value),由于该数组是final类,所以它的地址不能修改,它的地址一旦被修改了,原来的字符串就会废弃,并创建一个新的内存空间存储修改后的字符串;并更改原来引用的指向新的数据空间。
public class String3 {
public static void main(String[] args) {
//对字符串的内容进行修改,str引用会指向新的修改后的内容
String str = "小黄";
str = "小红";
//输出的字符串是修改后的字符串
System.out.println(str);
//对字符串进行拼接,str2引用会指向新的拼接后的内容
String str2 = "小杨";
str2 += str;
//输出的字符串是拼接后的字符串
System.out.println(str2);
}
}
代码说明:1):当修改字符串内容时,value数组的指向变为了修改后的字符串,地址改变了;
2):当增加(或减小)字符串的长度时,value的指向也变为了增删后的字符串,地址也改变了;
2:字符串内容和长度都不可变,一旦改变,就会重新分配内存地址;
3:String对象可以串行化(可以在网络上传输);
4:String对象可以进行比较。
字符串拼接
方式1:直接拼接
String str = "小红" + "小黄" + "小明"
System.out.println(str);
说明:什么的代码生成几个对象呢?
答案:只生成一个:无论拼接多少个字符串,编译器都会直接生成拼接后的字符串;
方式2:先创建对象再拼接
public class String4 {
public static void main(String[] args) {
String str1 = "小黄";