正在加载...

Java 中的 HashSet

创建一个名为 tags 的 HashSet<String>,调用 tags.add("oak");,再调用 tags.add("pine");,再调用一次 tags.add("oak");,然后打印 tags.size()。编译 Bin.java 并运行 java Bin。屏幕应显示一行:2。第二次 oak 没有造出第三个值。一个集合里的唯一值,就是本页要教的内容。

唯一值,不是键值对

在 HashMap 页,你用 put 和 get 存了一个指向值的键。HashSet 只存值本身。每个值最多出现一次。如果对同一个词 add 两次,集合仍然只保留一次。本课教学路径没有单独的键字符串。
打开 Bin.java。保留公共类名 Bin,使其与文件名一致。删掉残留的 HashMap 行、scores.put、scores.get,以及任何 Desk 演示。那些属于映射页。也删掉任何残留的 ArrayList、Rack、Scanner 或 nextLine。程序不得等待你输入。
靠近顶部、在 public class Bin 上方写:
import java.util.HashSet;
这条导入让 HashSet 类型能用短名。没有它,本页上 javac 看不到短名 HashSet。仔细拼写 java.util 与 HashSet。这里不要把 import java.util.*; 当成要求——一条准确导入就够。
在 main 里创建集合:
HashSet<String> tags = new HashSet<String>();
尖括号里是 String,因为本课存的是词语。名称 tags 是你要保留的名字。调用 new HashSet<String>() 建出空集合。此刻它持有零个值。

加入 oak、pine,再加 oak——然后 size

单独一行调用 tags.add("oak");。再调用 tags.add("pine");。再第三次用同一词调用 tags.add("oak");。第三次调用不会让集合变大。然后写:
System.out.println(tags.size());
为保留的第一个文件打印大小,不要打印整个集合。数字 2 证明重复被忽略了。编译前先保存。

Bin size after duplicate add

java
import java.util.HashSet;

public class Bin {
    public static void main(String[] args) {
        HashSet<String> tags = new HashSet<String>();
        tags.add("oak");
        tags.add("pine");
        tags.add("oak");
        System.out.println(tags.size());
    }
}

从放有 Bin.java 的文件夹运行 javac Bin.java。当圆括号、花括号、尖括号和分号都匹配时,javac 自己不写任何行。然后运行 java Bin——不要 java Bin.java,也不要 java HashSet。运行命令里去掉 .java 结尾。
程序应打印一行并停止:2。它不应要求你打字。如果终端在等键盘输入,某个文件里还留着旧练习的 nextLine 调用。删掉那个调用,保留创建、三行 add,以及 System.out.println(tags.size());。
把运行走一遍。Java 从 Bin.main 开始。导入已经点明你指的是哪个 HashSet。new 行建出空集合。第一次 add 存入 oak。第二次存入 pine。第三次 add("oak") 发现 oak 已在,不抬高计数。打印 size() 写出 2。屏幕显示 2。不应再打印别的。若看到 3,你没在跑这个 HashSet 文件,或加了不同的第三个词如 elm。若看到 leaf,Desk 的 HashMap 演示仍在跑——改用 java Bin。若看到 [oak, pine],你打印了整个集合而不是 size();第一个教学文件请保留打印大小。
若 javac 说找不到 HashSet,导入行缺失、拼错,或写在 public class Bin 之后。把 import java.util.HashSet; 移到类行上方。若写成无引号的 tags.add(oak);,javac 会把 oak 当成缺失的名字。请保留引号。本页不要对 HashSet 调用 put——那个名字属于 HashMap。

用 contains 询问

第二个 Bin 文件在同样前两次 add 之后检查 oak 是否在集合里。

Bin contains oak

java
import java.util.HashSet;

public class Bin {
    public static void main(String[] args) {
        HashSet<String> tags = new HashSet<String>();
        tags.add("oak");
        tags.add("pine");
        System.out.println(tags.contains("oak"));
    }
}

用同样方式编译并运行那个第二份文件。屏幕显示 true。调用 contains("oak") 询问该值是否在集合中。它返回 boolean。若只加入 oak 和 pine 后询问 contains("elm"),屏幕会显示 false——那是有效的,但保留的第二份文件使用 "oak",所以屏幕是 true。
本页不要把遍历集合的循环当成要求。后面一页——iterating——会走集合。这里留在 add、size 和 contains。

与 HashMap 对照

一张短表把差别说清。

📊 HashSet vs HashMap

Piece On this page
store tags.add("oak"); — value only
duplicate second add("oak") does not grow size
read check tags.contains("oak") → true
HashMap leftover put / get — not this page’s path
表格只是提醒。你要保留的键入片段是 HashSet 导入、创建行、add 调用、size() 和 contains。

与 HashMap、ArrayList 比较

在 HashMap 页,put 和 get 用键。本页里 add 和 contains 用值本身。残留的 Desk 文件若打印 leaf,那是另一课。本页请保留 HashSet<String> tags 以及打印 2 的大小演示。
ArrayList 可以两次持有同一词。HashSet 不会因为对该词的第二次相同 add 而变大。这种唯一性就是本课要点。不要把 tags.get(0) 混进 Bin 演示——本页集合不用列表槽位号。
若旧的 Desk.java 或 Rack.java 仍在旁边,若不干扰你运行哪个类就留下,只有混淆时再删。编译本课的 HashSet 文件后运行 java Bin。

留给 iterating 的部分

本页打开唯一值的集合。下一页用循环走集合。这里留在 add、size 和 contains。本页不要把对集合的 for-each 当成要求;本课目标是唯一性,以及 size() 得到的屏幕 2。

进入 iterating 之前

你可以导入 java.util.HashSet,创建 HashSet<String> tags,加入 oak、pine 再加 oak,然后打印 tags.size() 看到 2。第二份文件可以打印 tags.contains("oak") 看到 true。对每个保留的演示编译 Bin.java 并运行 java Bin。集合保留了唯一值。下一页是 iterating,你会逐个走过集合里的值。
把导入放在类上方。在大小演示里保留重复的 add("oak"),让计数保持 2。保留 contains 做 boolean 检查。这些习惯是本页继续前进前的检查点。当三次 add(含重复 oak)后 size() 显示 2,HashSet 已完成本课工作,你可以进入下一主题。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
6
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部