去重神器HashSet

112 阅读1分钟

数学意义上的集合

  • 无重复元素,也无序

为什么要设计HashSet?

  • 最大的用途:去重

HashSet 本质实现原理

  • 背后实现为 HashMap
  • HashSet 中的元素相当于 HashMap 中的Key,而Value均为 new Object()

HashSet 实战

  • 如何构造一个 HashSet
// 如何构造HashSet
Set<String> stringSet = new HashSet<>();

// 带入集合参数
Collection<Integer> c = new ArrayList<>();
c.add(100);
c.add(100);
c.add(1);
c.add(1);
Set<Integer> integerSet = new HashSet<>(c);
for (Integer num: integerSet) {
    System.out.println("Num in set: " + num);
}
  • size/isEmpty
System.out.println("Size of integer set: " + integerSet.size());
System.out.println("IsEmpty for set: " + stringSet.isEmpty());
  • 【重点】contains
if (integerSet.contains(100)) {
    System.out.println("100 belong to this set");
} else {
    System.out.println("100 not belong to this set");
}
  • 【重点】add
stringSet.add("Java");
stringSet.add("String");
stringSet.add("XXXXX");
  • remove
System.out.println("Size: " + stringSet.size());
System.out.println("Remove result for XXXX: " + stringSet.remove("XXXX"));
System.out.println("Size after removing XXXX: " + stringSet.size());
System.out.println("Remove result for XXXXX: " + stringSet.remove("XXXXX"));
System.out.println("Size after removing XXXXX: " + stringSet.size());
  • bulk operation
List<String> list = new ArrayList<>();
list.add("123X");
list.add("Java");
list.add("String");
stringSet.addAll(list);
System.out.println("Size after addAll: " + stringSet.size());

System.out.println("RetainAll: " + stringSet.retainAll(list));
System.out.println("RemoveAll: " + stringSet.removeAll(list));
  • 如何遍历 HashSet
// 1. 迭代器(不推荐)
Iterator<String> iterator = stringSet.iterator();
while (iterator.hasNext()) {
    System.out.println("Iterator element: " + iterator.next());
}

// 2. for-each
for (String element: stringSet) {
    System.out.println("Foreach element: " + element);
}

// 3. lambda(推荐)
stringSet.forEach(System.out::println);
stringSet.forEach(element -> System.out.println("Foreach element: " + element));