Set,TreeSet,HashSet,SortedSet,LinkedHashSet的区别
(1)Set接口
不允许出现重复的元素,每个元素添加入set时,set集合会使用equals方法,判断集合中是否有相同的元素,如果有,就返回false,如果没有,才进行操作。同时set的元素是无序的,就是说输出set集合中元素时,不是按照存入的顺序进行输出的
(2)HashSet
是Set接口的实现类,HashSet不能保证元素的排列顺序,顺序有可能会发生变化
同时,HashSet不是同步的,也就是说不是线程安全的,集合中可以有一个null。
HashSet的底层实现是HashMap,在HashSet中,元素都存在HashMap键值对的key上面,而value是由一个统一的值,private static final Object PRESENT = new Object();,(定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。)
所以在hashSet插入元素的时候,底层的hashmap会判断key值是否存在,如果不存在,则插入
而hashmap判断key是否存在的方式是通过遍历hashmap中所有元素的hashcode是否和要插入元素的hashcode相同
(3)SortedSet
SortedSet中的元素无序不可重复,但是存进去的元素可以按照元素大小顺序自动排序
(4)TreeSet
是SortedSet接口的唯一实现类。TreeSet可以确保集合元素处于排序状态,支持两种排序:自然排序和定制排序,默认是自然排序。
TreeSet中元素也是不能重复的,判断两个对象不相等的方式是两个对象通过equals方法返回false或者通过CompareTo方法比较没有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口T’r的对象就可以比较大小。
obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。
如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0
定制排序
自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(To1,To2)方法
(5)LinkedHashSet
LinkedHashSet维护着一个运行于所有条目的双向链表,在链表中定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
LinkedHashSet继承了HashSet,又基于LinkedHashMap的实现。底层使用LinkedHashMap来保存所有的元素,和hashset保存元素的方式类似,而操作方法上又与HashSet相同。
所以如果想要保存插入顺序或者访问顺序,就使用LinkedHashMap,如果要将插入元素按照我们想要的顺序存储,就使用TreeSet
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10900.html