首先我们要明确String本质上是final
-
String s1 = “a”; 此时s1指的是常量池中的"a"
-
String s2= s1 + “b”; 此时s2指的是堆里面的"ab",原来的"a"字符串对象已经丢失,在堆空间里面产生一个字符串s1+“b”。这样是会降低效率,尤其是在循环中。
-
String s3 = “ab”; 此时s3指向的是常量池中的"ab"。
-
String s4= “a”+“b” ;此时s4指向已经创建好的字符串“ab”.
-
String s5 = s1.intern; 堆空间的s1对象是在调用intern()之后,会将常量池中已经存在的"ab"字符串
赋值给s4.
这个是我在学习尚硅谷的时候截下来的图,很明显这个似乎就跟我们学习jdbc工具类的差不多,用户和密码等在声明的时候用的是final。
因此很容易看清楚:当我们直接用String s = “a”; 的时候指向的是常量池,当我们在后面加上变量"i"的时候会重新指向堆内存里面.
在我们使用new String去声明的时候指向的是堆内存中的数据。