11、集合--Set接口

时间:2021-11-29 15:33:28

  

Set如同一个罐子,可以把对象丢尽set集合

集合里多个对象之间没有明显的顺序

 

Set集合与Collection基本类似没有提供额外的方法

可以说Set就是一个Collection,只不过行为不同

 

Set不允许包含两个相同的元素

如果添加两个相同的元素,add()方法会返回false,并且不会添加新元素

 

基础知识

1、Hash表

Hash表是一种数据结构,用于查找对象。

Hash表位每个对象计算出一个整数称为Hash Code(哈希码)

Hash表是个链接式的队列

每个列表称为一个buckets(哈希表元)

对象位置的计算index = hashCode % buckets

HashCode为对象哈希码

buckets为哈希表元总数

 

添加元素时

有时会遇到已经填充了元素的哈希表元

这种情况称为Hash Collections 哈希冲突

此时必须判断该元素是否以及该存在该哈希表中

 

2、Comparable接口和Comparator接口

在“集合框架”中有两种比较接口,分别时ComparableComparator接口

像String和Integer等Java内建实现Comparable接口提供一定的排序方式

但是只能实现该接口一次

 

2.1、Comparable接口

在java.lang中,接口Comparable适用于一个类有自然排序

假定对象集合时同一个类型,该接口允许我们把集合排序成自然顺序

主要的方法:11、集合--Set接口

利用Comparable接口创建自己的类

只是实现compareTo()方法的问题

通常就是依赖几个数据成员的自然排序

同时类也应该覆盖equals()和hashCode()方法确保两个相等的对象返回一个哈希码

 

2.2、Comparator接口

可以使用自己的排列顺序

可以实现Comparator接口来定义一个比较器

---int compare(Object o1,Object o2):对o1、o2进行比较

---boolean equals(Object obj)z=:指示对象obj是否和比较器相等

 

2.3、SortedSet接口

提供了一个特殊的set接口SortedSet,他保持元素的有序顺序

此接口主要用于排序操作

即实现此接口的子类都属于排序的子类

 

添加到SortedSet实现类的元素都必须实现Comparable接口

否则必须给他的构造函数提供一个Compatator接口类的实现

类TreeSet是他的唯一一份实现

 

因为集必须包含唯一的项

如果添加元素时比较两个元素导致了0返回值

那么新元素姐没有添加进去

如果两个元素相等

但是如果不相等的话接下来就应该修改比较方法

让比较方法和equals()的效果一致

 

1、Comparator comparator():返回对元素进行排序时使用的比较器

  如果使用Comparable接口的compareTo()方法对元素进行比较,则返回null

2、Object first():返回有序集合中第一个元素

3、Object last():返回有序集合中的最后一个元素

4、SotredSet subSet(Object fromElement,Object toElement):

  反回从fromElement至toElement范围内的SoredSet视图集

5、SotredSet headSet(Object toElement):返回SotredSet的一个视图,期内各个元素皆小于toElement

6、SotredSet tailSet(Object fromElement):返回SotredSet的一个视图,期内各个元素皆大于fromElement(可等于) 

 

2.4、AbstractSet

AbstractSet类覆盖了Object的equals()和hashCode()方法

以确保两个相等的集返回的相同的哈希码

如果两个集大小相等且包含相同元素,则这两个集相等

按照定义,集的哈希码是集中元素哈希码的总和

因此无论按照内部的顺序如何,两个相等的集都会有相同的哈希码

 

2.5、HashSet和TreeSet

Java集合框架支持Set接口的两种普通实现

在更多情况下回使用HashSet存储重复*的集合

考虑到效率,添加到HashSet的对象需要采用恰当分配哈希码的方式来实现hashCode()

 

虽然大多数系统类覆盖了Object中缺省的hashCode()和equals()实现

当创建自己要添加HashSet时,需要覆盖这两个方法

 

当我们要从集合中以有序的方式插入和抽取元素时

Tree实现会有用处

添加到TreeSet的元素必须时可排序的

 

2.6、LinkedHashSet

是HashSet的扩展

如果想要跟踪添加给HashSet的元素的顺序

使用LinkedHashSet实现会有很大的帮助

LinkedHashSet的迭代器按照元素的插入顺序来访问各个元素

它提供了一个可以快速访问各个元素的有序集合

 

同时也增加了实现的代价

因为哈希表元中的各个元素都是通过双重链接式列表链接在一起