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接口
在“集合框架”中有两种比较接口,分别时Comparable和Comparator接口
像String和Integer等Java内建实现Comparable接口提供一定的排序方式
但是只能实现该接口一次
2.1、Comparable接口
在java.lang中,接口Comparable适用于一个类有自然排序
假定对象集合时同一个类型,该接口允许我们把集合排序成自然顺序
主要的方法:
利用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的迭代器按照元素的插入顺序来访问各个元素
它提供了一个可以快速访问各个元素的有序集合
同时也增加了实现的代价
因为哈希表元中的各个元素都是通过双重链接式列表链接在一起