java中关于字符串比较的写法

java中关于字符串比较的写法

写这篇博客的原因是因为最近工作中又踩坑了,为了让自己记得更清楚些,特地整理了一番来警示自己。

1.==(别这么搞,除非不想干了)

众所周知,在java中对于引用类型而言,==比较的是两个对象的地址

 String str1 = "xyz";
 String str2 = "xyz";
 String str3 = new String("xyz");

 System.out.println(str1 == str2);
 System.out.println(str1 == str3);
 System.out.println(str2 == str3);

输出的结果为:

在这里插入图片描述

这里第一个之所以是true,是因为在java中,通过String x=“xxx”这样的形式创建的字符串会存放于常量池中,上述str1和str2取到的是同一个地址存储的字节数组,因而会返回true.

2.equals()方法(使用需谨慎)

String str4 = new String("hello");
String str5 = new String("hello");
System.out.println(str4.equals(str5));

结果为true

equals方法可对字符串对象的值进行比较

那为什么使用上需要谨慎呢?

这里就涉及到字符串比较的常用写法问题

假如我们需要将String对象与一个字符串常量进行比较

String str6 = new String("test");
System.out.println("test".equals(str6));    //推荐
System.out.println(str6.equals("test"));    //不推荐

这个时候输出的结果为:

在这里插入图片描述
好像并没有什么问题

但是如果是下面这种情况呢:

String str7 = null;
System.out.println("test".equals(str7));
System.out.println(str7.equals("test"));

结果就会变成:
在这里插入图片描述

出现了空指针异常,所以请注意如果是字符串与常量比较请把常量写在equals前。

在实际的多系统交互中,我们不了解自己的上游系统会给自己传什么样的参数,如果传空且我们又这样进行字符串比较,会导致正常业务流程异常结束。

所以一般而言,如果使用equals的话,我们通常会这么用

if(str7 != null && str7.equals(test))

3.StringUtils(强烈推荐)

推荐使用org.apache.commons.lang包下的StringUtils

pom文件添加下面依赖即可

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>

这时候我们比较两个字符串的代码就可以变更为:

String str8 = "recommender";
String str9 = "recommender";
System.out.println(StringUtils.equals(str8,str9));

结果显而易见是true

而这个时候还要不要像上面那样判空呢,答案是不用

让我们看一下啊StringUtils.equals的源码

public static boolean equals(String str1, String str2) {
    return str1 == null ? str2 == null : str1.equals(str2);
}

这里已经对equals前的对象做了判空处理

为了避免遗漏判空处理代码,这里我还是建议大家多使用StringUtils

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值