正如我们所知,一个集合就是一个集合 明确的 不同对象的集合。集合的每个成员都称为集合的一个元素。换句话说,我们可以说 集合永远不会包含重复的元素 .但在爪哇如何 设置 接口实现了如下类 哈希集 , LinkedHashSet , 有序树 等等,实现这种独特性。在这篇文章中,我们将讨论这种独特性背后隐藏的真相。
HashSet在Java内部是如何工作的?
我们将通过一个例子来理解这一点。让我们看看下面的程序的输出,它试图在哈希集中添加重复的元素。
// Java program to demonstrate // internal working of HashSet import java.util.HashSet; class Test { public static void main(String args[]) { // creating a HashSet HashSet hs = new HashSet(); // adding elements to hashset // using add() method boolean b1 = hs.add( "Geeks" ); boolean b2 = hs.add( "GeeksforGeeks" ); // adding duplicate element boolean b3 = hs.add( "Geeks" ); // printing b1, b2, b3 System.out.println( "b1 = " +b1); System.out.println( "b2 = " +b2); System.out.println( "b3 = " +b3); // printing all elements of hashset System.out.println(hs); } } |
输出:
b1 = true b2 = true b3 = false [GeeksforGeeks, Geeks]
现在从输出来看,当我们试图使用 添加() 方法,它返回 错误的 ,并且元素不会添加到哈希集中,因为它已经存在。现在问题来了,怎么办 添加() 方法检查集合是否已包含指定的元素。如果我们能更仔细地观察一下 添加() 方法和HashSet类中的默认构造函数。
// predefined HashSet class public class HashSet { // A HashMap object private transient HashMapmap; // A Dummy value(PRESENT) to associate with an Object in the Map private static final Object PRESENT = new Object(); // default constructor of HashSet class // It creates a HashMap by calling // default constructor of HashMap class public HashSet() { map = new HashMap<>(); } // add method // it calls put() method on map object // and then compares it's return value with null public boolean add(E e) { return map.put(e, PRESENT)==null; } // Other methods in Hash Set }
现在您可以看到,每当我们创建哈希集时,它都会在内部创建一个 哈希图 如果我们使用 添加() 方法,它实际上调用 put() 在内部创建的HashMap对象上使用指定为键的元素和名为 “现在” 因为它的价值。所以我们可以这么说 集合通过HashMap在内部实现唯一性 .现在整个故事都讲出来了 HashMap和 put() 方法在内部起作用 .
正如我们在一个 哈希图 每把钥匙都是独一无二的 放置(键、值) 方法,它返回与键关联的上一个值,或 无效的 如果没有键的映射。所以在 添加() 方法检查map的返回值。将(键、值)方法与 无效的 价值
- 如果是地图。put(键、值)返回 无效的 ,则返回语句“map.put(e,PRESENT)==null” 符合事实的 元素添加到HashSet(内部HashMap)。
- 如果是地图。put(key,value)返回键的旧值,然后语句“map.put(e,PRESENT)==null”将返回 错误的 元素并没有添加到HashSet(内部HashMap)。
由于LinkedHashSet扩展了HashSet,所以它使用 超级() .同样地,创建一个 有序树 类在内部创建 通航地图 作为背景地图。
相关文章: HashMap在Java中的内部工作原理。
本文由 高拉夫·米格拉尼 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。