容器的概念
容器指的是用于容纳收藏某种物体并进行一定程度管理的器具,这种东西在我们的日常生活中是非常常见的,比如我们吃饭时用到的锅碗瓢盆这些都是容器的范畴,可见容器是一个非常宽泛的概念。
在java中我们将容器的概念抽象出来,将在程序中定义来储存和管理数据的语法结构称作为容器。容器的功能就是对数据进行存储和管理,这样将范放宽来看,我们在类中定义的变量也可以看作是容器。在回顾之前谈及的数组结构,能够明显的发现,数组的作用就是对一组同类型的数据进行存储以及管理操作,因此数组也是一个容器。
在数组中,数据存储时是按照数组的序列也就是下标来进行存放和管理的。数组是一种简单的线性序列结构,可以让我们方便快捷地对其中地元素进行操作,但是对数组的操作并不灵活。这种现象在定义数组时体现得最为明显。我们都知道,定义数组时必须指定数组的长度,这也就意味着如果我们要储存的数据的数量超过了定义数组的长度时就必须对数组进行扩容操作,而扩容操作并不能在原数组的基础上进行,只能重新新建一个长度符合的数组然后将之前的数组中的内容拷贝到该数组当中。此外,当我们在一个数组中进行储存或者删除元素的操作时,数组中元素的序列会发生相应的变化,而我们并不能直接通过一个方法来添加或者删除一个元素,只能通过循环的方式来添加或者获取数组中的元素,所以从一定的角度来说,数组虽然属于容器的一个分支,但是它的使用确实存在不方便的地方。
为了弥补数组对数据操作中存在的缺陷,容器的概念便应运而生了。容器的英文表述为Collection直译为集合,因此容器也可以叫做集合。大部分容器的底层都是同过数组来实现的。在用容器进行数据储存时,数据储存的位置为内存,和储存在磁盘中不同,这是一种临时性的存储。
容器的分类
在java中,根据数据的存储方式不同,可以将容器分为单例集合和双例集合,其中到单例集合的存储方式通过接口Collection来定义,它指的是将数据一个一个的单独存储到容器中,在这个接口之下又定义了List接口和Set接口。List接口定义的容器对数据进行储存时是有序的,并且允许出现相同的数据,更像是一个高级的数组。List接口的实现类有ArrayList、LinkedList和Vector三类,着三个类实现了有序可重复的单例集合的存储以及操作。与List接口相对应的是Set接口,这个接口储存的是单例无序且不能重复的数据,它的存在更像是数学中集合的概念。Set接口也有三个实现类,它们分别是:UnkedHashSet、HashSet以及TreeSet。
除了单例集合外,java中还提供了双例集合,定义双例集合的接口是Map接口,这个接口只有HashTable、HashMap、TreeMap、UnkedHash、Properties等五个接口。所谓的双例集合,指的是基于key和Value的结构进行数据存储,说得直白点就是存储进去的值分为了两类——key和Value,它们之间的关系一一对应,一个key的值只能对应一个Value的值。这样一说应该能够明显感受到,这种存储方式和我们中学时学的函数的概念相吻合,因此在理解双例集合的时候可以把key的值理解为函数中的自变量x,而Value的值可以理解为自变量x对应的因变量y。