爪哇2博客
爪哇2博客

哈希集如何在Java中工作

在这篇文章中,我们将看到有关Java中的哈希集的信息

爪哇 哈希集:

1
2
3
4
5
 
部分-1:<a href="//www.menexpert.net/2014/07/how-hashset-works-in-java.html">哈希集 爪哇</a>
部分-2:<a href="//www.menexpert.net/2013/02/difference-between-hashmap-and-hashset.html">区别 之间 哈希图 哈希集</a> 
部分-3:<a href="//www.menexpert.net/2014/02/hashcode-and-equals-method-in-java.html">哈希码 等于 方法 </a>a
 

这是核心Java面试中的常见问题之一,因此在本文中,我们将了解HashSet如何在Java中工作。 hashMap如何在Java中工作 并且 哈希图和HashSet之间的区别。

首先让我们看一下Hashset的介绍,然后我们将介绍它的内部。

哈希集:

哈希集实现了Set接口,该接口不允许重复值,它不同步并且也不是线程安全的。
有时,重复项的定义可能会非常棘手。让我们在这里考虑两种情况。

  1. 对于基本类型(例如,整数,字符串)
  2. 如果是自定义对象。
对于基本类型:
如果是基本类型,那就很简单了,让我们看一下示例:
让我们创建一个Java程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
组织.Arpit.爪哇2blog;
进口 爪哇.实用程序.哈希集;
 
上市 哈希集Main {
 
上市 静态的 虚空 主要([] args) {
  哈希集 名称Set= 哈希集();
  名称Set.(“阿尔伯特”);
  名称Set.(“阿尔伯特”);
  名称Set.(“约翰”);
  系统..打印(“ 名称Set =”的大小+名称Set.尺寸());
  系统..打印(名称Set);
}
 
}
 

当您运行上述程序时,将得到以下输出:

1
2
3
4
 
尺寸 名称Set=2
[Arpit, 约翰]
 

所以我们尝试添加字符串“Arpit”两次,但是由于HashSet不允许重复值,它将添加“Arpit” once 在 哈希集

如果是自定义对象:
为了了解HashSet在自定义对象的情况下如何工作,您需要了解 爪哇中的哈希码和equals方法.let创建一个名为Country的类,并在其中仅实现equals方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
组织.Arpit.爪哇2blog;
 
上市 国家 {
 
名称;
人口;
上市 getName() {
  返回 名称;
  }
上市 虚空 setName( 名称){
  这个.名称 = 名称;
}
上市 getPopulation() {
  返回 人口;
}
上市 虚空 setPopulation( 人口) {
  这个.人口 = 人口;
}
 
上市 toString()
{
  返回 名称;
}
@覆写
上市 布尔值 等于(目的 对象) {
  如果 (这个 == 对象)
   返回 真正;
  如果 (对象 == 空值)
   返回 ;
  如果 (getClass() != 对象.getClass())
   返回 ;
  国家 其他 = (国家) 对象;
  如果 (名称 == 空值) {
   如果 (其他.名称 != 空值)
    返回 ;
  } 其他 如果 (!名称.等于(其他.名称))
   返回 ;
  返回 真正;
}
 
}
 

创建主类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.哈希集;
 
上市 哈希集CountryMain {
 
上市 静态的 虚空 主要([] args)
{
  哈希集 countrySet= 哈希集();
  国家 在 dia1= 国家();
  在 dia1.setName(“印度”);
 
  国家 在 dia2= 国家();
  在 dia2.setName(“印度”);
 
  countrySet.(在 dia1);
  countrySet.(在 dia2);
 
  系统..打印(“ 名称Set =”的大小+countrySet.尺寸());
  系统..打印(countrySet);
 
}
}
 

当您运行上述程序时,将得到以下输出:

1
2
3
4
 
尺寸 名称Set=2
[印度, 印度]
 

现在您必须怀疑即使两个对象都相等,为什么HashSet包含两个值而不是一个值,这是因为First 哈希集计算该键对象的哈希码,如果哈希码相同,则仅检查equals方法,并且因为上述两个国家的哈希码对象使用默认的哈希码方法,两者将具有不同的内存地址,因此哈希码也不同。
现在让我们在上面的Country类中添加哈希码方法

1
2
3
4
5
6
7
8
9
 
@覆写
上市 整型 hashCode() {
  最后 整型 主要 = 31;
  整型 结果 = 1;
  结果 = 主要 * 结果 + ((名称 == 空值) ? 0 : 名称.hashCode());
  返回 结果;
}
 

