Java集合中经典的 5种设计模式,打死也要记住啊!

集合

  • 一、 迭代器模式(Iterator Pattern)
  • 二、 工厂模式(Factory Pattern)
  • 三、 装饰器模式(Decorator Pattern)
  • 四、 适配器模式(Adapter Pattern)
  • 五、 组合模式(Composite Pattern)

Java 集合框架中的 List、Set、Map 以及其实现类都使用了多种经典的设计模式

一、 迭代器模式(Iterator Pattern)

所有的集合接口(Collection、List、Set、Queue)和 Map 接口都定义了获取迭代器(Iterator)的方法,如 iterator()listIterator()等。每个具体的集合实现类都提供了自己的迭代器实现,如 ArrayList 有 Itr、LinkedList 有 ListItr、HashMap 有 KeyIteratorValueIterator 等。这些迭代器实现了 Iterator 接口,并对应集合的遍历算法。

ArrayList 为例,它的迭代器 Itr 实现如下:

private class Itr implements Iterator<E> {int cursor;       // 下一个要访问的元素索引int lastRet = -1; // 最后一次返回的元素索引,方便删除操作// ...
}

在这里插入图片描述

二、 工厂模式(Factory Pattern)

Collections 工具类中的静态工厂方法(如 nCopiessingletonListunmodifiableList 等)可以创建各种不同的集合实例。为了方便创建Map.Entry实例,Map接口提供了两个静态工厂方法SimpleEntrySimpleImmutableEntry。这两个方法分别用来创建可变和不可变的Map.Entry实例。

public static <T> List<T> singletonList(T o) {return new ImmutableCollections.SetN<T>(o);
}

三、 装饰器模式(Decorator Pattern)

Collections 提供了一些修饰方法,用于对集合进行包装,如 synchronizedCollectionunmodifiableCollection 等。这些方法使用了装饰器模式,在原有集合上添加了同步或只读等额外功能。

public static <T> List<T> synchronizedList(List<T> list) {return (list instanceof RandomAccess ?new SynchronizedRandomAccessList<>(list) :new SynchronizedList<>(list));
}static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E> {// ...
}

四、 适配器模式(Adapter Pattern)

Arrays.asList 方法可以将数组转换为 List 集合,使用了适配器模式。EnumerationIteratorIteratorEnumeration 则用于在旧集合 Enumeration 和新集合 Iterator 之间进行适配。

public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}

五、 组合模式(Composite Pattern)

在Map接口中,每个Map.Entry对象表示了一个键值对(key-value pair),包含了一个键和一个值。通过这种组合结构,Map可以存储多个键值对,并提供了方便的方式来操作这些数据。在Map接口的实现类(如HashMap、TreeMap)中,每个键值对被表示为一个Map.Entry对象,通过Map的方法可以进行各种操作。组合模式允许将对象组合成树形结构,表示“部分-整体”的关系,在Map.Entry接口中,键和值构成了一个整体,即键值对的Entry,使得操作键值对变得简单方便。

  • Map抽象接口内部定义了一个Entry接口,表示键值对。Entry接口包含了获取键、获取值、设置值、判断相等和获取哈希码等方法。
public interface Map<K, V> {// ...其他方法// 内部接口表示键值对interface Entry<K, V> {K getKey(); // 获取键V getValue(); // 获取值V setValue(V value); // 设置值,返回旧的值boolean equals(Object o); // 判断是否相等int hashCode(); // 获取哈希码}// ...其他方法
}
  • 具体的Map实现类(如HashMap)的 Node 内部类就是一个 Entry 的实现,Node类实现了Map.Entry接口,表示了键值对信息。它包含了键、值和下一个节点的引用等信息
static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;//下一个节点的引用等信息Node<K,V> next; // ...
}

在Java JDK 1.8中,AbstractMap 和 AbstractSet 等抽象类使用了组合模式。AbstractMap 是一个抽象类,它提供了Map接口的基本实现,并使用了组合模式来包装具体的 Map 实现。在 AbstractMap 中,最重要的部分是 entrySet() 方法,该方法返回一个Set<Entry<K,V>>类型的集合,表示 Map 的键值对集合。

