--Set接口是Collection的子接口,set接口没有提供额外的方法
--Set 集合不允许包含相同的元素,
如果试把两个相同的元素加入同一个 Set集合中,则添加操作失败。
--Set 判断两个对象是否相同不是使用==运算符,
而是根据 equals 方法
Set实现类之一:HashSet
--HashSet是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
--HashSet按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
--HashSet
具有以下特点:
Ø
不能保证元素的排列顺序
Ø
HashSet
不是线程安全的
Ø
集合元素可以是
null
当向
HashSet
集合中存入一个元素时,
HashSet
会调用该对象的
hashCode
()
方法来得到该对象的
hashCode
值,
然后根据
hashCode
值决定该对象在
HashSet
中的存储位置。
HashSet
集合判断两个元素相等的标准
:
两个对象通过
hashCode
()
方法比较相等,
并且两个对象的
equals()
方法返回值也相等
。
/*
* Set:存储的元素是无序的,不可重复的!
* 1.无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
* 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
*
* 说明: 要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。 进而保证Set中元素的不可重复性!
*
* Set中的元素时如何存储的呢?使用了哈希算法。
* 当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值
* 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置
* 已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。 万一返回false呢,都存储。(不建议如此)
* >要求:hashCode()方法要与equals()方法一致。
*/
* Set:存储的元素是无序的,不可重复的!
* 1.无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
* 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
*
* 说明: 要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。 进而保证Set中元素的不可重复性!
*
* Set中的元素时如何存储的呢?使用了哈希算法。
* 当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值
* 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置
* 已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。 万一返回false呢,都存储。(不建议如此)
* >要求:hashCode()方法要与equals()方法一致。
*/
hashCode() 方法
--如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,
hashSet将会把它们存储在不同的位置,但依然可以添加成功。
--对于存放在
Set
容器中的对象,
对应的类一定要重写
equals()
和
hashCode
(Object
obj
)
方法,以实现对象相等规则。
--重写
hashCode
()
方法的
基本原则
Ø
在程序运行时,同一个对象多次调用
hashCode
()
方法应该返回相同的值
Ø
当两个对象的
equals()
方法比较返回
true
时,这两个对象的
hashCode
()
方法的返回值也应相等
Ø
对象中用作
equals()
方法比较的
Field
,都应该用来计算
hashCode
值
Set实现类之二:LinkedHashSet
--LinkedHashSet
是
HashSet
的子类
--LinkedHashSet
根据元素的
hashCode
值来决定元素的存储位置,
但它同时使用链表维护元素的次序,这使得元素看起来是以
插入顺序保存
的。
--LinkedHashSet
插入
性能略低于
HashSet
,
但在迭代访问
Set
里的全部元素时有很好的性能。
--LinkedHashSet
不允许集合元素重复。
Set实现类之三:TreeSet
--TreeSet
是
SortedSet
接口的实现类,
TreeSet
可以确保集合元素处于排序状态。
Ø
Comparator
comparator
()
Ø
Object first()
Ø
Object last()
Ø
Object lower(Object e)
Ø
Object higher(Object e)
Ø
SortedSet
subSet
(
fromElement
,
toElement
)
Ø
SortedSet
headSet
(
toElement
)
Ø
SortedSet
tailSet
(
fromElement
)
/*
* TreeSet: 1.向TreeSet中添加的元素必须是 同一个类的。
* 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历。
* 3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
* 4.自然排序:要求自定义类实现 java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法
* 在此方法中,指明按照自定义类的哪个属性进行排序。
*
* 5.向TreeSet中添加元素时,首先按照 compareTo()进行比较,一旦返回0,虽然仅是两个对象的此
* 属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
*
* > compareTo()与hashCode()以及equals()三者保持一致!
*/
* TreeSet: 1.向TreeSet中添加的元素必须是 同一个类的。
* 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历。
* 3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
* 4.自然排序:要求自定义类实现 java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法
* 在此方法中,指明按照自定义类的哪个属性进行排序。
*
* 5.向TreeSet中添加元素时,首先按照 compareTo()进行比较,一旦返回0,虽然仅是两个对象的此
* 属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
*
* > compareTo()与hashCode()以及equals()三者保持一致!
*/
--TreeSet
两种排序方法:
自然排序
和
定制排序
。默认情况下,
TreeSet
采用自然排序。
排 序——自然排序
--自然排序:
TreeSet会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序排列
如果试图把一个对象添加到
TreeSet
时,则该对象的类必须实现
Comparable
接口。
Ø实现 Comparable的类必须实现compareTo(Objectobj)方法,
两个对象即通过 compareTo(Objectobj)方法的返回值来比较大小。
Comparable 的典型实现:
ØBigDecimal、BigInteger以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
ØCharacter:按字符的unicode值来进行比较
ØBoolean:true对应的包装类实例大于false对应的包装类实例
ØString:按字符串中字符的unicode值进行比较
ØDate、Time:后边的时间、日期比前面的时间、日期大
--向 TreeSet中添加元素时,只有第一个元素无须比较compareTo()方法,
后面添加的所有元素都会调用compareTo()方法进行比较。
--因为只有相同类的两个实例才会比较大小,所以向
TreeSet
中添加的应该是同一个类的对象
--
对于
TreeSet
集合而言,它
判断两个对象是否相等的唯一标准
是:
两个对象通过
compareTo
(Object
obj
)
方法比较返回值
--当需要把一个对象放入
TreeSet
中,重写该对象对应的
equals()
方法时,
应保证该方法与
compareTo
(Object
obj
)
方法有一致的结果:
如果两个对象通过
equals()
方法比较返回
true
,
则通过
compareTo
(Object
obj
)
方法比较应返回
0