- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
- Selenium Web Driver自动化测试(java版)系
上回我们介绍了一维数组和二维数组,并简单演示了几个示例。java中的数组只允许我们要么存相同类型的数据,要么存能够自动转换的数据,除此之外都不行了。那有人又说了,我就想存不同类型的行不行?那就不能用数组了,java给我们提供了另一种数据结构来实现这个目的,叫做集合。集合就像个麻袋一样,什么都可以装,你不用在乎类型相同不相同,可不可以自动转换。而且数组还有一个缺点,咱们之前也提到过,数组是定长的,你得给它定好长度,而且一旦定好了还不能改了,很让人纠结。可麻袋,哦不,集合不是定长的,是可变的,你不用定义这个大麻袋有多大,反正随着你往里添东西它自动越来越大。
集合也分好几种,我们第一个要介绍的叫做List的集合。看看java文档,我们发现List是一个接口,在一个叫做java.util的包下。它还有几个实现它的类,比如说ArrayList,LinkedList,Vector还有Stack。
这几个类其实都比较类似,我们这里就讲一个,一个会了别的也就基本上会了。我们就选其中一个最经常用的: ArrayList。ArrayList是个类,所以声明出来的也是一个引用类型,声明过程就是:
ArrayList al = new ArrayList();
它的样子和数组很像,也是好几个位置,只不过每一个里面都可以存不同类型的数据,更灵活。对象引用al存的是整个list的地址,指向这个新的list,确切地说是指向第一个小格格的位置:
刚才说了,List是个接口。我们之前讲过接口了,这些类(除抽象类外)实现了List接口也就意味着它们必须要实现List类的一切抽象方法。也就是说,这些类拥有List定义的所有方法。这里介绍文档中几个常用的方法:
第一个是add,意思是把一个东西加入到一个ArrayList对象里。插句题外话,我们要养成经常看文档的习惯,比如你忘了应该用什么方法加东西了,到底是add还是plus啊,英文都是“加”,那就查查文档,文档里都有答案。
举个例子,很多人都喜欢网购,打开某宝看见每个商品都有名称,大小,价格这些属性。比如我现在淘个新款iphone,名称:iphone,大小: 6.6英寸,价格:100。我想把这几个属性都放到一个ArrayList里,怎么写呢?我们新建一个java项目叫Mobile -> 包com.test -> Test.java,程序如下:
你看,我们虽然没有定义这个集合的长度,但是随着你东西越来越多,这个集合会变得越来越大,你这个大麻袋就跟悟空的金箍棒一样,大小可变的。而且ArrayList跟数组一样,放进去的东西都会自动按顺序排列,它也有下标,只不过不像数组一样用中括号包起来而已。如果你想在ArrayList中看看某个东西,用的就是第二个要介绍的方法 - get(下标)。和数组一样,下标指的也是ArrayList中元素的位置,并且也是从0开始。我们验证一下,看看是不是按顺序都加进去了:
你会发现大麻袋里的东西都按顺序打出来了。那要是大麻袋里装了太多的东西一个一个打印太麻烦呢?还是老的解决方案,循环呐:
介绍数组的时候我们也遍历过数组,知道length()方法返回数组长度。这里ArrayList用到的是size()方法,size英文是大小的意思,这就是它的第三个常用方法。
有添加就有删除,第四个常用方法就是remove(),用来删除一个元素。比如我想删除价格,价格是第三个元素,所以就是al.remove(2)。再次循环打印出来,价格就不见了。
数组里既可以添加值类型,也可以添加引用类型。有了数组的经验,肯定有人会问,ArrayList可不可以添加引用类型?当然可以。举个例子,比如国足教练里皮老爷子为了备战2022年世界杯给各方面人员下达任务,目前完成情况如下:
只有后勤100%完成了任务,其他的都还在进行中。不过也对,战斗将至时大军未动粮草先行。我们用ArrayList的方法写个程序打印出来。你看,总共有四种工作人员,每一种工作人员都有名称、任务、完成百分比。所以我就可以新建一个叫Staff的类来存这些值,然后把Staff作为引用类型的对象加进ArrayList里,最后打印出来。用图表示如下,和数组那篇的Wanghong项目想法一致:
图中有四个Staff的对象,分别指向足协、教练组、球员、后勤。每一个对象又有三个成员变量,分别代表人员名称、任务、完成百分比。实例化完用ArrayList把这4个Staff的对象装进去。搞清楚这些,新建java项目LippisTasks -> 包com.test -> Test.java和Staff.java。把以下代码复制粘贴:
Staff.java:
Test.java:
Staff.java定义用属性get/set方法为变量赋值,没什么可说的,不会的请参考属性那篇。Test.java中for循环执行4次,每一次实例化一个Staff类的对象并未成员变量赋值。每一次循环结束时都会用all.add()把当前创建的对象装进ArrayList中。循环打印时把Staff对象按顺序从ArrayList中取出。因为ArrayList可以装任何类型的元素,所以all.get()默认取出的元素都是Object类型。这个应该好理解吧?有时候你这个麻袋里既有吃的喝的又有玩的用的,什么都有,拿出来的时候你总不能说ipad和面包都是吃的吧?道理一样,作为妥协都是Object类型,ipad和面包都是“东西”,用一个统称。但我们自己知道,从这个ArrayList里拿出来的都是Staff对象,所以要想把Object转成Staff就不得不用强制转换。
ArrayList就介绍到这儿。以此类推,LinkedList,Vector,Stack它们和ArrayList类似,有些方法也是一样的用法。只不过因为数据结构不同,在性能上或是数据存储上有一些差别。大家可以课下先研究一下另外三种的用法,我们以后讲线程的时候再讲它们的一些区别。
这篇文章的源代码是Mobile和LippisTasks。下篇我们介绍集合里的另一个重要概念 - Map。
网友评论