String
由于其底层数组是private final的,不可改变,且没有提供任何操作其私有数组的方法,所以String字符串是不可改变的。
常量池(与字符串息息相关)
任何好的编程语言的关键目标之一是高效的使用内存,随着应用程序的增长,String字面值占用大量的内存非常常见。对程序而言,全部String字面值中往往有大量的冗余,为了使java更高效地使用内存,JVM留出一块特殊的内存区域,称为“String常量池”。当编译器遇到String字面值时,它检查该池内是否已经存在相同的String字面值。如果找到,则将新的字面值的引用指向现有的String,而不创建任何新的String字面值对象。
字符串创建方式(两种)
字面量赋值的方式
通过new + 构造器的方式
String s = new String(“abc”);
方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”
String字符串的拼接方式(三种)
说明
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中一个是变量,结果就在堆中。
第一种 字面值常量拼接
在常量池中进行,在字符串常量池中查找需要的字符串,如果找到,则指向给String引用,找不到则新建所需字符串,将地址指向给String引用。因为字符串常量池中不能存在相同字符串,每次拼接都要新建字符串,不能在原有字符串上进行修改。
第二种 变量和常量拼接
第三种 变量和变量拼接
字符串使用+拼接时,一旦有变量参与,在堆中,底层会转成StringBuilder 并使用append完成拼接。运算完成后,在转换成String返回。
而且,这个转换后的String存在堆区