Collection

325 阅读2分钟

阅读

分析这个接口的实现List Set Queue,达到对Collection集合这么个大概念东西的了解

List

简单看ArrayList,LinkedList

ArrayList

  • fail-fst to iterator
  • 扩容oldcapcity>>1 增肌0.5倍
  • size记录有效值数
  • 操作时,会抛出各种Exception。比如,add抛出IndexOutOfBoundsException
  • 值可以为null

LinkedList

  • fail-fst to iterator
  • unit为Node,而且这个Node是双向链表
  • 实现了Dequeue接口,队列的特性,LinkedList也支持

总结:大量读,改值使用ArrayList。删除动作,或者每个item的大小不知,使用LinkedList。

这两个数据结构,判断是否存在某一个vaule的时候,使用的是equals方法。都对null进行了特殊处理。

Set

最大的一个特性就是没不能有重复值。对element的空的限制,主要看具体实现类。Set我们简单介绍下HashSet,TreeSet

HashSet

  • 数据实际存放在HashMap。key为传入的Object,value为空的Object
  • 为了实现存入的Object不重复,你必须保证Object的equals方法为true时,hashcode必须为true。
  • 这一点是对不重复的扩展。因为感觉很多人都不是很能理解equals和hashcode的关系。简单来说就是,有条原则:equals相等就代表相同,hashcode必须相同。想象下,在HashSet中,两个element,equal为true。但是,你没有重写hashcode,出现hashcode不同。那么散列到的位置也就不同,就出现了存储了重复的element的情况了。

这里,给出一个连接hashCode equals讲解。这篇很精髓了,值得一看。这里并没有指出LinkedHashSet,主要原因是和HashSet的主要区别在于换了个存储数据的结构,前者为LinkedHashMap。

TreeSet

同HashSet一样,主要区别再与,它存储数据的结构是TreeMap。

Queue

不同方法对特殊情况的处理不一样,先看下接口定义

add(E)//会抛出IllegalStateException(capcity的限制),ClassCastException,NullPointerException(不能为null),IllegalArgumentException(element一些属性限制加入queue)
offer(E)//ClassCastException,NullPointerException,IllegalArgumentException 返回truefalse
remove():E//NoSuchElementException(queue为空),返回头部的element
poll():E//返回头部的element,为空时返回null
element():E//返回头部element,但不删除 为空时,NoSuchElementException
peek():E//返回头部element,不删除。为空时返回null

由上面的接口定义可知:queue的Element不可为null。对队列为空时有的抛出异常,有的返回空(null)。这里有一个重点就是:支持capcity,即有界无界。

他的主要实现是LinkedList和并发里面的BlockingQueue

BlickingQueue