1004--Java集合--Set 接口
来源:互联网 发布:openwrt网络尖兵 编辑:程序博客网 时间:2024/05/21 20:23
--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(Objectobj)方法,以实现对象相等规则。
--重写 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)
ØSortedSetsubSet(fromElement,toElement)
ØSortedSetheadSet(toElement)
ØSortedSettailSet(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(Objectobj)方法比较返回值
--当需要把一个对象放入 TreeSet中,重写该对象对应的equals()方法时,
应保证该方法与 compareTo(Objectobj)方法有一致的结果:
如果两个对象通过 equals()方法比较返回true,
则通过 compareTo(Objectobj)方法比较应返回0
0 0
- 1004--Java集合--Set 接口
- java集合-Set接口
- 《JAVA集合中的Set接口》
- java中的集合之Set接口(三)
- java集合框架系列---Set接口
- Java复习之集合框架Set接口
- java 集合 Collection接口 List 和Set
- java基础--5.集合-6.Set接口
- JAVA集合框架之List Set接口
- java 集合(3) set 接口/ set 常用算法
- Java精选笔记_集合【Set(集合)接口】
- 小东吖 之 java Set接口 HashSet集合 TreeSet集合
- java 集合框架(3)Set接口和SortedSet接口
- Java集合之list接口与set接口
- 集合框架-Set接口
- 集合:接口Set
- java集合---set集合
- JAVA集合-Set集合
- int ,long , long long类型的范围
- 【leetcode】Distinct Subsequences
- java实现下雪雪花飘落并堆积效果
- 看了奇点大学的总决赛相关的视频,一些感悟
- UVa 11384 Help is needed for Dexter 正整数序列
- 1004--Java集合--Set 接口
- [leetCode] Maximal Square
- Cocos2d-x 的内存管理
- httpclient请求方式下的泛型json转换问题
- 博客创建
- java中FileOutputStream和FileInputStream类用法(总结的挺好)
- Python基础之变量类型
- poj 2513 Colored Sticks Trie树
- PHP开发之使用CodeIgniter搭建一个简单的项目