在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;
}
}
}
答案 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);
}
}