java中有哪些集合,请简单介绍一下
答:
- 分类:有两大类
- Collection:是存储对象的集合
- 子接口
- Set:无序不可重复
- 实现类
- HashSet
- 基于哈希表实现
- 插入和查询O(1)
- 无序
- 需要依赖与
hashCode()
和equals()
去重 - 适用于快速去重,无需排序
- TreeSet:
- 基于红黑树实现
- 有序
- 增删查O(1)
- 适用于需要有序且唯一的集合
- HashSet
- 实现类
- List:有序可重复
- 实现类
- ArrayList
- 基于动态数组实现
- 适用于频繁查询O(1),较少删除O(n)
- LinkedList
- 基于双向链表实现
- 适用于较少查询O(n),增删效率高O(1)
- 额外实现的Deque接口,支持队列和栈的操作
- ArrayList
- 实现类
- Queue:队列
- 实现类
- LinkedList
- 实现了Queue和List接口
- 可作为队列使用,实现FIFO(先进先出)操作
- PriorityQueue
- 基于堆实现
- 适用于任务调度,优先级处理
- LinkedList
- 实现类
- Set:无序不可重复
- 子接口
- Map:以键值对进行存储
- 实现类
- HashMap
- 基于哈希表实现
- LinkedHashMap
- 继承于HashMap,通过链表维护插入顺序
- 如果希望留有插入顺序或访问顺序选他
- TreeMap
- 基于红黑树
- 增删查时间O(log n)
- 会按一定规则排序,不会保留插入的顺序
- HashMap
- 实现类
- Collection:是存储对象的集合
什么是策略模式?一般用在什么场景?
答
- 策略模式是一种行为模式:其核心思想是将一系列算法或行为封装为独立的策略类,使得它们可以相互 替换,且算法的变化独立于使用它的客户端
- 一般由三个核心角色组成
- 抽象策略接口:定义所有具体策略类的通用方法
- 具体策略类:实现抽象策略接口:如常见的商品打折,不同的优惠有不同的应用条件
- 上下文类:持有一个策略对象的引用,负责动态切换策略
- 使用场景:
- 替换多重条件判断:如多种支付方式, 不同的折扣
- 扩展性要求高的场景:如需要添加优惠政策,只需要添加新的策略类就行
什么是模板方法模式?一般用在什么场景?
答
模板方法是一种行为模式:其核心思想是定义算法的骨架,将可变步骤延迟到子类实现,从而不改变算法结构的前提下允许定制特定步骤
一般有两个角色:
- 算法抽象类
- 定义算法的固定流程,通常使用final修饰,防止子类去修改
- 有两种方法
- 基本方法:抽象的方法(子类必须实现)、具体方法(公共逻辑,不能让子类修改)、钩子方法(可选步骤,子类可重写)
- 具体子类
- 算法抽象类
使用场景:
固定流程:如电商购物:基本上按照:上架商品-->下单-->发货-->收货, 退货为钩子方法
行为控制或复用:
- 父类控制整体流程,子类仅需要关注个性化逻辑
- 上班通勤:从起床到通勤(开车或公交(由子类具体实现))到达公司
- 父类控制整体流程,子类仅需要关注个性化逻辑
主要适用于,算法框架固定,但细节可变的场景
什么是责任链模式,一般有用在什么场景
答
- 责任链模式是一种行为模式,其核心思想是用过多个处理对象连成一条链,使请求沿着链传递,直到有对象处理它为止。
- 核心机制:
- 链式传递:每个处理对象都持有下一个处理对象的引用,形成链式结构,每个处理对象决定处理或转发请求
- 动态组合:链的结构可以动态的调整,列入增加或删除处理者,而客户端无需修改
- 职责单一:每个处理者仅关注自己能处理的逻辑
- 应用场景
- 多级审批流程
- 权限校验与认证
- 日志分级处理
- 我感觉主要用在需要多级处理消息的时候,如servlet中的过滤器,就是多级处理请求
请描述简单工厂模式的工作原理
答
- 简单工厂模式是一种创造型模式,其核心思想是通过一个工厂类同一管理对象的创建过程
- 核心结构
- 抽象产品:定义所有具体产品的公共接口
- 具体产品:实现抽象产品
- 工厂类:负责根据传入的参数动态创建具体产品
- 使用场景
- 适用于产品较少,且不常变化的情况下适用
什么是观察者模式,一般用在什么场景
答
- 观察者模式是一种行为模式,其核心思想在与定义对象之间的一对多依赖管理,当一个对象的状态发生变化,其他依赖它的对象都能自动收到通知
- 核心结构
- 被观察者:负责管理观察者列表,提供注册、注销、和通知观察者的方法
- 观察者:定义通义的响应接口,让被观察者调用
- 使用场景
- 消息发布和订阅:如微信公众号,订阅推文
- 状态管理:如订单状态变更,触发其他如库存扣减、物流调度等