Bootstrap

第3关:Set接口

任务描述

本关任务:练习HashSet的增删改查

1.添加值为helloHashSet的元素

2.更改元素值,将cat改成fish

3.删除值为apple的元素

相关知识

1.Set接口概述

一个不包含重复元素的 collection,无序。

哈希表确定元素是否相同

1、 判断的是两个元素的哈希值是否相同。 如果相同,再判断两个对象的内容是否相同。

2、 判断哈希值相同,其实判断的是对象的HashCode方法。判断内容相同,用的是equals方法。

2 HashSet类概述

  • 不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。
  • HashSet如何保证元素唯一性
  • 底层数据结构是哈希表(元素是链表的数组)
  • 哈希表依赖于哈希值存储
  • 添加功能底层依赖两个方法:int hashCode()、boolean equals(Object obj)

HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。整个存储的流程如下图所示。

HashSet存储元素保证唯一性的代码及图解:

2.1 删除元素

 
  1. // 引入 HashSet 类
  2. import java.util.HashSet;
  3. public class RunoobTest {
  4. public static void main(String[] args) {
  5. HashSet<String> sites = new HashSet<String>();
  6. sites.add("Google");
  7. sites.add("Runoob");
  8. sites.add("Taobao");
  9. sites.add("Zhihu");
  10. sites.add("Runoob"); // 重复的元素不会被添加
  11. sites.remove("Taobao"); // 删除元素,删除成功返回 true,否则为 false
  12. System.out.println(sites);
  13. }
  14. }

删除集合中所有元素可以使用 clear 方法

2.2 添加元素

 
  1. // 引入 HashSet 类
  2. import java.util.HashSet;
  3. public class RunoobTest {
  4. public static void main(String[] args) {
  5. HashSet<String> sites = new HashSet<String>();
  6. sites.add("Google");
  7. sites.add("Runoob");
  8. sites.add("Taobao");
  9. sites.add("Zhihu");
  10. sites.add("Runoob"); // 重复的元素不会被添加
  11. System.out.println(sites);
  12. }
  13. }

2.3遍历元素

 
  1. // 引入 HashSet 类
  2. import java.util.HashSet;
  3. public class RunoobTest {
  4. public static void main(String[] args) {
  5. HashSet<String> sites = new HashSet<String>();
  6. sites.add("Google");
  7. sites.add("Runoob");
  8. sites.add("Taobao");
  9. sites.add("Zhihu");
  10. sites.add("Runoob"); // 重复的元素不会被添加
  11. for (String i : sites) {
  12. System.out.println(i);
  13. }
  14. }
  15. }

2.4 判断元素是否存在

 
  1. // 引入 HashSet 类
  2. import java.util.HashSet;
  3. public class RunoobTest {
  4. public static void main(String[] args) {
  5. HashSet<String> sites = new HashSet<String>();
  6. sites.add("Google");
  7. sites.add("Runoob");
  8. sites.add("Taobao");
  9. sites.add("Zhihu");
  10. sites.add("Runoob"); // 重复的元素不会被添加
  11. System.out.println(sites.contains("Taobao"));
  12. }
  13. }

2.5修改元素

HashSet并没有提高修改元素的方法,直接修改元素可能会导致重复项,与HashSet的特点违背,因此要实现修改元素可采用如下方法:判断元素是否存在,存在则删除,之后添加新元素,最终实现修改元素的效果。

编程要求

根据提示,在右侧编辑器补充代码,操作HashSet完成以下任务:

1.添加值为helloHashSet的元素

2.更改元素值,将cat改成fish

3.删除值为apple的元素

测试说明

平台会对你编写的代码进行测试:

无输入


开始你的任务吧,祝你成功!

package step3;

import java.util.HashSet;
import java.util.Scanner;

public class HelloSet {
		public static void main(String[] args) {
			HashSet<Object> hashSet = new HashSet<>();
			Scanner scanner = new Scanner(System.in);
			for (int i = 0; i < 5; i++) {
				hashSet.add(scanner.next());
			}
			
// ---------------------Begin------------------------

			hashSet.add("helloHashSet");
			hashSet.remove("apple");
			if(hashSet.contains("cat")) {
				hashSet.remove("cat");
				hashSet.add("fish");
			}

// ---------------------End------------------------
			hashSet.forEach(ele -> System.out.println(ele));
		}

}

;