equals的一些细节。

前言:前段时间使用equals方法出现了一些小问题,我们往下看:


代码一:
public class TestEquals {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isSame() {
        //出错代码块
        if (name.equals("小明")) {
            return true;
        } else {
            return false;
        }
    }

}


代码二(测试类):
public class Client {
    public static void main(String[] args) {
        TestEquals te = new TestEquals();
        te.setName("小明");
        if (te.isSame()){
            System.out.println("他们是同一个人!");
        }else {
            System.out.println("他们不是同一个人!");
        }
    }
}

运行代码二,控制台显示如下结果:

他们是同一个人!

如果我们没有把name值设进去,看看会发生什么。

代码三:
public class Client {
    public static void main(String[] args) {
        TestEquals te = new TestEquals();
        if (te.isSame()){
            System.out.println("他们是同一个人!");
        }else {
            System.out.println("他们不是同一个人!");
        }
    }
}

运行代码,控制台显示如下结果:
Exception in thread “main” java.lang.NullPointerException
at com.china._02_equals.TestEquals.isSame(TestEquals.java:16)
at com.china._02_equals.Client.main(Client.java:8)

报了空指针异常,为什么会这样呢??


public boolean isSame() {
        //出错代码块
        if (name.equals("小明")) {
            return true;
        } else {
            return false;
        }
    }

空指针异常出现的情况:

  • 调用 null 对象的实例方法。
  • 访问或修改 null 对象的字段。
  • 将 null 作为一个数组,获得其长度。
  • 将 null 作为一个数组,访问或修改其时间片。
  • 将 null 作为 Throwable 值抛出

我们在测试类中,没有把name的值给设进去,这时isSame方法中的name的值为null,而null是没有比较字符串是否相等的equal方法,这时就报了空指针异常。

那有什么解决方法吗?
代码如下:
public boolean isSame() {
        if ("小明".equals(name)) {
            return true;
        } else {
            return false;
        }
    }

运行测试类代码三:

结果如下:

他们不是同一个人!

因为"小明"("“空字符串也可以调用equals方法,!”".equlas(name),这样可以判断name是否是空字符串,false为空字符串)是一个字符串,拥有equals方法,如果name为null,就会返回false,不会报空指针异常。


接着讲讲equals和==的区别:

代码如下:
public class Client {
    public static void main(String[] args) {
        String name1 = new String("小明");
        String name2 = new String("小明");
        System.out.println(name1 == name2);//false
        System.out.println(name1.equals(name2));//ture
        System.out.println("abc".equals("ABC"));//false
        System.out.println("abc".equalsIgnoreCase("ABC"));//true
        System.out.println("abc".equalsIgnoreCase("Abc"));//true
        System.out.println("abc".equalsIgnoreCase("AbcD"));//false
    }
}

测试结果我都用写在注释那里了,第一个为false是因为,用==比较的话,不止内容要相同,连存储空间地址都要相同才会返回true,因为name1和name2都是new出来的,两者的存储空间地址不一样,所以返回false。equals方法只比较内容,内容相同就返回true,但是没有忽略大小写,想要忽略大小写比较的话可以用equalsIgnoreCase这个方法。


如有错误,请指正,感谢。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhou22-codeWalker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值