java中equals和==的使用

来源:互联网 发布:淘宝金牌卖家入口 编辑:程序博客网 时间:2024/06/07 04:56

问题由来:今天做了一个Excel表数据导入数据库的java项目,Excel表中是人员信息,其中一条是性别(sex)。性别(sex)从Excel表存入数据库是这样一个过程:先从Excel表中存入一个String类型的变量sex中,比如男就存“男”,女就存“女”。然后这个属性要存入实体类(user)中。因为实体类(user)中性别(sex)存的是Boolean型的,所以就要解决把性别从String转换成Boolean型的问题。我是这样解决的:用一个Boolean型变量sex1来接这个值。如果前面的string变量sex是“男”的话,sex1就等于true,否则就等于false。这时就涉及到一个问题,判断sex是等于“男”,还是“女”。这也就引出了博文的主体,用==还是equals。

当时我在做这个java程序的时候,我就错误的用成了==,导致的后果是我的所有记录的性别(sex)的属性值都是false。
下面是我当时的错误代码:

boolean sex1;if(sex=="男"){sex1=true;}else{sex1=false;}

我就开始debug,发现程序总是走的else,执行sex1=false;我就想为什么if里面的(sex==“男”)总是不执行呢?原来(sex==“男”)永远也不成立。但是为什么不成立呢?因为这里的sex是一个对象(通过方法String sex=rs.getCell(j++, i).getContents()创建),java会为在内存中为sex分配自己的内存堆(分享一篇博文讲的内存堆),这个内存堆和“男”的内存堆肯定不一样,而sex==“男”就是比较他们的内存堆是否相同,所以这个永远不会成立。

后来我把代码改成下面这样就对了:

boolean sex1;if("男".equals(sex){sex1=true;}else{sex1=false;}

原因也很简单:因为equals方法只是简单的比较二者的内容是否相等(前提是二者的数据类型要一样),显然二者是有可能相等的(我Excel表中性别存的就是“男”和“女”)。

如果还是不太明白我下面有一个更简单易懂的例子,保证一看就会:

public static void main(String[] args) {        // TODO 自动生成的方法存根        /*         *          * 对这个问题做一个分析         * 第一个例子通过new对象的方式创建了s1和s2,这是String作为对象来使用,会给s1和s2分配各自的内存堆,所以s1==s2(用"=="来比较,这种比较是针对两个String类型的变量的引用,即比较内存堆是否相同)打印出来false         * 第二个例子,通过String s3="123"来创建s3和s4,这是String作为引用类型来使用,都是引用了"123"这个字符串,所以第二个例子的s3==s4打印出来是true         * 至于equals嘛,就是简单的比较内容是否相等,所以两次equals打印都是true         */        /**         * 打印结果:         *          * false         * true         * ///////////////////////////         * true         * true         */        /*         * 第一个例子         */        String s1 = new String("Hello");        String s2 = new String("Hello");        System.out.println(s1 == s2);        System.out.println(s1.equals(s2));        /*         * 第二个例子         */        String s3="123";        String s4="123";        System.out.println("///////////////////////////");        System.out.println(s3 == s4);        System.out.println(s3.equals(s4));    }

那么一个新的问题:如果二者数据类型一样的话,是不是可以一直用equals来判断二者是否相等?

这个问题有待考证,但是equals的使用规则有一点是可以确定的—二者的数据类型必须一样。

还有一个问题:数据类型不同的两个变量用==,能否判断相等?

这个问题经过考证可以,==成立的规则是:只要两个数据的引用堆一样,就返回true,二者的数据类型可以不同(当时测试的时候是一个String类型和一个byte类型)

原创粉丝点击