Java中Set/HashSet的内部工作

正如我们所知,一个集合就是一个集合 明确的 不同对象的集合。集合的每个成员都称为集合的一个元素。换句话说,我们可以说 集合永远不会包含重复的元素 .但在爪哇如何 设置 接口实现了如下类 哈希集 , LinkedHashSet , 有序树 等等,实现这种独特性。在这篇文章中,我们将讨论这种独特性背后隐藏的真相。

null

HashSet在Java内部是如何工作的?

How Set/HashSet works internally  in 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 HashMap map;

    // 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的返回值。将(键、值)方法与 无效的 价值

  1. 如果是地图。put(键、值)返回 无效的 ,则返回语句“map.put(e,PRESENT)==null” 符合事实的 元素添加到HashSet(内部HashMap)。
  2. 如果是地图。put(key,value)返回键的旧值,然后语句“map.put(e,PRESENT)==null”将返回 错误的 元素并没有添加到HashSet(内部HashMap)。

由于LinkedHashSet扩展了HashSet,所以它使用 超级() .同样地,创建一个 有序树 类在内部创建 通航地图 作为背景地图。

相关文章: HashMap在Java中的内部工作原理。

本文由 高拉夫·米格拉尼 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享