java容器---List

刚刚公司入职,加入了云计算项目组,还没有确定加入哪一个小组,所以最近比较闲,所以看了下jdk的源代码,想深入了解下工具类的实现,并且尝试着想深入理解下设计思想。
开始随便看了看容器类的结构,觉得好复杂,也无比膜拜Josh Bloch大神,接口间复杂的继承关系,让我这等俗人根本无法理解他的设计意图,多层接口的继承也是为了更易于扩展,当然根据实际的场景来理解多层的接口继承可以稍稍地领会容器的设计意图。比如过,图形接口三角形接口等边三角形、等腰三角形等等,容器的设计也类似于此。容器可以分为两条线,Collection和Map,Collection接口有一个直接的抽象类AbstractCollection来实现它,AbstractCollection提供了Collection的一个基本实现框架。因为Collection可以扩展为Set和List接口,AbstractCollection就抽象出了list和set中共同的一些功能代码,AbstractList和AbstractSet也一样。然后就有了Vector、ArrayList、LinkList等等的一些具体实现类(set部分的还没开始看,所以这部分的就不提及了)。需要强调的是,LinkList类之上还有一个AbstractSequenceList,这个抽象类的设计主要是为了考虑扩展不同的线性List;Stack extends自Vector,因此java中的stack也可以使用vector中的public方法,不仅仅只是pop和push。
上午就看了List部分的源代码,想比较下Vector、ArrayList、LinkList。
<table>
<tr><td></td><td>Vector</td><td>ArrayList</td><td>LinkList</td><td>备注</td></tr>
<tr><td>功能描述</td><td>提供了一个空间可变的集合,一个可以根据需要增加或者减少空间的数组。并且这个增量是可控的。</td><td>和Vector类似,不过增量是固定值。</td><td>提供了一个线性的容器,也可以用来实现stack、queue。</td><td>备注</td></tr>
<tr><td>同步性</td><td>同步的</td><td>非同步的</td><td>非同步的</td><td>(讨论必要性)多线程下,用Vector,一般使用ArrayList</td></tr>
<tr><td>初始化空间</td><td>如果给定了初始化大小,那么按给定初始化空间;如果没有给定,那么默认是10个元素</td><td>与Vector一样</td><td>Size为0,但是里面是有一个Entity元素的</td><td>备注</td></tr>
<tr><td>空间增加方式</td><td>如果给定了空间增长值,那么按给定的值如果没有(默认为0),翻倍*2</td><td>空间增长值不可控,增长空间的一半</td><td>实体节点的形式增加</td><td>备注</td></tr>
<tr><td>序列化</td><td>所有的都能序列化</td><td>部分序列化,缓存数组通过writeObject来实现(考虑到数字中会预留空间)</td><td>部分序列化,头元素header,size不需要序列化(header没有实际内容),size为什么不序列化,不清楚</td><td>备注</td></tr>
<tr><td>底层实现</td><td>通过数组</td><td>数组</td><td>实体类entry:pre,element,next</td><td>备注</td></tr>
<tr><td>效率</td><td>最低</td><td>适合随机查取</td><td>插入</td><td>备注</td></tr>
</table>

 

你可能感兴趣的:(Collection)