跳转至

集合与策略、迭代器模式

集合类概述以及List接口

集合概述

对象的容器,定义了对多个对象进行操作的常用方法,可以实现数组的功能

与数组的区别:

  1. 数组长度固定,集合的长度不固定
  2. 数组可以存储基本数据类型,但是集合只能存储引用类型

什么是引用类型?不是Java内置的类型,引用类型与对象相关联,它们通过引用指向对象的内存地址,而不是直接存储值

常见引用类型为对象、接口、数组

如何使用?

  • 通过java.util.*使用,如import java.util.ArrayList

ArrayList类

  • List接口定义了一个有序对象集合,有序、有下标、元素可重复
  • ArrayList是一个可以动态修改的数组,与普通数组的区别就是它没有固定的长度(类似c++的vector)

LinkedList类

  • 存储结构是双向链表
  • 一个单向列表包含两个值:当前节点的值和一个指向下一个节点的链接
  • 一个双向链表有三个整数值:数值、向后节点的链接,向前节点的链接

ArrayList与LinkedList

  • ArrayList
    • 必须开辟连续空间,查询快,增删慢
  • LinkedList
    • 无需开辟连续空间,查询慢,增删快

Set集合

  • 无序、无下标、元素不可重复
  • HashSet不是线程安全的,如果在多个线程尝试修改HashSet,需要显式同步对HashSet的访问

Map集合

  • 存储的是键值对映射
  • 无序、无下标、键不可重复值可重复

ps:HashSetHashMap的“无序”指的是遍历的输出结果是无序的,但是内部实际是有序的

策略模式

一种对象行为型模式

如何实现:让算法和对象分开,使得算法可以独立于它的客户而变化?

策略模式将一系列算法封装起来,在客户端判断使用何种算法

  • 优点
    • 提供一种替代继承方法,既实现了代码重用,还实现了任意扩展
    • 将“应该采取哪一种策略”和“算法”分离,避免程序中使用多重条件转移语句
  • 缺点
    • 客户端必须知道所有的策略类,并且自行决定使用哪一个策略类

迭代器模式

对遍历行为进行抽象

Java Iterator(迭代器)不是一个集合,是用于访问集合的方法,它采用顺序访问

如何引入?

import java.util.Iterator

  • 迭代器it三个基本操作
    • it.next(),返回迭代器下一个元素,更新迭代器状态
    • it.hasNext(),判断集合中是否还有元素
    • it.remove(),将迭代器返回的元素删除
while(it.hasNext()){
    System.out.println(it.next());
}