String
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
==比较的是两个对象的引用。s1、s2、s3均为新创建的的String对象,为什么打印出true、false?
一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new出来的对象和数组。然而除此之外还有一块区域叫做常量池。
像String s1 = "abc";
这样申明的字符串对象的值就是存储在常量池中。
当创建String s1 = "abc";
对象后,"abc"就存储到了常量池(也可叫做字符串池)中,当我们创建引用String s2 = "abc";
时,Java底层会优先在常量池中查找是否存在"abc",如果存在则让s2指向这个值,不会重新创建;如果常量池中没有则创建并添加的池中。
网友评论