>

String对象真的可以用==比较吗?

    前一阵子用findbug插件寻找bug,发现了一个很奇怪的bug,内容如下:

    subTargetNode.addText( (null == subTarget || "" == subTarget.trim() ) ? "_blank" : subTarget  ); 字串2

    subTargetNode.addText( (null == subTarget || "" == subTarget.trim() ) ? "_blank" : subTarget  );
[ES] Comparison of String objects using == or != [ES_COMPARING_STRINGS_WITH_EQ]
This code compares java.lang.String objects for reference equality using the == or != operators. Unless both strings are either constants in a source file, or have been interned using the String.intern() method, the same string value may be represented by two different String objects. Consider using the equals(Object) method instead. 字串3

    String不是immutable的类吗?而且还有String Pool,在JVM中相同内容的String对象不是只有一个吗?为什么不可以用==比较相等?东东在网上搜索了一篇文章又查了一下Java Language Specification,有点明白了,

字串2

    那篇文章如下: 字串9

    看例子:例子A:
    String str1 = "java";
    String str2 = "java";
    System.out.print(str1==str2);
   地球上有点Java基础的人都知道会输出false,因为==比较的是引用,equals比较的是内容。不是我忽悠大家,你们可以在自己的机子上运行一 下,结果是true!原因很简单,String对象被放进常量池里了,再次出现“java”字符串的时候,JVM很兴奋地把str2的引用也指向了 “java”对象,它认为自己节省了内存开销。不难理解吧 呵呵
    例子B:
    String str1 = new String("java");
    String str2 = new String("java");
    System.out.print(str1==str2);
     看过上例的都学聪明了,这次肯定会输出true!很不幸,JVM并没有这么做,结果是false。原因很简单,例子A中那种声明的方式确实是在 String常量池创建“java”对象,但是一旦看到new关键字,JVM会在堆中为String分配空间。两者声明方式貌合神离,这也是我把“如何创 建字符串对象”放到后面来讲的原因。大家要沉住气,还有一个例子。

字串9


    例子C:
    String str1 = "java";
    String str2 = "blog";
    String s = str1+str2;
    System.out.print(s=="javablog");
再看这个例子,很多同志不敢妄言是true还是false了吧。爱玩脑筋急转弯的人会说是false吧……恭喜你,你会抢答了!把那个“吧”字去掉你就完 全正确。原因很简单,JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道(我们当然一眼就看穿了,可是Java必须在运行时才知道的,人脑和电脑的结构不同),也就是说str1+str2是在堆里创建的, s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D。
    例子D:
    String s1 = "java";
    String s2 = new String("java");
 
字串6

字串1

[1] [2] [3] [4] 下一页 字串2

作者: 武汉北大青鸟
原载: 武汉北大青鸟鲁广校区 whhpaccp.com
版权所有,转载时必须以链接形式注明作者和原始出处及本声明
高中生入口-武汉北大青鸟
大学生入口-武汉北大青鸟
三校生入口-武汉北大青鸟
去名企入口-武汉北大青鸟

开班时间-武汉北大青鸟

开班类型:
开班时间:
北大青鸟blog
详情请点击在线咨询
想做职业规划请点击
网站导航 | 乘车路线 | 合作网站 | 专题资讯 | 招聘信息 | 联系我们 | 在线留言 | 媒体合作
武汉北大青鸟报名咨询
企业人才预定热线
全国免费咨询电话
就业服务电话
教学质量监督
武汉北大青鸟地址
邮编
027-87807737 / 87807787
027-87807736
800-880-0456(电信用户)
027-87807717 李老师
027-87807727 吕老师
武汉洪山区鲁巷广场武汉数码港3楼(鲁巷广场隔壁)
430074  鄂ICP备06014222号
北大青鸟鲁广校区 武汉IT培训 武汉电脑培训学校 IT培训学校 软件工程师培训 ACCP软件开发