public abstract class AbstractMap<K,V> implements Map<K,V> {// 返回一个包含所有 key-value 映射关系的 Set 集合public abstract Set<Entry<K,V>> entrySet();// 其他实现代码public static class SimpleEntry<K,V> implements Entry<K,V>, java.io.Serializable{private static final long serialVersionUID = -8499721149061103585L;private final K key;private V value;// 构造函数// 实现 equals()、hashCode() 等方法}
}

AbstractMap 中,entrySet() 方法返回的是一个 Set<Entry<K,V>>类型的集合。这里直接使用了 Java 中的 Entry 接口作为键值对的表示,而实际上 Entry 是一个内部接口,定义了对映射项(key-value 对)的操作。

AbstractMap 在内部使用了一个具体的实现类SimpleEntry来表示键值对,但是对外部调用者来说,只需要知道 entrySet() 方法返回的是一个 Set<Entry<K,V>> 集合,而不需要关心具体的实现细节。

通过组合模式的设计,AbstractMap 实现了 Map 接口的基本功能,同时将具体的键值对信息封装在内部类中,加强了封装性和灵活性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试用例是什么?怎么写?不会测试用例的看过来,

前言 今天笔者想和大家来聊聊测试用例&#xff0c;这篇文章主要是想要写给测试小伙伴们的&#xff0c;因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手&#xff0c;我就想和大家简单的聊聊&#xff0c;这篇文章主要是针对功能测试的哟。 一、什么是测试用例&#…

如何将服务器数据迁移到另一台服务器?

将服务器数据迁移到另一台服务器通常涉及以下几个步骤&#xff1a; 1.备份数据&#xff1a; 在进行数据迁移之前&#xff0c;首先需要备份服务器上的数据。这包括网站文件、数据库、配置文件等。可以使用各种备份工具和方法&#xff0c;如rsync、scp、FTP、数据库备份工具等。 …

Azure Databricks 集群合并小文件与删除过多的历史版本

原因是&#xff1a;databricks 集群的数据底层是HDFS虽然是spark做为引擎读写如果没有及时合并也一样会因为小文件问题造成大量的资源消耗&#xff0c;也就会越来越慢。目前采用的主要方式&#xff0c;定时合并&#xff0c;与版本删除 1、python 脚本如下有用到的同学可以参考下…

Flask开发类似jenkins构建自动化测试任务工具

1、自动化 某一天你入职了一家高大上的科技公司&#xff0c;开心的做着软件测试的工作&#xff0c;每天点点点&#xff0c;下班就走&#xff0c;晚上陪女朋友玩王者&#xff0c;生活很惬意。 但是美好时光一般不长&#xff0c;这种生活很快被女主管打破。为了提升公司测试效率…

有了HTTP协议,为什么还要有WebSocket

HTTP的缺陷 现在的应用场景可能更多的是&#xff0c;前端发起一次HTTP请求&#xff0c;服务器后端返回一次HTTP响应。但是有这样的场景&#xff0c;是需要服务器主动给前端发送请求的。 最常见的场景是扫码登陆。 这里有两种解决方案&#xff0c;一种是微信的解决方案&#xf…

Could not find artifact com.gexin.platform:gexin-rp-sdk-http:pom:4.1.0.1

Could not find artifact com.gexin.platform:gexin-rp-sdk-http:pom:4.1.0.1 新接手了一个项目&#xff0c;导入到idea后&#xff0c;maven标签中页点击Reload All Maven Projects&#xff0c;报Could not find artifact com.gexin.platform:gexin-rp-sdk-http:pom:4.1.0.1错…

YOLOv5算法进阶改进(19)— 在主干网络中引入SAConv | 轻量化的可切换空洞卷积

前言:Hello大家好,我是小哥谈。Switchable Atrous Convolution(SAC)是一种用于图像处理和计算机视觉任务的卷积神经网络(CNN)操作。它是在传统的空洞卷积的基础上进行改进的。传统的空洞卷积是一种通过在卷积核中引入空洞(或称为膨胀率)来扩大感受野的技术。然而,传统…

网络学习:Vlan基础知识、划分思路及其优越性

目录 一、VLAN基础知识 二、VLAN的划分方法 1. 基于端口划分的VLAN 2. 基于MAC地址划分VLAN 3. 基于网络层协议划分VLAN 4. 根据IP组播划分VLAN 5. 按策略划分VLAN 6. 按用户定义、非用户授权划分VLAN 三、VLAN的优越性 1. 增加了网络连接的灵活性 2. 控制网络上的广…

GStreamer管道播放建立

