方法区中有一个常量池,常量池中存放字符串常量String
1.String s1="HelloWorld";//此处和"Hello"+"World"是相同的,会拼起来当成一个串放入常量池
当用以上方式创建实例对象时,会首先去常量池中查找,如果有指向引用,没有则开辟空间存储常量,并指向引用
2.String s5=new String("HelloWorld");
当用new创建实例对象时,会在堆内存中开辟空间存放"HelloWorld",然后再去常量池中查看是否有"HelloWorld",
如果有则与堆内存的"HelloWorld"建立关系,没有则创建之后再建立关系,此时输出s1==s5也是false,因为指向不同
3.而String s2="Hello",String s3="World"都会在常量池中开辟空间存放字符串
4.当需要拼串时,也就是s4=s2+s3,会在堆内存中开辟空间存放新的字符串,指向s4
双等号比较的是两个引用的内存地址值:所以s1和s4不相等
|