哈希集如何在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的介绍,然后我们将介绍它的内部。
哈希集:
有时,重复项的定义可能会非常棘手。让我们在这里考虑两种情况。
- 对于基本类型(例如,整数,字符串)
- 如果是自定义对象。
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有了很好的了解,让我们看一下其内部表示形式:
哈希集的内部工作:
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核心访谈问题 了解更多面试问题。
Comments
如上所述,要注意的一件事是,在HashMap中,值可能是重复的,但Key应该是唯一的。那'■HashSet如何确保仅将唯一的值存储在其中,因为要存储在HashSet中的值成为将其存储在HashMap中的关键。 http://netjs.blogspot.com/2015/09/how-hashset-wor…