Java中equals和== 的区别

         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对象,它将原字符串表示字符串的大写或小写形式;但是要注意:如果原字符串本身就是大写形式或小写形式,那么返回原始对象。



         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值