老套的笔试题
在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true。
String s1 = new String("xyz"); String s2 = "xyz"; System.out.println(s1 == s2); System.out.println(s1.equals(s2));
对于这种题,你总能很快的给出标准答案:==比较的是对象地址,equals方法比较的是真正的字符数组。所以输出的是false和true。
上面的属于最低阶的题目,没有什么难度。
现在这种老套的题目已经慢慢消失了,取而代之的是有一些变形的新题目:
String s1 = "aa"; String s2 = "bb"; String str1 = s1 + s2; String str2 = "aabb"; //输出什么呢??? System.out.println(str1 == str2); final String s3 = "cc"; final String s4 = "dd"; String str3 = s3 + s4; String str4 = "ccdd"; //又输出什么呢??? System.out.println(str3 == str4);
难度提升了一些,但思考一下也不难得出答案是false和true。
今天的文章就是以这几个题目展开的。
String对象的创建
先简单看一下String类的结构:
可以发现,String里面有一个value属性,是真正存储字符的char数组。
在执行String s = "xyz";的时候,在堆区创建了一个String对象,一个char数组对象。
如何证明创建了一个String对象和一个char数组对象呢?我们可以通过IDEA的Debug功能验证:
注意看我截图的位置,在执行完String s = "xyz";之后,再次点击load classes,Diff栏的String和char[]分别加了1,表示在内存中新增了一个char数组对象和一个String对象。
现在,我们再来看String s = new String("xyz");创建了几个对象。
从