Set个人认为与Map没有多大区别,只是不能够存储重复元素和有些set不允许null值,在Java API叙述如下:
?一个不包含重复元素的 collection。更确切地讲,set 不包含满足class="Apple-converted-space">?e1.equals(e2)
?的元素对?e1
?和?e2
,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的?set?抽象。?
针对几种常见的set类大多实现结构和算法差不多,这里只是简单描叙几个有所差别的LinkedHashSet,ConcurrentSkipList
LinkedHashSet继承hashset,具有双重列表,其实在内部视线中,就是跟linkedhashmap差不多,只是将entry中key存储set值而value赋值一个永久不变的object(#1),这样虽然具有了linkedhashmap的唯一key,但是浪费了存储空间,但是我并没有找到维护其链表结构的源代码
#1
??private?static?final?Object?PRESENT?=?new?Object();
??public?boolean?add(E?e)?{
?
????????return?map.put(e,?PRESENT)==null;
????}
ConcurrentSkipList是一个基于ConcurrentSkipMap的可伸缩NavigatorSet的实现,主要就是说具有并发线程安全,视图导航(能够快速比对查找元NavigatorSet素),排序功能(SortSet)。与之对应的有ConcurrentSkipListMap,也是继承ConcurrentNavigatorMap与sortMap的实现,基本类似
?
?
Queue队列,基于Collection与Iterable的实现,具有存储元素与迭代输出的功能,双向队列基于单向队列实现,主要为实现单向队列的功能进行简单解析
具体实现超级接口主要为blockingqueue,已知实现类为AbstractQueue,?ArrayBlockingQueue,?ArrayDeque,?ConcurrentLinkedQueue,?DelayQueue,?LinkedBlockingDeque,LinkedBlockingQueue,?LinkedList,?PriorityBlockingQueue,?PriorityQueue,?SynchronousQueue,
ArrayQueue可变大小队列,非线程安全,基于数组实现
ArrayBlockingQueue:适合于使用生产者-消费者模式,固定大小数组final?Object[]?items,并且可以进行定时执行操作,从源代码上可以得出使用ReentrantLock与condition进行控制时间(比如delayqueue),即在我们使用时需要指定大小,并且可以使用poll(time,timeout)的方法进行时间控制,在scheduleThreadpoolexecutor有使用
Linked?BlockingQueue基于双向列表构建实现的节点队列,阻塞队列(即时容量默认,可指定容量大小,但是超过容量既不会再创建,变会出现供小于求)线程安全地的
PriorityQueue基于优先级的无界队列,其实就是进行排序,优先级高即排序顺序靠前,可以指定compator进行自定义排序,线程安全的PriorityBlockingQueue
ConcurrentLinkedQueue其实是和ConcurrentLinkedlist在特性上是差不多的,但是线程安全使用的是voltitle原子性操作,并非为锁机制
SynchronousQueue一种阻塞队列,个人从来没有用过,没有过应用场景不过从叙述中好像这种队列在某些场合非常起作用,,具体实现没有看懂,不过大概是通过voltitle逻辑判断来进行线程控制的,个人水平有限,下面是API的叙述,,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行?peek,因为仅在试图要移除元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)插入元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头?是尝试添加到队列中的首个已排队插入线程的元素;如果没有这样的已排队线程,则没有可用于移除的元素并且?poll()?将会返回??null。对于其他?Collection?方法(例如?contains),SynchronousQueue?作为一个空 collection。此队列不允许?null?元素。
同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。?