请人做网站后台密码,室内设计师网上培训班,甘肃兰州旅游必去十大景点,服装网站建设中期目标一、Set接口的特点
一个不包含重复元素的collection。更确切地讲#xff0c;Set不包含满足e1.equals(e2)的元素对 e1和e2#xff0c;并且最多包含一个null元素。
Set集合由Set接口和Set接口的实现类组成#xff0c;Set接口继承了Collection接口#xff0c;因此包含了Coll…一、Set接口的特点
一个不包含重复元素的collection。更确切地讲Set不包含满足e1.equals(e2)的元素对 e1和e2并且最多包含一个null元素。
Set集合由Set接口和Set接口的实现类组成Set接口继承了Collection接口因此包含了Collection接口的所有方法。其主要实现类有HashSet和TreeSet在HashSet的基础上又延伸出了LinkedHashSet。
HashSet和TreeSet的不同就在于如何判断两个数是否相同的方法上。
1.HashSet判断两个对象是否相同的方法时继承自Object类的equals方法
public boolean equals(Object o)方法只可以比较是否相等相等返回true反之返回false。
2.TreeSet判断两个对象是否相同的方法则是Comparable接口中的compareTo()方法
public void int compareTo(Object o)方法不仅可以比较是否相等还可以比较大小如果相等返回0调用者大于参数则返回正数否则返回负数
所以可以得到添加到TreeSet中的对象必须实现Comparable接口。同时如果使用HashSet则最好重写equals()方法。
二、HashSet
HashSet实现了Set接口基于HashMap进行存储。遍历时不保证顺序并不保证下次遍历的顺序和之前一样。HashSet中允许null值。
进入到HashSet源码中我们发现所有数据存储在
private transient HashMapE, Object map;
private static final Object PRESENT new Object();意思就是HashSet的集合其实就是HashMap的key的集合然后HashMap的val默认都是PRESENT。HashMap的定义即是key不重复的集合。使用HashMap实现这样HashSet就不需要再实现一遍。
所以所有的addremove等操作其实都是HashMap的add、remove操作。遍历操作其实就是HashMap的keySet的遍历。
1.HashSet底层实际上是一个HashMapHashMap底层采用了哈希表数据结构。
2.哈希表又叫散列表哈希表底层是一个数组这个数组中每一个元素是一个单向链表每个单向链表都有一个独一无二的hash值代表数组的下表。在某个单向链表中的每个节点上的hash值是相同的。hash值实际上是key调用hashCode方法再通过“hash function”转换成的值。
3.如何向哈希表中添加元素
先调用存储的key的hashCode方法经过 某个算法得到hash值如果这个哈希表中不存在这个hash值则直接加入元素。如果该hash值已经存在继续调用key之间的equals方法如果equals方法返回false则将该元素添加。如果equals方法返回true则放弃添加该元素 即元素重复。HashMap和HashSet的初始化容量是16默认加载因子是0.75。
另外HashSet完全继承了Set或者Collection里的方法实现add、addAll、clear、isEmpty、size、contains、iterator、remove等
三、TreeSet
TreeSet类型是J2SE中唯一可实现自动排序的类型
TreeSet是SortedSet接口的唯一实现类TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式自然排序 和定制排序其中自然排序为默认的排序方式。向 TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false或者通过CompareTo方法比较没有返回0
TreeSet集合可以对Set集合中的元素进行排序。是不同步的。
但是TreeSet集合的存储是有序的即存储到集合中的元素是按自然顺序存储的。
判断元素唯一性的方式
根据比较方法的返回值来判断。是0零就存入集合不是0就不存。因为Set集合是不能有重复的元素无序。
TreeSet要注意的事项
1.往TreeSet里面添加元素时候如果元素本具备自然顺序特性那么就按照元素的自然顺序排序存储.
2.往TreSet里面添加元素时候如果元素不具备自然顺序特性那么该元素就必须要实现Comparable接口把元素的比较规则定义在compareTo(T o)方法中
3.如果比较元素的时候compareTo返回的是0那么该元素被视为重复元素不允许添加 (注意TreeSet与HashCodeequals没有任何关系)
4.往TreeSet里面添加元素时候如果元素本身不具备自然自然顺序特性而且元素所属类也没有实现Comparable接口那么我们必须要在创建TreeSet的时候传入一个比较器.
自定义比较器
自定一个比较器只需要实现接口 Comparator即可把元素与元素之间的比较规则定义在compare方法内即可
自定义比较器的格式
class 类名 implements ComparatorT{}一、自然排序
实现Comparable接口比较元素
自然排序使用要排序元素的CompareToObject obj方法来比较元素之间大小关系然后将元素按照升序排列。
Java提供了一个Comparable接口该接口里定义了一个compareTo(Object obj)方法该方法返回一个整数值实现了该接口的对象就可以比较大小。
obj1.compareTo(obj2)方法如果返回0则说明被比较的两个对象相等如果返回一个正数则表明obj1大于obj2如果是 负数则表明obj1小于obj2。
如果我们将两个对象的equals方法总是返回true则这两个对象的compareTo方法返回应该返回0
二定制排序
自定义比较器比较元素
自然排序是根据集合元素的大小以升序排列如果要定制排序应该使用Comparator接口实现 int **compare(To1,To2)**方法
三TreeSet总结
1.特点
TreeSet是用来排序的可以指定一个顺序对象存入之后会按照指定的顺序排列
2.使用方式
1自然顺序Comparable
TreeSet类的add()方法会把存入的对象提升为Comparable类型
调用对象的comparaTo()方法和集合中的对象比较
根据comparaTo()方法返回的结果进行存储
2比较器顺序
创建TreeSet的时候可以指定一个Comparator
如果传入了Comparator的子类对象那么TreeSet就会按照比较器的顺序排序。
add()方法内部会自动调用Comparator接口中的compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
3两种方式的区别
TreeSet构造函数什么都不传默认按照类中Comparable的顺序没有就报错ClassCastException
TreeSet如果传入Comparator就有先按照Comparator
四、LinkedHashSet
一、LinkedHashSet概述
LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置但它同时使用链表维护元素的次序这样使得元素看起来是以插入的顺序保存的。也就是说当遍历LinkedHashSet集合里元素时HashSet将会按元素的添加顺序来访问集合里的元素。
LinkedHashSet需要维护元素的插入顺序因此性能略低于HashSet的性能但在迭代访问Set里的全部元素时将有很好的性能因为它以链表来维护内部顺序。
二LinkedHashSet结论
输出LinkedHashSet集合中的元素时元素的顺序总是和添加顺序一致。