Java中equals和== 的区别

来源:互联网 发布:mac idea groovy 配置 编辑:程序博客网 时间:2024/05/21 08:41

         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==s2s1 equals s2s3!=s4s3 equals s4s5==s6s5!=s7
      注释行没有注释时,输出结果为
s1==s2s1 equals s2s3==s4s3 equals s4s5==s6s5!=s7

      输出结果的差异在于:字符串缓冲池的作用。 s2 赋值的时候,先检查字符串缓冲池中是否已经有值为"hello"的字符串对象。如果有就将该对象赋值给s2,这样就能节约内存。 s4的赋值的时候,采用new的形式,这样就显示的说明,需要new一个新对象给s4, 而不是在字符串缓冲池中找一个值相等的对象给s4。 intern函数的作用就是,将值相同的String对象,都等同为字符串缓冲池中一个对象,这样节约内存   ------ 比较的判断基础是:==判断的是对象的引用(内存地址),equals判断的是字符串的表面值序列。

    s5、s6、s7的比较,主要是由于 toUpperCase() 和 toLowerCase() 方法返回一个新的String对象,它将原字符串表示字符串的大写或小写形式;但是要注意:如果原字符串本身就是大写形式或小写形式,那么返回原始对象。