集合与策略、迭代器模式
集合类概述以及List接口¶
集合概述¶
是对象的容器,定义了对多个对象进行操作的常用方法,可以实现数组的功能
与数组的区别:
- 数组长度固定,集合的长度不固定
- 数组可以存储基本数据类型,但是集合只能存储引用类型
什么是引用类型?不是Java内置的类型,引用类型与对象相关联,它们通过引用指向对象的内存地址,而不是直接存储值
常见引用类型为对象、接口、数组
如何使用?
- 通过
java.util.*
使用,如import java.util.ArrayList
ArrayList类¶
List
接口定义了一个有序对象集合,有序、有下标、元素可重复ArrayList
是一个可以动态修改的数组,与普通数组的区别就是它没有固定的长度(类似c++的vector)
LinkedList类¶
- 存储结构是双向链表
- 一个单向列表包含两个值:当前节点的值和一个指向下一个节点的链接
- 一个双向链表有三个整数值:数值、向后节点的链接,向前节点的链接
ArrayList与LinkedList¶
- ArrayList
- 必须开辟连续空间,查询快,增删慢
- LinkedList
- 无需开辟连续空间,查询慢,增删快
Set集合¶
- 无序、无下标、元素不可重复
- HashSet不是线程安全的,如果在多个线程尝试修改HashSet,需要显式同步对HashSet的访问
Map集合¶
- 存储的是键值对映射
- 无序、无下标、键不可重复、值可重复
ps:
HashSet
和HashMap
的“无序”指的是遍历的输出结果是无序的,但是内部实际是有序的
策略模式¶
一种对象行为型模式
如何实现:让算法和对象分开,使得算法可以独立于它的客户而变化?
策略模式将一系列算法封装起来,在客户端判断使用何种算法
- 优点
- 提供一种替代继承方法,既实现了代码重用,还实现了任意扩展
- 将“应该采取哪一种策略”和“算法”分离,避免程序中使用多重条件转移语句
- 缺点
- 客户端必须知道所有的策略类,并且自行决定使用哪一个策略类
迭代器模式¶
“对遍历行为进行抽象”
Java Iterator
(迭代器)不是一个集合,是用于访问集合的方法,它采用顺序访问
如何引入?
import java.util.Iterator
- 迭代器
it
三个基本操作- it.next(),返回迭代器下一个元素,更新迭代器状态
- it.hasNext(),判断集合中是否还有元素
- it.remove(),将迭代器返回的元素删除
while(it.hasNext()){
System.out.println(it.next());
}