阅读
分析这个接口的实现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 返回true或false
remove():E//NoSuchElementException(queue为空),返回头部的element
poll():E//返回头部的element,为空时返回null
element():E//返回头部element,但不删除 为空时,NoSuchElementException
peek():E//返回头部element,不删除。为空时返回null
由上面的接口定义可知:queue的Element不可为null。对队列为空时有的抛出异常,有的返回空(null)。这里有一个重点就是:支持capcity,即有界无界。
他的主要实现是LinkedList和并发里面的BlockingQueue