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