ImmutableCollection.contains()区分大小写吗?

时间:2014-08-06 18:14:14

标签: java

在ImmutableSet of Strings上调用.contains()时,比较区分大小写?在下面的示例代码中,“foo”,“Foo”和“FOO”的参数key都会返回false吗?

public class MyClass {
  public static final String FOO_KEY = "foo";
  public static final String BAR_KEY = "bar";

  static final ImmutableSet<String> RESERVED_KEYS = new ImmutableSet.Builder<String>()
    .add(FOO_KEY)
    .add(BAR_KEY)
    .build();

  public boolean validate(String key) {
    if (RESERVED_KEYS.contains(key)) {
      return false;
    } else {
      return true;
    }
  }
}

3 个答案:

答案 0 :(得分:4)

不,它区分大小写,因为它基于equals()的{​​{1}}方法,而不是不区分大小写的Object方法。

插入和测试元素时,您需要自己进行大小写折叠。

答案 1 :(得分:1)

所以,如果你看看source code,这就是.contains()的样子:

public boolean contains(@Nullable Object object) {
    return object != null && Iterators.contains(iterator(), object);
}

在这里,您会注意到Iterators.contains()为defined

     Returns true if iterator contains element. 

以下是Iterators.contains()

的源代码
   public static boolean contains(Iterator<?> iterator, @Nullable Object element)
   {
     if (element == null) {
     while (iterator.hasNext()) {
      if (iterator.next() == null) {
        return true;
      }
   }
} else {
  while (iterator.hasNext()) {
    if (element.equals(iterator.next())) {
       return true;
     }
   }
 }
 return false;
 }

这里使用.equals()方法,因为你传入一个字符串 - 它的行为就像你调用“Foo”.equals(“foo”);

一样

您可以找到Iterators源代码here

如果您有任何疑问,请与我们联系!

答案 2 :(得分:1)

某些Java集合使用Comparator而不是equals。理想情况下,compare方法应与equals一致,但字符串是特殊情况; - )

您可以使用此功能(仅在此类情况下)执行不区分大小写的检查。只需将ImmutableSet更改为ImmutableSortedSet,其余代码应按原样运行。

所以你的课程看起来像 -

public static class MyClass {
        public static final String FOO_KEY = "foo";
        public static final String BAR_KEY = "bar";

        final ImmutableSortedSet<String> RESERVED_KEYS =
                ImmutableSortedSet.orderedBy(String.CASE_INSENSITIVE_ORDER)
                        .add(FOO_KEY)
                        .add(BAR_KEY)
                        .build();

        public boolean validate(String key) {
            return !RESERVED_KEYS.contains(key);
        }
    }