Java中的集合框架
什么是集合
集合和数组一样,是一个用来储存数据的容器。
集合与数组的区别
那之前学习过的有数组这个容器了,那这个集合和数组有什么区别呢?
数组储存的元素类型必须一致。一但定义,长度就不能变动,也就是数组的大小是固定的。
而集合储存的元素就是多样的了,可以储存多种数据类型(只能是引用数据类型,基本数据类型会自动装箱为包装类)。集合的大小是可以变动的。
Collectoin(单列集合)
Collectoin就是单列集合,它和双列集合的不同是,单列集合中的每一个元素都是单独的存在,只呈现一列,所以被称为是单列集合。
Collectoin是一个接口,接口就意味着它是个抽象的,想要使用它里面的方法就必须要用子类对象才行。
Collectoin有两个子接口:List接口和Set接口。
List接口的集合是可以重复的,且可以由添加的顺序来控制元素的顺序。
Set接口的集合是不允许重复的,且无序排列的(不保证输出顺序,但可以使用排序规则)。
List接口
List接口里也是都是抽象的方法,它只不过继承了Collectoin中的抽象方法,想要实现就必须要有实现类。
List中常用的实现类有两个:ArrayList和LinkedList。
ArrayList
ArrayList:是最常用的数据存储容器,它的底层是用一个数组数据结构来实现的。所以它有和数组一样的特点:拥有下标,查询快,增删慢。
数组是有下标的,这就相当于是门牌号。当需要查找某一元素时,只要知道其对应的下标,就可以方便快捷的查找到想要的元素。但是这样也有一个弊端:当想要在数组的中间插入或者删除元素时,其身后的每一个元素都需要进行顺位修改。所以数组对增删操作是极其不便的。
LinkedList
LinkedList:他的底层是用一个链表数据结构实现的。链表结构的特点就是增删快、查询慢。
为什么链表结构的特点是增删快呢?在内存中,元素之间是相互两两连接的。我们知道,数据在内存中是有地址的,链表结构里的每个元素都保存了两个地址(除了开始和结束),第一个元素保存了第二个地址,第二个元素保存了第一个元素和第三个元素的地址,第三个元素保存了第二个元素和第四个元素的地址,以此类推。当我们需要查找某一个元素时,会从第一个元素开始比对。第一个元素并不是,于是顺着第一个元素的地址找到第二个元素。第二个元素也不是,于是顺着第二个元素的地址找到第三个元素。就这样一个一个寻找下去。
所以链表结构对查询的操作是很不方便的。而相应的,这样的储存方式却极大的方便了增删操作。
例如,要在第三个元素和第四个元素之间增加一个元素。第三个元素储存的是二和四的地址,第四个元素储存的是三和五的地址,现在在他俩之间添加一个新元素。这样的地址就变成了:第三个元素储存第二个和新元素的地址,新元素储存的是第三个和第四个元素的地址,第四个元素储存的是新元素和第五个元素的地址。这样说可能有点绕,还是看看图吧。
这下大致有点理解了吧,添加和删除元素只会影响到其相邻的两个元素,并不会对其他元素产生影响。
所以链表结构的优点就是增删操作非常便捷。缺点就是查找不易。