java 陷阱2 动物状元

Java代码


下面的java程序打印结果是什么?Java代码

public class AnimalFarm{
public static void main(String[] args){
final String pig = "length: 10";
final String dog = "length: "+pig.length();
System.out.println("Animal are equal:" +pig == dog);
}
}


对这个程序进行表面分析后,可能会认为它应该打印Animal are equal: true。毕竟,pig和dog都是final的String类型变量,他们都被初始化为字符串序列“length:10”。换句话说,被pig和dog引用的字符串是且永远是彼此相等的。然而,==操作符并不测试两个对象是否相等,它测试的是两个对象的引用是否相同。在本例中,他们并非引用到同一个对象。

String类型的编译期常量是内存限定的,任何两个String类型的常量表达式,如果指定的是相同的字符序列,那么他们就用同一个对象引用来表示。如果常量表达式来初始化pig和dog,那么他们确实会指向相同的对象,但是dog并不是常量表示式初始化的,既然语言已经对在常量表达式中允许出现的操作做了限制,而方法调用又不在其中,那么,这个程序就应该打印 Animal are equal: false。

实际上仍然不对,运行该程序,就会发现它打印的只是false,并没有其他的东西。它没有打印Aniaml are equal:,它怎么不打印这个字符串常量呢?毕竟要打印它才是正确的,+操作符在这里出现了问题,不论式用着将加法还是字符串链接操作,它都比==操作符优先级高,应此,println方式的参数实际上式按照下面的方式计算的:

Java代码
System.out.println(("Animal are equal:"+pig)==dog);  


这个布尔表达式的值当然是false有一个能够避免此类错误的方式,在使用字符串连接操作符时候,总是将不平凡的操作时用括号括起来。

如果可以的话,你的代码应该很少依赖于字符串常量的内存限定机制。

在比较对象引用的时候,应该优先使用equals方法而不是==操作符,除非需要比较的是对象的标识而不是对象的值。很明显,在按照以上原则修改之后,它将打印true:


Java代码
System.out.println("Animal are equal:" +pig.equals(dog)); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值