Set、HashSet、TreeSet原理和特点

集合的体系

------------| Collection 单列集合的根接口

-----------------| List 实现了List接口的结合类,具备的特点:有序,可重复

---------------------- | ArrayList ArrayList底层是维护了一个Object数组来实现的,特点:查询速度快、增删慢。

---------------------- | LinkedList LinkedList底层是使用了链表数据结构实现的。特点:查询速度慢,增删快。

---------------------- | Vector Vector类可以实现可增长的对象数组,底层也是维护了一个Object数组。

-----------------| Set 实现了Set接口的集合类,具备的特点:无序,不可重复

---------------------- | HashSet 底层是使用了哈希表来支持的,特点:存取速度快。

---------------------- | TreeSet 如果元素具备自然顺序的特性,那么会按照元素自然顺序的特性进行排序存储。

Set接口特有的方法

继承了collection的方法,没有特殊的方法。

HashSet类中的方法

add()、clear()、clone()、contains()、isEmpty()、iterator()、remove()、size()

也没有特殊的方法。

HashSet的实现原理:

往HashSet添加元素的时候,HashSet会先调用元素的hashcode方法得到元素的哈希值,然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置(注:哈希表的存储位置与内存地址区分开)。

情况1:如果算出的元素存储的位置目前没有任何元素存储,那么该元素可以直接到该位置上。

情况2:如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法(比较的内存地址)与该位置上的元素在比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行添加。

注:hashCode()方法默认情况下表示的是内存地址,String类已经重写了Object的HashCode方法了。

TreeSet

如果元素具备自然顺序的特性,那么会按照元素自然顺序的特性自动进行排序存储。

如果添加了没有可比性的元素会报错,因为TreeSet会自动帮我们排序。

TreeSet要注意的事项:

1、往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。

2、往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。

元素与元素之间的比较规则:compareTo(T o)方法返回负整数、零或正整数,表示此对象是小于、等于还是大于指定对象。

3、如果比较元素的时候,compareTo(T o)方法返回的是0,那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法是没有任何关系的。)

4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现omparable接口,那么必须要在创建TreeSet的时候传入一个比较器。

如何自定义一个比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的规则定义在compare方法内即可。

自定义比较器的格式:

class 类名 implements Comparator{

}

推荐使用:使用比较器(Comparator)

5、往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,再创建TreeSet对象的时候也传入了比较器,那么是以比较器的比较规则优先使用。

TreeSet的存储原理:

底层是使用红黑树数(二叉树)据结构实现的

TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口。

字符串的比较规则:

情况一:可以找到对应不同的字符,比较的就是对应位置上的字符。

情况二:找不到对应不同的字符,比较的就是字符串的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值