本帖最后由 不胖的胖子 于 2013-5-30 11:35 编辑
1,问题最早的来源
那天在20届交流区,看到一兄弟问一个字符串的问题,刚开始以为很简单。
最后仔细看时,才发现问题很大。来看下那位兄弟的代码:- public class StringTest
- {
- public static void main(String[] args) {
- String s1 = "a";
- String s2 = s1 + "b";
- String s3 = "a" + "b";
- System.out.println(s2 == "ab");
- System.out.println(s3 == "ab");
- System.out.println(s2.equals(s3));
- System.out.println(s2 == s3);
-
- }
- }
复制代码 再来看看输出结果:- ---------- 运行java程序 ----------
- false
- true
- true
- false
- 输出完成 (耗时 0 秒) - 正常终止
复制代码 2,我的问题
我清楚的知道,s2 s3 的字符串字面值都是"ab",通过 == 其实想比较的是它们是否指向同一对象。
s2.equals(s3)---->比较字符串内容,返回true 没问题
s2 == s3 ---->比较它们是否为同一对象,返回false。
我从资料中查到的,+ += 这两个操作符被String唯一重载了。(java是不允许程序员重载操作符的)
s3= "a" + "b"; 这一句实际是调用StringBuilder的append方法将两个字符串连接的。s3最后和 "ab" == 比较表明指向同一对象
s2= s1 + "b"; 这一句完成后 s2 字符串内容也是"ab",同样是用StringBuilder连接。 s2 最后 和 "ab" == 比较表明不是同一对象
我的疑问就是:在使用 + 操作符操作字符串时,是否参与的只有字符串常量时才不会新建空间产生对象(对应s3这种情况)
s2 = s1 + "b" 中有引用变量 s1,这是否是导致 s2 == s3 --->false 的原因了??
希望大家能帮下忙
3 个人了解到的一些
上次有一位兄弟问道:
String s1 = "abc"; ---> 内存中一个对象
String s2 = new String("abc"); --->内存中两个对象
为什么?
当时也没有弄明白。
今天把老毕视频又找出来看了看,他强调的是知道如何操作字符串(StringAPI各种方法)。并没有解释太多。
最后看了下API,关于构造方法 String(String original)。
当我们传入参数 "abc" 这就已经在内存中产生一个对象了。再使用关键字 new 新建对象,其实是 "abc"的一个副本,但是还是会新建空间创建对象。
参考书目: Core Java(卷一) (8版) Thinking in Java(4版) Java编程语言(3版) Java疯狂讲义(不知道哪版)
|