1、现象:问题描述
在业务处理中需要将数据库中的标志位转换为boolean类型:“1”转换为true,其它值转换为false,但在系统运行过程中,该方法有时转换错误。
2、关键过程:根本原因分析
查看实现代码如下:
public final boolean convertFlagToBoolean(String flag)
{
return flag == “1”;
}
发现flag == “1”存在问题,==是用来判断两个变量指向的对象是否是同一个对象,即物理上相等,方法的实际意图只要flag的内容是”1”即可,不一定要是一个对象。
为什么有时转换正常有时错误呢?原来Java中默认字符串对象是不可变的,JVM会维持一个常量池来避免在堆内存中产生重复的String对象。但如果是通过new 方式来构造一个字符串,则JVM是会重新生成String对象,则flag == “1”就会得到false。上面的转换方法传入的String非new方式生成的情况下工作正常。
3、结论:解决方案及效果
使用String对象的equals方法比较两个字符串相等。
4、经验总结:预防措施和规范建议
在使用字符串比较时,需要熟悉Java中对字符串对象的特殊处理和两种对象比较方式的区别:
1)==是用来判断两个变量指向的对象是否是同一个对象,即物理上相等;
2)equals()方法是判断两个变量指向的对象在逻辑意义上是否相等.