再次在主程序上运行,您将获得以下输出:

1
2
3
4
 
尺寸 名称Set=1
[印度]
 

因此,现在我们对HashSet有了很好的了解,让我们看一下其内部表示形式:

哈希集的内部工作:

将任何重复的元素添加到HashSet时,add()方法将返回false,并且不将重复的元素添加到HashSet中。
加方法如何返回false?为此,我们需要查看HashSet’JavaAPI中的添加方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
上市 哈希集
    延伸 抽象集
    实施 , 可克隆的, 爪哇.io.可序列化
{
 
    私人的 短暂的 哈希图<E,目的> 地图;
 
    // 当下是虚拟值,将用作映射中的值
    私人的 静态的 最后 目的 当下 = 目的();
 
    / **
    *构造一个空的map.so哈希
     *
     */
    上市 哈希集() {
     地图 = 哈希图<E,目的>();
    }
 
    //如果HashSet中已经存在e,则返回false
    上市 布尔值 (E e) {
     返回 地图.(e, 当下)==空值;
    }
 
    //其他HashSet方法
}
 

So from above 码, It is clear that 哈希集 uses 哈希图 用于检查重复元素。众所周知,在HashMap中,键应该是唯一的。所以HashSet使用这个概念,当元素被添加到HashSet时,它作为键被添加到内部HashMap中。此HashMap需要一些值,因此在此HashMap中使用了一个伪Object(PRESENT)作为值。
当下是虚拟值,用于内部映射。
让我们看看添加方法:

1
2
3
4
5
6
 
//如果HashSet中已经存在e,则返回false
    上市 布尔值 (E e) {
     返回 地图.(e, 当下)==空值;
    }
 

所以这里有两种情况

  • 如果该地图中没有元素,则map.put(e,PRESENT)将返回null。因此map.put(e,PRESENT)== 空值将返回true,因此add方法将返回true并将元素添加到HashSet中。
  • 如果该地图中已经存在元素,则map.put(e,PRESENT)将返回旧值。因此map.put(e,PRESENT)== 空值将返回false,因此add方法将返回false,并且不会在HashSet中添加元素。

请通过  针对初学者的Java核心访谈问题 了解更多面试问题。


导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

  • 10月02

    用Java中的值初始化ArrayList

    在本文中,我们将学习使用Java中的值初始化ArrayList。 数组列表是Java中List接口的实现类。它用于存储元素。它基于动态增长的阵列概念。我们可以通过几种方式用值初始化ArrayList。让’我们看到了其中一些…]

  • 3月17日

    爪哇 8中的PriorityQueue

    在本文中,我们将介绍Java 8 PriorityQueue。当应该根据对象的优先级处理对象时,在这种情况下,我们使用PriorityQueue。这是一种特殊的队列(也称为非绑定队列),可以根据元素的自然顺序或基于[…]

  • 10月06日

    2d Arraylist 爪哇示例

    在本文中,我们将看到如何在Java中创建2d Arraylist。创建2d Arraylist的最佳方法是在Java中创建列表的列表。 [crayon-601ef0f754888683500104 /]让’s创建一个程序来实现2d Arraylist 爪哇。 [crayon-601ef0f75488c169498310 /]输出:list3中的第二个元素:List3_Str2 list1中的第三个元素:List1_Str3 list2中的第一个元素[…]

  • 04 May

    哈希图如何在Java中工作

    最常见的面试问题是<code>HashMap如何在Java中工作</code>, “HashMap的获取和放置方法如何在内部工作”。在这里,我试图通过一个简单的示例来解释内部功能。 [crayon-601ef0f766b65155076348-i /]是Java中最常用的Collections之一。与其从理论上讲,不如从理论上入手,这样您就可以[…]

  • 10月21日

    如何在Java中对HashSet进行排序

    在本文中,我们将看到如何在Java中对HashSet进行排序。 哈希集是一个不按任何顺序存储元素的集合。您可能会遇到需要对HashSet进行排序的情况。排序HashSet的方法有很多种,我们将在这里看到两种方法。使用TreeSet可以使用[…]

  • 10月20日

    要设置的Java数组

    在本文中,我们将学习Java数组设置转换。有很多方法可以将数组转换为set。 1.使用Java 8’s Stream如果您使用的是Java 8,建议您使用此方法。 [crayon-601ef0f767594615455224 /]输出[John,Martin,Mary] 2.使用HashSet构造函数()我们可以直接调用HashSet‘s的java构造函数set […]

Comments

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客