前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >排队的时候请学习List 不要做Set

排队的时候请学习List 不要做Set

作者头像
用户5745563
发布2019-07-04 11:11:36
3530
发布2019-07-04 11:11:36
举报
文章被收录于专栏:码思客码思客

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];

好了,各位发现问题没有?要么定义的时候就要将数据准备好,并且放进去,要么定义的时候就要规定好数组的长度。那么如果我现在想要一个容器来存对象,但是我既不知道对象长啥样,也不知道有多少个对象会放进去,这时候就无法使用数组来作容器了。

这种情况下,集合的作用就体现出来了。我只需要定义一个集合往哪一扔就够了,不需要知道对象长啥样,也不管有多少对象,来多少我往里塞多少就够了。

集合框架的结构

集合的家族很庞大,除了上面介绍的三种常用结构之外,还有很多结构可以使用,下面就从集合框架的设计来逐一说明。

首先,不管我们定义一个什么结构的集合,他们都有共同的特点,那就是可以将集合里面的元素一个个数出来,也就是可以遍历。具体怎么数我不管,能数就行。是不是很自然的想到了接口?接口定标准,是个集合就能一个个数元素,所以集合体系最顶层的就是一个Iterable接口。

一个集合,要能往里面放元素吧,可以删除元素吧,对集合定义一些操作的标准,这个事Collection接口干了,Collection接口继承了Iterable接口,拥有了遍历元素的标准。

继续来细化标准,有了操作元素的接口,就可以区分操作方式,比如通过下标操作集合,就有了List接口,没有操作下标功能的就成了Set接口。他们都继承于Collection接口,用于细化标准。

集合都可以有一些公共的操作,比如转为数组,清空数组等操作,这时候是不是该抽象类出场了?抽象类实现公共方法给子类调用,但是又有部分方法需要到具体的实现类才能实现,所以使用抽象类而不是直接实现所有接口。

到了这里还不能直接实现List和Set,因为就算是有序队列也不止是List这一种,所以这里先安排一个抽象类来获取集合的公共方法,方法就是继承AbstractCollection。然后可以实现大部分List和Set接口的方法了,只保留了部分特殊的方法留给子类实现,让最后实现List和Set的类有不同的功能。

最后的常用实现类终于登场了,ArrayList和HashSet是最常用的List和Set接口的实现。通过继承AbstractList和AbstractSet,他们获得了抽象类的公共方法。Map也有类似的体系,这里就不具体介绍了。

从以上的体系中,我们可以看到,在做一个功能的时候,首先用接口定好标准,然后再用接口来扩展标准,用抽象类实现公共方法,再用继承来满足各种不同的需要形成最后使用的类。这样来设计功能,不仅分工明确,而且灵活可变,当需求发生变化时,可以有各种手段来扩展功能满足新的需求。

此图不是完整的集合框架图,只介绍了部分常用的集合以及在集合框架中的位置。

本章带各位大致了解了集合框架的体系结构,这对于我们后面详细解读常用集合非常有用。

PS:最近连续加班和出差,更新慢了,不好意思啦各位。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码思客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档