1 mediainfo工具获取媒体的基本信息 1.1 封装形式(别被文件后缀迷惑,有些mp4封装,可能是ts等等) TS封装:/home/firefly# mediainfo /home/firefly/LG_Colors-of-Journey-HDR.mp4 General ID : 1 (0x1) Complete name …

企业信息化转型之企业统一门户搭建

一、当前企业门户实施的背景和痛点 企业随着公司业务的发展&#xff0c;公司运作的复杂度在不断加大&#xff0c;各部门的业务量和业务的复杂度都在不断增加&#xff0c;已经建设了ERP、HR、OA、考勤、合同、BPM、PLM等有效地支撑了过去和现有业务的发展。 企业在信息化办公是…

Github上哪些好用的工具

专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; Qexo-爱写博客的师傅强烈推荐 漂亮的 Hexo 静态博客编辑器。该项目是基于 Django 的 Hexo 静态博客管理后台&#xff0c;支持文章管理、…

暖通空调HVAC软件行业调研报告

本文调研和分析全球暖通空调HVAC软件发展现状及未来趋势&#xff0c;核心内容如下&#xff1a; &#xff08;1&#xff09;全球市场暖通空调HVAC软件总体规模&#xff0c;按收入进行了统计分析&#xff0c;历史数据2019-2023年&#xff0c;预测数据2024至2030年。 &#xff08;…

Nginx和Ribbon实现负载均衡的区别

Nginx和Ribbon的区别 1. Nginx服务器端负载均衡&#xff1a; 1、Nginx是客户端所有请求统一交给nginx&#xff0c;由nginx进行实现负载均衡请求转发&#xff0c;属于服务器端负载均衡。即请求有nginx服务器端进行转发。 3、Nginx是服务端的负载均衡&#xff0c;Ribbon是客户端…

shell变量引用

在 Bash 中&#xff0c;如果你想让一个变量引用或“指向”另一个变量&#xff08;数组&#xff09;&#xff0c;你可以使用间接引用的概念。对于你的场景&#xff0c;你可以将变量 a 设为数组名 eb2_info 的字符串值&#xff0c;然后在需要引用数组时使用间接引用。 #!/bin/ba…

(开源项目)OpenHarmony、社区共建Sample合入要求

1.新增Sample功能不能重复于当前已有Sample的功能&#xff1b; 2.新增Sample的工程推荐使用ArkTS语言编写&#xff1b; 3.新增Sample的工程推荐使用Stage模型编写&#xff1b; 4.新增Sample的工程中需要包含UI自动化用例&#xff08;ohosTest工程模块&#xff09;&#xff0…

postgres12安装postgis

文章目录 OpenEulr 23.03 x86_64依赖安装 centos7.6 x86_64依赖安装 给postgres 12安装postgis。 postgres 12支持的postgis版本为:(检查postgis POSTGIS_PGSQL_VERSION) postgis>2.5 OpenEulr 23.03 x86_64 依赖 postgis-3.4.2依赖&#xff1a;(yum源安装的版本及postgis…

小众二手跨境电商平台——Depop新手卖家指南

对标美国的二手跨境电商平台Mercari和Poshmark以及东南亚的Etsy&#xff0c;Depop是英国的一个独特的创意时尚交易平台。它与Instagram相似&#xff0c;但它更倾向于交易二手衣物、饰品以及艺术作品。这个相对细分的电子商务平台Depop也吸引了很多跨境人。今天就给大家分享如何…

AM和FM是啥意思?有啥区别?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的条形码二维码检测系统(深度学习+UI界面+训练数据集+Python代码)

摘要&#xff1a;在物流和制造业中&#xff0c;开发一套高效的条形码与二维码识别系统显得尤为关键。本博文深入探讨了如何利用深度学习技术打造出一套先进的条形码及二维码检测系统&#xff0c;并且提供了一套完整的实施方案。该系统搭载了性能卓越的YOLOv8算法&#xff0c;并…

面试题:从输入网址到页面显示的全过程(超详细解析)

面试题&#xff1a;从输入网址到页面显示的全过程 01. 要看到一个网页&#xff0c;我们需要什么&#xff1f; 我们现在经常使用的网页其实是由三种语言书写而来的&#xff1a;HTML、Css 和 JavaScript&#xff0c;它们分别负责网页的结构、网页的样式和网页的交互功能&#xf…