15

when comparing strings I prefer not to rely on instance methods lest the string on which the method is called happens to be null. In .NET I just use the static String.Compare(string, string, bool) method. does java provide a similar built-in "null-safe" string compare utility or do I have to implement my own?

4

7 回答 7

12

不,JDK 不包含此类实用程序。但是有几个外部库可以做到这一点。例如org.apache.commons.lang.StringUtils提供 null-safeequals(String, String)equalsIgnoreCase(String, String). Guava 也有类似的实用程序。

于 2013-02-07T15:15:45.953 回答
2

String确实提供了一个compareTo 方法,它无论如何都不是 null 安全的(即,在实际调用对象上的 comapreTo 方法之前,您需要检查 null 值)。

您可以做的是像这样编写自己的比较器

class StringComparator implements Comparator<String> {

    public int compare(String s1, String s2) {
        if (s1 != null) {
            return s1.compareTo(s2);
        } else {
            if (s2 == null) {
                return 0;
            } else {
                return -1;
            }
    } 

要验证该属性,只需执行以下操作:

Comparator<String> comp = new Comparator<String>();
System.out.println(comp.compare(s1, s2);

我实际上并没有测试代码,因此将其作为一般示例。好处是,即使您无论如何都需要检查空值,您也可以编写一次并多次使用它。

您还可以查看String 类中的内置 Comparator 。

于 2013-02-07T15:29:19.980 回答
2

没有。Apache Commons这样StringUtils.equals()做:

public static boolean equals(String str1, String str2) {
    return str1 == null ? str2 == null : str1.equals(str2);
}
于 2013-02-07T15:17:31.987 回答
1

如果要比较的字符串之一是一个常量,则可以equals在它处理时使用null

if("string".equals(mystring)) {
    // do something
}

如果您有 2 个变量,那么您可以编写自己的静态方法:

public static boolean stringEquals(String s1, String s2) {
    if (s1 == null) {
        return s2 == null;
    }
    return s1.equals(s2);
}
于 2013-02-07T15:36:47.450 回答
1

这里有一个类似的问题 如何简化空安全的 compareTo() 实现?

明智地建议使用 Apache CommonsObjectUtils

result = ObjectUtils.compare(left, right);
于 2014-11-18T20:11:10.380 回答
1

我想答案是否定的,您可能必须先检查一下

if(myString != null && myString.equals("string")) {
    // do something
}

这里还有一些例子

正如其他人指出的 Apache Commons 有这个,还有 Spring:

StringUtils.hasLength()

if(StringUtils.hasLength(myString)) {
    // do something
}
于 2013-02-07T15:14:49.323 回答
-2

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#compareTo(java.lang.String)

有一个返回 int 的比较。还有返回布尔值的equals。如果您有一个字符串实例,它应该能够执行。如果你通过 instance.equals(null) 它将返回 false。如果您的实例为空,那么您将获得一个空指针。

public class App
{

public static void main( String[] args )
{
    String myString = "test";

    if(myString.equals(null))
    {
        System.out.println("Its NUll");
    }else
    {
        System.out.println("Not Equal");
    }

}

}
于 2013-02-07T15:26:00.350 回答