String对象创建过程
方式一:
String s1 = "abc";
- 如果常量池中没有"abc",会先在常量池中创建“abc”,并指向改地址。如果常量池里有abc,就直接指向该地址。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/da7db42f12b9caa5b1b7f9bf3152f5c4.png)
方式二:
String s2 = new String("abc");
- 第一次创建,常量池中没有abc先在常量池中创建abc,然后在堆中创建内存并指向常量池。如果常量池中有会直接使用
- 所以方式二会创建两个(或一个)对象,一个在常量池中,一个在堆内存中
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7fb0fb5ff63c6cc134952a715a1f7b20.png)
顺便说一个字符串不可变问题:
String s1 = "hello";
s1 = "world";
- 每次赋值都是创建一个对象并指向该对象,以前的对象还在内存中
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9f3e12c2401b54048a6fb510b0205425.png)