上次说到集合的前置知识泛型,那么今天就浅谈一下Java中的集合。
很多人在使用集合时都会发出疑问,集合那么多我到底应该用哪一个呢?
其实大致划分一下,集合就两种,一种是用于存储键值对关系的Map,另一种是存储唯一对象的Collection。
从源码中不难看出,Collection和Map都是接口,它们下面都有对应的实现类,而Map的实现类要少于Collection。
Map中常用的实现类便是HashMap了,其它类各有各的小特点但是万变不离其宗,它们都是以键值对的映射关系为核心的。
Collection下还根据特性细分了三大接口:List,Set,Queue。
1、List中存储的元素是有序的,可重复的。使用集合存储数据若没有额外的需求的话一般都用它了,最常用的实现类是ArrayList。
2、Set中存储的元素是不可重复的,且往往还是无序的。若需要存储不可重复的数据就用它。最常用的实现类是HashSet。
3、Queue中的元素是有序且可重复的,但这个有序是指特定规则下的有序,它最大的特点就是能根据特定规则操作元素(例:先进先出规则)。常用实现类有:ArrayDeque,LinkedList。而LinkdeList同时也实现了List。
对于集合,记住这些大分类即可,其他的一些小实现类也就是一些小特性的不同,以后如果用到自然能触类旁通,整理如下:
作为顶级接口的Collection自然也定义了一些抽象方法去规范子类的行为。对于集合来说核心功能自然是增删改查,但在翻看源码时可以发现,其中更多的是增删改,并没有直接查询接口。这也是因为Collection的三大接口处理数据的方式各有不同所导致的。
List类似数组,你可以通过下标直接访问,但是Set就不行了,它是无序且不可重复的,有没有下标都不一定。Queue就更特殊,它是根据特定规则去处理数据的。所以Collection就不好直接定义集合的访问方法,但是数据的访问方法太过重要。所以Collection中定义了一个将集合转换为数组的方法:toArray( )方法,使用此方法后,无论你用的是哪种集合,你都可以用访问数组的方法去访问集合了。
但这时就会有新的问题了,我用集合就是为了它的某种便利性,你又给我转回数组,那为什么我不直接使用数组呢?
所以Collection作为老父亲就需要一种方法,这种方法需要满足它之下子类们的个性,又需要满足数据访问的共性。
这种方法自然就是我们的迭代器了。