java中equals和==的使用

时间:2021-07-26 16:21:06

问题由来:今天做了一个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类型)