Java数组,List,Map,Set比较相等

By | 2015年6月10日

1. 数组(Array)

String[] array1 = {“1”, “2”, “3”};
String[] array2 = {“1”, “2”, “3”};
System.out.println(array1.equals(array2));

输出false。array1和array2是两个引用,equals是比较两个数组是否指向同一个引用。对于长度相等的数组,我们可以使用for循环判断两个数组的元素是否相等。

2. List

List<Integer> list1 = Lists.newArrayList(1, 2, 3, 4);
List<Integer> list2 = Lists.newArrayList(1, 2, 3, 4);
System.out.println(list1.equals(list2));

输出true。List的equals方法是比较其元素,当两个List拥有相同的元素,并且元素顺序相同时,返回true。

3. Map

Map<String, String> map1 = Maps.newHashMap();
Map<String, String> map2 = Maps.newHashMap();
map1.put(“key1”, “value1”);
map1.put(“key2”, “value2”);
map2.put(“key1”, “value1”);
map2.put(“key2”, “value2”);
System.out.println(map1.equals(map2));  // 等同于map1.entrySet().equals(map2.entrySet())

输出true。Map的equals方法是比较其EntrySet,当map1.entrySet().equals(map2.entrySet())时,返回true。也就是说两个Map的映射关系相同时,equals返回true。

4. Set

Set<String> set1 = Sets.newHashSet(“3”, “1”, “2”);
Set<String> set2 = Sets.newHashSet(“1”, “2”, “3”);
System.out.println(set1.equals(set2));  // 等同于set1.containsAll(set2) && set2.containsAll(set1)

输出true。Set的equals也是比较其元素。当set1包含set2的元素,并且set2包含set1的元素时,返回true。

注意:

两个元素e1和e2相等是指e1和e2都不为null时,e1.equals(e2);或者e1和e2都为null,它们也是相等的。

使用? :表达式判断两个元素相等

e1 == null ? e2 == null : e1.equals(e2)

这行代码是从Java Help中看到的,用于判断两个元素是否相等。

  • 当e1和e2,都是null时,返回true;
  • 当e1和e2,一个为null,另一个不为null是,返回false;
  • 当e1和e2,都不为null时,equals为true时,返回true;

跟同事讨论了下,使用问号表达式,可读性不好。通常我们会写成:e1 == e2 || (e1 != null && e1.equals(e2))。

Guava类库提供了比较两个元素相等的方法:Objects.equals(e1, e2),它是使用第二种方法实现的。