第十:通过JDK源码剖析hashCode与equals方法与集合的关系及作用

本文深入探讨了HashSet的内部实现机制,包括使用HashMap作为底层数据结构、对象的哈希码计算、插入操作的详细流程以及如何利用这些特性提高查找效率。同时,展示了如何通过Java代码实现对HashSet的基本操作。

一.

HashSet底层采用HashMap实现

二.

这个HashMap的key就是放进HashSet中的对象,而value就是一个Object类型的对象,这个value我们不关心它到底是什么

三.

当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),

该行的key就是向HashMap中增加的那个对象,该行的value就是一个Object类型的常量

四.

HashMap底层采用数组维护

五.

调用增加的那个对象的hashCode方法,来得到一个hashCode值,

然后根据该值计算出一个数组的下标索引(计算出数组中的一个位置)

六.

将准备增加到Map中的对象与该位置上的对象进行比较(equals)方法,如果相同,那么就将该位置上的那个对象(Entry类型)的value值替换掉;否则,沿着该Entry的链继续重复上述过程,如果到链的最后依然没有找到与此对象相同的对象, 那么这个时候就会将该对象增加到数组中,然后将数组中该位置上的那个对象链到这个新对象的后面

七.

对于HashSet,HashMap来说,这样做的原因就是为了提高查找的速度,使得查找时间不随Set或者Map的大小而改变

八.

Set.add()添加重复的返回false

Map.put()添加key一样的,把以前的value覆盖

Set的特性:无重复性,无序性

public class HashMapTest {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Map map = new HashMap();
		map.put("welcome", "abc");
		map.put("hello", "abc");
		map.put("world", "xyz");
		map.put("hello world", "abcxyz");
		

		Set set = map.entrySet();// 返回此映射中包含的映射关系的 Set 视图。
		for (Iterator it = set.iterator(); it.hasNext();) {
			Map.Entry me = (Map.Entry) it.next();// 后面的知识可以用泛型写
			System.out.print(me.getKey() + "  ");
			System.out.println(me.getValue());
		}

		Set set2 = map.keySet();// 返回此映射中包含的键的 Set 视图。
		for (Iterator it = set2.iterator(); it.hasNext();) {
			String key = (String) it.next();
			String value = (String) map.get(key);
			System.out.println(key + "   " + value);
		}

		@SuppressWarnings("unused")
		Set set3 = new HashSet();
	}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值