Java集合类
这里首先从整体上鸟瞰Java的集合框架,从整体上对集合的结构有个印象,如下是框架结构图。
Collection结构框架图:
map结构框架图:
从上图中可以看出,java的集合框架主要分为两个功夫流派。也就是collection和map。其中collection一派是集合派,map是key-value映射派。而collection派中还有个Iterable的东东称为迭代器,是用来遍历集合派中的每个元素的。就好像集合派祖传的点名册,上面记载了每个集合派中弟子的信息。这个东东是仅限于集合派才有的,那么如果map派也想要遍历的话,那么就只能将自己的元素,也就是key-value对封装为entry装入set中成为entryset。哎?摇身一变成为了集合派的成员,自然可以使用Iterable进行遍历了。
Collection
collection是java集合的顶层接口,java使用它规定了其内部存储的元素都是单元素类型。这个单元素是我自己造的词,是针对map中的映射而言的,就是其内部的每一个元素都是独立的存在。但是它是一个高度抽象的接口,并不规定元素与元素之间是一种怎样的顺序关系,元素与元素之间在逻辑上是怎样规定的(是否重复等),而这些都交给了它的小弟弟们实现。
这里面有一点需要注意的是Collection接口是继承自Iterable接口的,并且具有方法iterator(),该方法将返回一个Iterator对象,用于遍历集合中的元素,这样一来,他的小弟弟们就都具有了遍历的强大本领,这是java中著名的迭代器设计模式。将特定的集合与遍历的行为解耦。下面看一下Iterable接口有啥神奇的。
public interface Iterable<T>
{
Iterator<T> iterator();
default void forEach(Consumer<? super T> action)
{
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator()
{
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
这里面主要的iterator()方法,该方法被所有的集合类继承,因此可以返回特定的Iterator用于遍历集合元素。
List
List接口是collection接口的子接口,于是它自然就需要遵守collection立下的规定规定而只能存放单元素,它自己规定了元素的位置是一种顺序存放的形式存在。但是也并没有规定元素与元素之间是物理上相邻还是只是逻辑上相邻。于是这就又给了它的小弟弟们发挥的空间。
Set
set接口同样是collection的子接口,但是它相对于他的兄弟list而言,就要求它所管辖的元素并不需要有序的存放,但是这个哥们有个特殊的癖好就是要求它管辖的元素不能重名,至于这个重名的评判标准就要根据存放那是什么东东来具体确定了。
Queue
queue接口也是collection的子接口,它相对于它的同胞兄弟list显得更加严格了一点点。他由于看不惯list内管辖的小弟弟可以随便的插队,于是他要求取自己管理的不能插队,元素只能从头取第一个元素,添加元素只能添加到尾部。也就是规定了元素的顺序是先进先出的,这样被queue管理的元素就不大好走后门了。
Map
map接口不像collection那样喜欢自己的元素特地独行。他要求它管辖的元素必须要有伴侣。出来混怎么可以没有个伴呢,就好像咱么中国的一夫一妻制,扯远了。。。也就是元素之间具有映射关系,一个key对应一个value,通过key可以快速的找到value。但是他也并没有规定这些伙伴之间的顺序是怎样的,这将交给他的小弟弟们去实现。
接下来,我们将逐个击破,去看看他们的小弟弟们是怎么在大哥的指导下发挥作用的。