对于equals我大意了,没有闪

对String 的判断我大意了,没有闪!!!!!
我们经常写代码的时候会做String字符串的判断。equals是我们经常用的。今天写代码的时候又习惯性的进入了坑中。
equals 的顺序不同导致的结果不同。
我们来看一下下面的写法会出现什么问题

场景一:
String testString="";
testString.equals("");

场景二:
String testString=null;
testString.equals("");

场景三:
String testString="";
"".equals(testString);

场景四:
String testString=null;
null.equals(testString);

场景五:
String testString=null;
"null".equals(testString);
场景六:
String testString=null;
System.out.println(testString==null);

场景七:
String testString=new String("");
String testString2=new String("");
System.out.println(testString==testString2);
System.out.println(testString.equals(testString2));


输出的结果
场景一:true
场景二:java.lang.NullPointerException
场景三:true
场景四:代码错误
场景五:false
场景六:true(比较字符串不建议用)
场景七:false   true

剖析:场景二中的testString=null,String对象就会是一个空对象,空对象说明没有equals方法,所以就会报空指针异常;有人说了 “” 为什么不报呢,因为"“是一个对象,内容为”",但是他有内存空间。而null呢,不会创建对象,没有内存空间。场景五中testString=null,“null”.equals(testString);结果永远都为false,原因直接看源码:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
     //判断anObject是否为String类型
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

而场景六中 虽然得到是true 但是他们比较的东西确实是不相同的。null为内存为空,“”为内容为空。
得到true是因为拿null的内存去比较""的内容。所以就能看到场景七的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值