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