集合框架总结-set

Set集合:无序,不允许重复

扩展自Collection接口:

public interface Set<E> extends Collection<E>

1、允许使用null元素 2、这里没有什么新方法,只对 add()、equals() 和 hashCode() 方法添加了限制 3、HashSet和TreeSet是Set的实现 Set—>hashSet --> linkedHashSet SortedSet —> TreeSet

HashSet

HashSet类直接实现了Set接口, 其底层采用的是HashMap去实现的,将需要存储的数据作为map的key值,以常量PRESENT作为value值。

private transient HashMap<E, Object> map;
 private static final Object PRESENT=new Object();

--HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能

--向HashSet中添加元素时首先执行的是对象的hashcode值比较,如果两个对象的hashcode值相等时才会继续调用equals方法;如果两个对象的hashcode值不相等则不会调用equals方法初始化后台容量;

潜规则:不是Java的语法强制要求** 要求当两个对象的equals为true时,hashCode值必须相等**

生成一个HashSet的话,系统只提供key的访问; 如果有两个Key重复,那么会覆盖之前的;

LinkedHashSet

public class LinkedHashSet<E> 
		extends HashSet<E> 
		implements Set<E>, Cloneable, Serializable

LinkedHashSet是HashSet的一个子类,LinkedHashSet也根据HashCode的值来决定元素的存储位置,但同时它还用一个链表来维护元素的插入顺序,插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素

采用双向链表记录添加元素的顺序

LinkedHashMap类中的节点定义
			static class Entry<K,V> extends HashMap.Node<K,V> {
        		Entry<K,V> before, after;
		        Entry(int hash, K key, V value, Node<K,V> next) {
		            super(hash, key, value, next);
		        }
    		}

TreeSet

查看jdk源码发现底层是用TreeMap实现的,本质上是一个红黑树原理。正因为它是排序了的,所以相对HashSet来说,TreeSet提供了一些额外的按排序位置访问元素的方法,例如first(), last(), lower(), higher(), subSet(), headSet(), tailSet()

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable

TreeSet的排序分两种类型,一种是自然排序,另一种是定制排序。

几种Set的比较

HashSet:不保证元素的添加顺序,底层采用哈希表算法,查询效率高。判断两个元素是否相等equals方法返回为true要求hashCode值必须相等。即要求存入HashSet中的元素要覆盖equals方法和hashCode方法

LinkedHashSetLinkedHashSet是HashSet的子类,底层采用了哈希表算法以及链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于HashSet

TreeSet不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用红-黑树算法,树结构比较适合查询,但是添加的效率较低

各种Set集合性能分析

HashSet和TreeSet是Set集合中用得最多的集合。HashSet总是比TreeSet集合性能好,因为HashSet不需要额维护元素的顺序。

LinkedHashSet需要用额外的链表维护元素的插入顺序,因此在插入时性能比HashSet低,但在迭代访问(遍历)时性能更高。因为插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。

EnumSet元素是所有Set元素中性能最好的,但是它只能保存枚举类型的元素。

线程安全化

ArrayList和LinkedList线程不安全,针对线程安全的需求一般也不建议使用Vector。

List<Integer> list=Collections.synchronizedList(new ArrayList<>());

具体实现是在原来数据操作的基础上添加了一个全局锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值