java零基础入门-高级特性篇(一) 集合
集合框架是一个非常重要的知识点,有了集合框架,我们在处理一些特殊的数据结构的时候,可以直接用框架封装好的工具来帮助我们解决问题。
java对于集合框架的设计比较复杂,但是如果我们前面的知识点都有掌握好,学起来应该会减少很大的难度。
集合是什么
集合是用来存放对象引用的容器,对象是承载数据的载体,而集合可以将对象组成各种不同的数据结构。当我们需要将多个数据以某一种特定的结构进行数据传输的时候,集合就派上用场了。
首先说一下容器这个概念。我们在新建对象的时候,在内存中划分空间是随机的,我们不能将他们以一种方式组织起来,简单的说来就是无组织,无纪律。而如果我们在内存中直接为集合划分一个空间,然后将对象装入集合,那么这些对象就是有组织,有纪律的对象。
使用集合对比左边是没有容器来约束的,所以对象都是随机存储。而右图红色部分就是在装入对象之前,首先开辟一块内存给集合容器,然后往容器里面存放对象,有了集合的约束,对象就会按照集合的要求来排列,比如这里用的List集合容器,对象就会被排列成队列。
最常用的集合结构有3种,List 有序队列,Set无序队列,Map 键值对。
List 有序集合
通过名字就看到了,List集合是按顺序存放对象的,每个对象都有自己的下标,第一个0,第二个1,以此类推。下标不用我们去设置,而是集合本身根据添加进来的元素自动分配的。
有序集合Set 无序集合
排队是啥?不懂,往前冲就对了。没有先后顺序,没有任何标记,总之把对象丢进set以后,你就只知道他在里面,想要找到你需要的对象只能遍历集合,一个个找,直到找到你想要的那个。
既然set没有顺序,找起来这么麻烦,那要set有什么用?set最大的特点就是元素不会有重复。List虽然可以保证对象有序,但是无法保证集合里面的对象都不同,而set可以保证集合里面的对象都不同。
无序集合Map键值对
键值对,看名字就知道是一对一对的,一个key对应一个value,通过key去查找value。
比如你跟你的男朋友,女朋友就是一对一对的,想要找到你,你的女朋友有一万种方法,比如夺命连环call啊,微信表情轰炸啊,实在不行还有手机定位大法。map也是一样,想要找到value,只用通过key就行,有了key就找到value了。
当然,key是不能重复的,如果已经存在一个key,又往map里面添加一个有相同key的键值对,那么原来的键值对会被覆盖掉,用这个key只能查到最新的value,而不是以前的value。
键值对集合与数组的区别
其实说到集合,很多同学都会想到前面说过的一个概念 - 数组。数组不是也是用来装东西的么?那用数组不是就够了,为什么还要用集合呢?
我们首先来回忆一下数组的定义方式。
第一种:定义的时候就要放进去元素,静态初始化
int[] array = {1,2,3};
第二种:定义的时候要规定长度,动态初始化
int[] array = new int[3];
好了,各位发现问题没有?要么定义的时候就要将数据准备好,并且放进去,要么定义的时候就要规定好数组的长度。那么如果我现在想要一个容器来存对象,但是我既不知道对象长啥样,也不知道有多少个对象会放进去,这时候就无法使用数组来作容器了。
这种情况下,集合的作用就体现出来了。我只需要定义一个集合往哪一扔就够了,不需要知道对象长啥样,也不管有多少对象,来多少我往里塞多少就够了。
集合框架的结构
集合的家族很庞大,除了上面介绍的三种常用结构之外,还有很多结构可以使用,下面就从集合框架的设计来逐一说明。
1首先,不管我们定义一个什么结构的集合,他们都有共同的特点,那就是可以将集合里面的元素一个个数出来,也就是可以遍历。具体怎么数我不管,能数就行。是不是很自然的想到了接口?接口定标准,是个集合就能一个个数元素,所以集合体系最顶层的就是一个Iterable接口。
一个集合,要能往里面放元素吧,可以删除元素吧,对集合定义一些操作的标准,这个事Collection接口干了,Collection接口继承了Iterable接口,拥有了遍历元素的标准。
2继续来细化标准,有了操作元素的接口,就可以区分操作方式,比如通过下标操作集合,就有了List接口,没有操作下标功能的就成了Set接口。他们都继承于Collection接口,用于细化标准。
3集合都可以有一些公共的操作,比如转为数组,清空数组等操作,这时候是不是该抽象类出场了?抽象类实现公共方法给子类调用,但是又有部分方法需要到具体的实现类才能实现,所以使用抽象类而不是直接实现所有接口。
4到了这里还不能直接实现List和Set,因为就算是有序队列也不止是List这一种,所以这里先安排一个抽象类来获取集合的公共方法,方法就是继承AbstractCollection。然后可以实现大部分List和Set接口的方法了,只保留了部分特殊的方法留给子类实现,让最后实现List和Set的类有不同的功能。
5最后的常用实现类终于登场了,ArrayList和HashSet是最常用的List和Set接口的实现。通过继承AbstractList和AbstractSet,他们获得了抽象类的公共方法。Map也有类似的体系,这里就不具体介绍了。
从以上的体系中,我们可以看到,在做一个功能的时候,首先用接口定好标准,然后再用接口来扩展标准,用抽象类实现公共方法,再用继承来满足各种不同的需要形成最后使用的类。这样来设计功能,不仅分工明确,而且灵活可变,当需求发生变化时,可以有各种手段来扩展功能满足新的需求。
此图不是完整的集合框架图,只介绍了部分常用的集合以及在集合框架中的位置。
本章带各位大致了解了集合框架的体系结构,这对于我们后面详细解读常用集合非常有用。
最近连续加班和出差,更新慢了,不好意思啦各位。
网友评论