目录
字符串常量池
池,是一种在编程中提升效率的方式。
String对象创建
直接用字符串常量赋值
public static void main(String[] args) {
String str = "abcde";
String str2 = "abcde";
String str3 = "hello";
System.out.println(str==str2);
}
具体创建过程:
进入String的源码
有这两个成员变量,一个是由数组,还有一个是哈希值(暂时不管)。
字符串常量赋值时,
step1:在字符串常量池中通过以上一系列操作找有没有该字符串
step2:若有,则指向原来旧的字符串即可
若无,创建一个新的
这样大大提高了存储效率,节省了空间。
通过new创建String类对象
public static void main(String[] args) {
String s1 = new String("abcde");
String s2 = new String("abcde");
System.out.println(s1 == s2);//比较的是地址
System.out.println(s1.equals(s2));//比较的是内容
}
二者虽然内容相同,但是存储的地址却不一样。
通过new创建对象时:
step1:只要new一次,就创建出一个对象
step2:在字符串常量池中通过上面一些列操作找有没有相同的字符串
step3:若有,则指向相同的字符数组
若无,则创建出新的字符数组
以上都是字符串的相关操作。若是想把一个字符数组放到字符串常量池中去,可以使用intern方法。
intern()——手动添加到字符串常量池
public static void main(String[] args) {
char[] arr = {'a','b','c','d'};//字符数组,只是在堆区中
String str = new String(arr);//此时还没有到字符串常量池中
//只是把数组转成字符串了
str.intern();//此时字符串存放到字符串常量池中了
//intern()返回值为boolean类型
System.out.println(str);
}
字符串的不可变性
以下是String的源码的一部分
上图表明
1.String类是不可被继承的
2.其中的数组名value是不可修改的。代表不能引用(指向)其他数组,但是其中的内容却是可以改变的。
3.String类的方法中,有关字符串操作的相关方法都是新创建了一个对象。所以原字符串没有被改变。
StringBuffer与StingBuilder的区别
相同点:
1.都是字符串类
2.所创建的对象可以进行修改,即在原对象上进行操作。
不同点:
StringBuffer同步处理,属于线程安全操作。可以理解为同一时刻只能它就只能处理一件事。
StringBuilder没有采用同步处理,不属于线程安全操作。
有什么错误请在评论区指出。