String 类型字符串存储和拼接

来源:互联网 发布:蜂窝网络有电信的吗 编辑:程序博客网 时间:2024/06/08 16:52
链接:https://www.nowcoder.com/questionTerminal/f06ee75317c44b44b43b10b1ffc866bd
来源:牛客网


 String str1="hello";     String str2="he"+"llo";   String str3="he"+new String("llo"); 

str1==str2 true

str1==str3 false

这个问题我试着回答一下,同时也是相互学习。String str1= "hello", Stringstr2="he"+"llo";之所以str1==str2返回true是因为两者都是在字符串常量池中(由于初始化就会在此区域分布内存)而常量池中的有个与栈区类似的特性,就是当str2指向的常量在常量区已存在时,他不会创建新的内存空间来存此常量,而是指向已有常量的内存(应该是以此节约空间),此时str1与str2这两个引用变量的值都是存"hello"的内存空间地址,但是Stringstr3= "he"+a;String a="llo";时str1==str3返回的为false,是因为:str1指向的hello在编译期一如既往的还是分配在常量区内,a指向的llo也在常量区,虽然str3也是初始化但是编译器无法判断a这货到底是什么个情况,进而不会将str3的等号右侧声明在常量区内,而是在通过构造时在堆区中的非常量池外的内存中声明,至此str3与str1不止是分配内存的时期不同(一个在编译期,一个在运行期)而且在内存空间的区域也不同,上面最高票答案只区分了时间没区分空间。