Java课上讲过equals和==的区别,但在今天编码时实际碰到时,才引起重视。出问题的代码如下:
//if(position_s!="" && (team!="" || former_teams!="")){
if(!position_s.equals("") && (!team.equals("")||!former_teams.equals(""))){
count++;
bfw_player.write(name + "\t" + id + "\t" + position_s + "\t" + team
+ "\t" + former_teams + "\t" + player_statistics + "\n");
}
在if语句判断中,String 类型的 position_s 可能值为空“”, 而注释中的写法错误。主要是== 符号比较的是两个字符串的引用地址(内存地址),这样的话,注释中的if判断条件总是为真(因为两个比较对象的引用地址都不一样); equals方法比较的是两个字符串的字符串序列值,只要两个比较的两个字符串的表面字母序列一致,就相等。
这里具体的背景知识,就牵扯到了String对象以及字符串缓冲池的概念。参考博客:Java中equals和==的区别 java的String类,equals函数和比较操作符==的区别
public class Test{
public static void main(String[] argStrings){
String s1 = "hello";
String s2 = "hello";
String s3 = "world";
String s4 = new String("world");
String s5 = "HI";
String s6 = s5.toUpperCase();
String s7 = s5.toLowerCase();
if(s1==s2)
System.out.println("s1==s2");
else
System.out.println("s1!=s2");
if(s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
s4 = s4.intern();
if(s3==s4)
System.out.println("s3==s4");
else
System.out.println("s3!=s4");
if(s3.equals(s4))
System.out.println("s3 equals s4");
else
System.out.println("s3 not equals s4");
if(s5==s6)
System.out.println("s5==s6");
else
System.out.println("s5!=s6");
if(s5==s7)
System.out.println("s5==s7");
else
System.out.println("s5!=s7");
}
}
注释行注释时,输出结果为
s1==s2
s1 equals s2
s3!=s4
s3 equals s4
s5==s6
s5!=s7
注释行没有注释时,输出结果为
s1==s2
s1 equals s2
s3==s4
s3 equals s4
s5==s6
s5!=s7
输出结果的差异在于:字符串缓冲池的作用。 s2 赋值的时候,先检查字符串缓冲池中是否已经有值为"hello"的字符串对象。如果有就将该对象赋值给s2,这样就能节约内存。 s4的赋值的时候,采用new的形式,这样就显示的说明,需要new一个新对象给s4, 而不是在字符串缓冲池中找一个值相等的对象给s4。 intern函数的作用就是,将值相同的String对象,都等同为字符串缓冲池中一个对象,这样节约内存 ------ 比较的判断基础是:==判断的是对象的引用(内存地址),equals判断的是字符串的表面值序列。
s5、s6、s7的比较,主要是由于 toUpperCase() 和 toLowerCase() 方法返回一个新的String对象,它将原字符串表示字符串的大写或小写形式;但是要注意:如果原字符串本身就是大写形式或小写形式,那么返回原始对象。