Java集合类笔记--Set

本文深入探讨了HashSet和TreeSet的实现原理,解释了HashSet如何利用HashMap存储唯一元素,以及TreeSet如何根据元素大小进行排序。强调了自定义类时重写hashCode和equals方法的重要性,以及TreeSet中元素必须实现Comparable接口的要求。

1.HashSet

*它应该是用得最多得Set接口实现类了,主要记住几个重要的点就OK了。
  • 里面的元素是无重复的、无序的,但是可以有null值
  • 它对于重复元素的定义
  • 他是线程不安全的

其实他的底层是通过HashMap来实现的,当我们执行new HashSet();的时候发生了什么呢?
来看看HashSet的源码

public class HashSet<E>  extends AbstractSet<E>  implements Set<E>, Cloneable, java.io.Serializable
{
    private transient HashMap<E,Object> map;
    public HashSet() {
        map = new HashMap<>();
    }
    ...
}

发现了吗?其实就是实例化了一个HashMap对象,没错就是这么简单

下面再来看看,当我们往里面加元素的时候,它干了什么

	private static final Object PRESENT = new Object();
	...
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

其实,就是把输入的元素作为key,放到了hashmap中,所以加入到hashset中的元素显然是不能重复的。(其实它的很多东西和hashmap是相同的,比如线程不安全)

关于元素重复的定义
我们使用HashMap的结构来思考

在这里插入图片描述
首先key的位置是由它的hashcode决定的,所以当要加入的元素hashcode不同时,显然是可以放置在不同的bucket中的;其次,当元素的hashcode相同,但是equals不同时,显然是会放置在链表中的。

所以,要是想满足我们对set的定义,显然在自定义类中,重写hashcode和equal方法时,要注意一致性的问题。

2.TreeSet

TreeSet是根据元素的大小进行排序的,他会调用元素的compareTo方法来比较元素之间的大小,所以说,放入TreeSet中的元素必须要实现Comaprable接口并重写里面的compareTo方法。在Java的许多常用类已经替我们完成了这一步,所以我们通常没有意识到这一点,但是这是非常重要的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值