Java集合框架之Set接口浅析
Java集合框架之Set接口浅析
一、java.util.Set接口综述:
这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文
1.1Set接口简介
- java.util.set是Java集合框架体系中的重要成员
- Set接口的意义是,含有相等的元素。相等由集合内元素的equals方法决定。Set继承自Collection接口,可是事实上其所含的方法和Collection接口一样。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。
- Set的特点,主要由其内部的Map决定的,Set就类似于Map的一个马甲
- Set主要有2个实现方式,一个是TreeSet,另一个是HashSet
- Set是对数学上集的抽象,Set中不包含重复的元素.如何界定是否是重复元素?Set最多可含一个null元素;对于任意的非null元素e1和e2,都满足e1.equals(e2)==false.
- Object.hashcode()的约定:
- 在程序的一次执行中,无论何时在同一个java对象上重复调用hashcode(),都必须一致地返回同一个整数值,并不像Object.equals()那样提供Object是否被修改了的信息,但这个整数值不必在同一个应用程序的多次运行之间保持一致.
- 如果两个Object通过equals()判断是相等的,那么,在这两个Object上调用hashcode()必返回相同的值.
- 如果两个Object通过equals()判断是不相等的,那么,并不要求这两个Object.hashcode()返回不同的整数值.
- 对象的相等性
- 引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。
- 如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true
1.2Set体系结构:
从类图能够看出,AbstractSet接口继承于AbstractCollection。它是Set的抽象实现,可是其除了添加了equals和hashcode方法,其它方法均继承而来(removeall方法外)。
二、Set方法摘要:
方法摘要 | ||
---|---|---|
boolean |
add(E e) 如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。 |
|
boolean |
addAll(Collection<? extends E> c)
如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。 |
|
void |
clear()
移除此 set 中的所有元素(可选操作)。 |
|
boolean |
contains(Object o)
如果 set 包含指定的元素,则返回 true。 |
|
boolean |
containsAll(Collection<?> c)
如果此 set 包含指定 collection 的所有元素,则返回 true。 |
|
boolean |
equals(Object o)
比较指定对象与此 set 的相等性。 |
|
int |
hashCode()
返回 set 的哈希码值。 |
|
boolean |
isEmpty()
如果 set 不包含元素,则返回 true。 |
|
Iterator<E> |
iterator()
返回在此 set 中的元素上进行迭代的迭代器。 |
|
boolean |
remove(Object o)
如果 set 中存在指定的元素,则将其移除(可选操作)。 |
|
boolean |
removeAll(Collection<?> c)
移除 set 中那些包含在指定 collection 中的元素(可选操作)。 |
|
boolean |
retainAll(Collection<?> c)
仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。 |
|
int |
size()
返回 set 中的元素数(其容量)。 |
|
Object[] |
toArray()
返回一个包含 set 中所有元素的数组。 |
|
|
toArray(T[] a)
返回一个包含此 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。 |
三、Set和List的区别:
-
Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
-
Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
-
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
参考:
https://www.cnblogs.com/zfyouxi/p/5184247.html