java集合:ArrayList,LinkedList,初步接触
2018-01-24 本文已影响83人
在路上phper
我们前面的课程学习了java的数组和老外帮我们封装好的Arrays类库,可以对数据进行更方便的操作,然而业务上依然是纯数组,但是依然不能满足我们的要求。
因此老外又帮我们贴心的设计了一系列"接口+类",叫做集合
它有两大接口
1.Collection
2.Map
都存在java.util包里(充分说明是老外的,贴心增值服务) util为工具的意思 说明了这是一个工具类
这节课先了解一下Collection
首先我们来看Collection接口中包含什么?
它包含三个主要接口
List,Queue,Set 如何知道的呢?
可以通过手册,百度和智能编辑器查看到
首先我们来到MyIndex.java文件中写入Collection 鼠标放入Collection上面按住crtl+鼠标左键进入Collection源码目录
也可以看到IDEA给我们的提示是Collection为一个接口 并且支持泛型
源码目录如下图

这时我们可以看见屏幕上有个I向下的小箭头图标 鼠标点击一下 可以查看继承该接口的类和接口
如下图

我们可以看见屏幕右上角有一个小图标 点击一下 可以对源码进行反编译 从反编译结果中 我们可以找到上面的几个接口
反编译结果部分如下

今天我们先学习一下List接口 是一个很常用的集合类 它下面还包含三个重要的类 是具体实现类 类和类之间还有继承的关系
最主要的有ArrayList ,LinkedList,Vector三个类
从上面反编译的结果中也就是java.util中可以看见一些基本的类 可以看到有个List接口 可以看见其继承了Collection接口 这是我们最基本的集合类接口 通过它衍生出了很多具体实现类 供我们直接使用的
接下来我们学习一下ArrayList和LinkedList类 都继承于List接口
ArrayList其实就是一个老外帮我们写的蛮牛逼的一个Object[]的操作 数据是有序的
通过其插入和删除元素相对较慢
因为每次插入删除都需要重新计算数组的长度
插入删除的过程
1.重新计算数组长度
2.重新产生一个数组(数组长度是不可变的,因此通过copy的方式)
因此ArrayList通过索引方式取或者修改内容比较快 插入或者删除比较慢
接下来我们用代码学习一下ArrayList类

运行结果

数据量不大的情况下不会对性能影响很大
如果数据量很大则需要用到LinkedList操作数组
LinkedList内部实现原理类似链表操作 其特性为对数据插入删除较快 但是取数据较慢 因为链表是双向的 内部实现没有存下标
删除快是因为删除某一个的时候只需要将另一边指向另一个元素即可 每个数据之间是没有顺序的

因为LinkedList也继承于List接口所以其操作数组方法跟ArrayList一样

运行结果

接下来学习一下循环遍历,如何遍历mylist

运行结果

这时候for前面编译器提示我们不是最优写法
alt+enter替换成

运行结果

这种循环方式实现原理为迭代器
迭代器我们可以使用手工的方式循环遍历 可以使用mylist的iterator()方法得到它的迭代器

运行结果

发现这时while上面又标黄了 alt+enter可以发现对代码做了优化 变成上面那种格式了
即优化成下面

接下来了解下java8之后支持的循环方式lambda表达式(结合foreach遍历循环)

下面写一段代码 我们每一次输出都要写System.out.println感觉很累
接下来我们改变一下在MyIndex里面写一个接口Me 里面有个out方法是用来代替写System.out.println的
那么在main函数中如何实现out方法呢 两种方法 可以写一个类继承Mine接口 也可以写一个匿名内部类
代码如下
第一种方法 回忆一下之前讲过的内部类的实现
在MyIndex里写一个接口Mine 里面有个out方法用来代替System.out.println

在main函数中写入如下代码(内部类的方式实现方法的重写)

运行结果

2.lambda表达式方式
修改代码如下

运行结果

如果参数只有一个,小括号可以省略

这时鼠标放入System.out.println idea会提示代码优化 按alt+enter
代码变为下面

弹出这个界面 点击replace那个
代码优化为

运行结果

其中::是lambda表达式的双冒号运算符 可以对方法进行引用