JavaAccessBridge(Java访问桥)详细介绍

news2025/1/18 8:49:18

Java Access Bridge

通过 Java 访问桥 API,您可以给使用Java应用程序编写的在windows系统上运行的图形化系统开发辅助技术应用程序。它包含本机方法,使您能够查看和操作有关 Java 应用程序中 GUI 元素的信息,这些信息将通过 Java 访问桥转发到辅助技术应用程序。
运行逻辑如图所示:
在这里插入图片描述

官方文档:

https://docs.oracle.com/javase/accessbridge/2.0.2/toc.htm

其他网址:

Java Accessibility API 规范: http://download.oracle.com/javase/6/docs/api/javax/accessibility/package-summary.html

Java Accessibility 索引页: http://download.oracle.com/javase/6/docs/technotes/guides/access/index.html

Swing API 官网: http://download.oracle.com/javase/6/docs/technotes/guides/swing/index.html

笔记

1. 安装

  1. 我发现我电脑中的JDK1.8, JDK11, JDK17都已经存在JAB相关的文件, 无需手动安装
  2. 经官网查询 , Java 访问桥已集成到 Java SE 7 及更高版本中。因此,对于 Java SE 6 及更早版本,我们需要手动集成

1.1 手动安装说明

我们首先从下载地址, 下载Java Access Bridge 2.0.2 并按照以下表格进行复制操作即可.

以下安装说明看不懂或者您电脑是32位, 请自行查阅 安装 Java 访问桥

以下表格中出现的%JAVAHOME64%或者%JAVAHOME32% 表示的目录类似于:

  • JDK:C:\Program Files\Java\jdk1.6.0_24\jre
  • JRE:C:\Program Files\Java\jre6

怎样知道JDK是32位还是64位?

在要使用的jdk的bin目录下用命令java -version查看, 如果没有出现64 bit字样, 说明该jdk是32位的, 否则是64位的

Java访问桥文件目标目录
WindowsAccessBridge-32.dll%WINDOWSHOME%\SYSWOW64
WindowsAccessBridge-64.dll%WINDOWSHOME%\SYSTEM32
JavaAccessBridge-32.dll%JAVAHOME32%\bin
JavaAccessBridge-64.dll%JAVAHOME64%\bin
JAWTAccessBridge-32.dll%JAVAHOME32%\bin
JAWTAccessBridge-64.dll%JAVAHOME64%\bin
accessibility.properties%JAVAHOME32%\lib或者%JAVAHOME64%\lib
access-bridge-32.jar%JAVAHOME32%\lib\ext
access-bridge-64.jar%JAVAHOME64%\lib\ext
jaccess.jar%JAVAHOME32%\lib\ext或者%JAVAHOME64%\lib\ext

有关用法示例,请参阅示例:JavaFerret.cpp

1.2 JAB工作过程

  1. JVM加载java.awt.Toolkit时,默认执行initAssistiveTechnologies方法。该方法加载accessibility.properties文件。
  2. 读取文件中的assistive_technologies属性。
  3. 找到access-bridge-32.jar下的com.sun.java.accessibility.AccessBridge并加载。
  4. loadAssistiveTechnologies方法加载JavaAccessBridge-32.dll。
  5. 该dll启动隐藏窗口,并调用com.sun.java.accessibility.AccessBridge.java中的方法。
  6. 应用程序调用WindowsAccessBridge-32.dll,使用SendMessage(WM_COPYDATA)方法与 JavaAccessBridge-32.dll隐藏窗口进行通讯。

2. Java Ferret介绍

Java 雪貂示例使用 Java 辅助功能实用程序 API 来检查有关 Java 虚拟机中对象的可访问信息。它使您能够选择不同的方法来选择要检查的对象:

  • 当发生任意数量的事件时,例如焦点更改、鼠标移动、属性更改、菜单选择以及显示弹出菜单
  • 当指针位于对象上时,或当鼠标悬停在窗口上时

一旦选择了一个对象进行检查,Java 雪貂就会显示对该对象调用 Java 辅助功能 API 方法的结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SSAKk1vD-1673503496113)(D:\应用\文档\入职时文件\typora文件\开发相关\学习\技术学习\image-20221008100534334-1665194735898-1.png)]

对应按钮介绍请看JAVA Ferret示例 (oracle.com)

3. Java Monkey介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sB5O4IID-1673503496113)(D:\应用\文档\入职时文件\typora文件\开发相关\学习\技术学习\image-20221008102238633-1665195759720-3.png)]

JAVA Monkey示例 (oracle.com)

  1. 像猴子一样,Java猴子在特定Java虚拟机中的组件树中“摆动”,并在树视图中显示层次结构。此外,如果用户在树中选择一个节点,然后从“Panels”菜单中选择“Accessibility API Panel”,Java Monkey 将向用户显示一个窗口,其中显示该对象的辅助功能信息。

  2. 从**“File**”菜单中选择“Refresh Tree”菜单。Java Monkey 构建一个属于 Java 应用程序和小程序的顶级窗口列表,然后递归查询这些窗口中的元素,构建所有 Java 应用程序中所有 GUI 组件和系统中运行的所有 JVM 中的小程序的树。

  3. 构建 GUI 树后,可以通过在树中选择单个 GUI 组件,然后选择“Panels”,然后选择“Display Accessibility Information”来查看有关该组件的详细辅助功能信息

4. Java Access Bridge API

通过 Java 访问桥 API,您可以为使用 Java 应用程序的微软视窗操作系统开发辅助技术应用程序。它包含本机方法,使您能够查看和操作有关 Java 应用程序中 GUI 元素的信息,这些信息将通过 Java 访问桥转发到辅助技术应用程序。

4.1 接口文件

​ Java 访问桥 API 可以在三个文件中找到:AccessBridgeCalls.h , AccessBridgePackages.hAccessBridgeCallbacks.h。这些文件分别对应于 Java 访问桥 API 调用API 数据结构API 回调

4.2 接口调用

Java 访问桥 API 调用包含在AccessBridgeCalls.h 中,要使用它们,还必须编译文件 AccessBridgeCalls.c,该文件充当应用程序与WindowsAccessBridge.dll 之间的接口。

4.3 初始化/关闭函数

BOOL initializeAccessBridge();  //启动 Java 访问桥。在调用此函数之前,不能使用 Java 访问桥 API 的任何部分。
BOOL shutdownAccessBridge(); //关闭 Java 访问桥。在应用程序使用完 Java 访问桥时(在应用程序存在之前),调用此函数非常重要,这样 Java 访问桥可以正确执行内存清理。

4.4 网关Gateway函数

通常在调用任何其他 Java 访问桥 API 函数之前调用这些函数:

BOOL IsJavaWindow(HWND window);//检查给定窗口是否实现了 Java 可访问性 API。

BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac);//获取给定窗口的AccessibleContext和vmID值。许多 Java 访问桥函数都需要AccessibleContext和vmID值。

注: 虚拟机编号vmID 和根节点ac

4.6 事件处理函数

它们采用一个函数指针,该指针指向将处理事件类型的函数。当您不再对接收这些类型的事件感兴趣时,请再次调用该函数并传入值。在文件NULLAccessBridgeCallbacks.h中查找需要传递到这些函数中的函数指针的原型。有关这些原型的详细信息,请参阅“API 回调”部分。

void SetFocusGained(AccessBridge_FocusGainedFP fp);
void SetFocusLost(AccessBridge_FocusLostFP fp);

4.7 general函数

为了确定可用的功能,您可以从调用中获取版本信息。

void ReleaseJavaObject(long vmID, Java_Object object);
//释放 Java 对象`object`使用的内存,其中object 是 Java 访问桥返回给您的对象。Java 访问桥会自动维护对它在 JVM 中返回给您的所有 Java 对象的引用,以便它们不会被垃圾回收。为了防止内存泄漏,您必须在完成 Java 访问桥返回给您的所有 Java 对象后调用ReleaseJavaObject。有关如何执行此操作的说明,请参阅JavaFerret.c

BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info);
//获取应用程序正在使用的 Java 访问桥实例的版本信息。您可以使用此信息来确定 Java 访问桥版本的可用功能。

注意:为了确定JVM的版本,您需要传入一个有效的vmID;否则,返回的只是应用程序WindowsAccessBridge.DLL连接到的文件的版本。

4.8 可访问的上下文函数

函数GetAccessibleContextAt和GetAccessableContextWithFocus检索Accessible Context对象,这是Accessibble对象和JVM cookie的神奇cookie(实际上是Java对象引用)。您可以使用这两个cookie通过Java Access Bridge引用对象。大多数Java Access Bridge API函数都要求您传入这两个参数。

函数GetAccessibleContextInfo返回关于属于JVM的AccessibbleContext对象的详细信息。为了提高性能,Java Accessibility API中的各种不同方法被收集到Java Access Bridge API中的几个例程中,并以结构值的形式返回。这些结构值在文件AccessBridgePackages.h和在“API回调”一节中介绍。
函数GetAccessibleChildFromContext和GetAccessableParentFromContex使您能够遍历GUI组件层次结构,检索特定GUI对象的第n个子级或父级。

BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent, jint x, jint y, AccessibleContext *ac);//检索窗口的对象或鼠标指针下的对象AccessibleContext。

BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac);//检索窗口的对象或具有焦点的对象AccessibleContext。

BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info);//从AccessibleContext对象ac检索AccessibleContextInfo对象。

AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index);//返回表示对象ac的第n个子对象的AccessibleContext对象,其中n由值index指定。

AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac);//返回表示对象ac的父级的AccessibleContext对象。

4.9 Accessible Text函数

这些函数获取Java Accessibility API提供的AccessibleText信息,为了提高效率,这些信息被分解为七个块。如果AccessibleContextInfo数据结构中的标志AccessibleText设置为TRUE,则AccessibbleContext中包含Accessible文本信息。这些函数中使用的结构值在文件AccessBridgePackages.h中定义并在“API回调”一节中介绍。

BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
char *GetAccessibleTextAttributes(long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);

4.10 Accessible Value函数

这些函数获取Java Accessibility API提供的AccessibleValue信息。如果AccessibleContextInfo数据结构中的标志AccessibleValue设置为TRUE,则AccessibbleContext对象中包含Accessible Value信息。返回的值是字符串(char*value),因为无法预先判断该值是整数、浮点值还是Java语言构造Java.lang.Number子类的其他对象。

BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_ *value, short len);
BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_ *value, short len);

4.11 Accessible Selection函数

这些函数获取并操作Java Accessibility API提供的AccessibleSelection信息。如果AccessibleContextInfo数据结构中的标志AccessibleSelection设置为TRUE,则AccessibbleContext中包含Accessible Selection信息。AccessibleSelection支持是第一个可以操作用户界面的地方,而不是通过添加和删除选择中的项目来进行查询。有些函数使用子坐标中的索引,而其他函数使用选择坐标。例如,通过传递子索引从选择中添加到移除(例如,将第四个子项添加到选择中)。另一方面,枚举所选子对象是在选择坐标中完成的(例如,获取所选第一个对象的AccessibleContext)。

void AddAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
void ClearAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
jobject GetAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection as);
BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection as, int i);
void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection as);

4.12 接口数据结构


4.13 接口回调


4.14 AccessibilityContext 内容

AccessibilityContext 表示所有可访问对象返回的最少信息,并通过在实现辅助接口的对象上调用 getAccessibleContext 方法来获取。此信息包括对象的可访问名称、说明、角色和状态,以及有关对象的父项和子项的信息。此外,还包括 JavaBeans TM 属性更改支持,以允许辅助技术在可访问属性的值发生更改时进行学习。辅助上下文还包含用于获取有关组件的更具体辅助功能信息的方法。如果组件支持它,这些方法将返回一个实现以下一个或多个接口的对象:

  • 辅助操作 - 对象可以执行一个或多个操作。此接口为辅助技术提供了标准机制,用于确定这些操作是什么并告诉对象执行这些操作。任何可以操作的对象都应返回一个对象,该对象在可访问上下文中调用 getAccessibleAction 方法时实现此接口。
  • 可访问组件 - 对象具有图形表示。此接口为辅助技术提供了标准机制,用于确定和设置对象的图形表示形式。在屏幕上呈现的任何对象都应返回一个对象,当在可访问的上下文中调用 getAccessibleComponent 方法时,该对象应返回一个实现此接口的对象。
  • 辅助选择 - 对象允许选择其子对象。此接口为辅助技术提供了标准机制,用于确定当前选定的儿童以及修改选择集。任何具有可选择子级的对象都应返回一个对象,该对象在“可访问”图标文本上调用 getAccesibleSelection 方法时实现此接口。
  • 辅助文本 - 对象在显示屏上显示可编辑的文本信息。此接口为辅助技术提供了通过其内容、属性和空间位置访问该文本的标准机制。任何包含可编辑文本的对象都应返回一个对象,该对象在可访问上下文中调用 getAccessibleText 方法时实现此接口。
  • 可访问的超文本 - 对象在显示屏上显示超文本信息。此接口为辅助技术提供了通过其内容、属性和空间位置访问该超文本的标准机制。任何包含超文本的对象都应返回一个对象,当在可访问的上下文中调用 getAccessibleText 方法时,该对象实现此接口。
  • 可访问值 - 对象支持数值。此接口为辅助技术提供了标准机制,用于确定和设置对象的当前值以及最小值和最大值。任何支持数值的对象都应返回一个对象,该对象在可访问上下文中调用 getAccessibleValue 方法时实现此接口。

5. 用java语言写辅助系统

如果你想用java语言编写辅助系统, 那么只需要自己写一个jar包(你的辅助系统) , 并把该jar包的入口写到accessibility.properties文件中即可

操作步骤:

  1. %JAVA_HOME%/jre/lib/ext目录下放你编写的jar包
  2. 打开%JAVA_HOME%/jre/libaccessibility.properties文件
    此文件肯定会包含assistive_technologies这一行数据 , 我们需要修改后面的全限类定名 改为我们自己的(也就是你复制到ext文件夹下的jar包的入口类全名), 比如:
	assistive_technologies=com.alibaba.taobao.JavaAssistive 	
  1. 如果你系统用到JAWTAccessBridge-32.dll 或者 JAWTAccessBridge-32.dll , 那么需要你在%JAVA_HOME%/jre/bin 文件夹下复制这两个文件, 请注意jdk的位数, 不要复制错了

效果:

任何用该jdk环境的java图形化系统启动前都会先加载你再properties文件里配置的类对象, 也就是说: “你咋这个类写的所有内容会在系统启动前执行”

应用:

  1. 对系统做自动化
  2. 写辅助阅读器(给盲人使用)
  3. 启动java图形化系统前的做的任何操作: 统计启动次数, 发送提醒消息等

6. 重要API网址

1. AccessibilityContext :

AccessibleContext表示所有可访问对象返回的最小信息。 此信息包括对象的可访问名称,描述,角色和状态,以及有关其父级和子级的信息。

https://www.runoob.com/manual/jdk11api/java.desktop/javax/accessibility/AccessibleContext.html

2. javax.accessibility:

定义用户界面组件与提供对这些组件的访问的辅助技术之间的契约。

https://www.runoob.com/manual/jdk11api/java.desktop/javax/accessibility/package-summary.html

3. com.sun.java.accessibility.util:

提供组成Java Accessibility Utilities的接口和类的集合。 这些类由Assistive Technologies使用,例如盲人使用的屏幕阅读器,并帮助提供对实现Java Accessibility API的GUI工具包的访问。

https://www.runoob.com/manual/jdk11api/jdk.accessibility/com/sun/java/accessibility/util/package-summary.html

希望对你学习Java访问桥有所帮助

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

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

相关文章

二维数组中各个三角形的关系,三角形的打印同理

给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n5,该矩阵如下 (这是一个题目,但是我这个写法在牛客刷题中是不能正确的得分的,但是我找到了各个关系,然后分享给大家) 然后再对其进行求和处理,是…

在IntelliJ IDEA中使用.ignore插件忽略Git不必要提交的文件

第一步: 点击File->Settings,在左侧菜单找到Plugins,点击搜索栏搜索.ignore,点击Install 第二步: 重启idea -->在项目上右键->New ->.ignore file ->.gitignore file(Git) 第三部: 在项目中…

http协议的简单总结

目录 1.http协议的特性 2.http协议的请求 3.get请求和post请求的区别 4.http协议的响应 1.http协议的特性 http协议是建立在TCP/IP协议之上应用层协议,默认端口为80,8080 http协议的的特点是无状态,无连接(短连接) 2.http协…

【面试题】京东面试查漏补缺

目录一:笔试题1.如何获取URL中的参数方法一方法二2.怎么平铺多维数组方法一方法二:递归方法三: flat() 和 flatMap()二:面试题1.promise相关问题2.vue nextTick的作用和原理3.http状态码304缓存相关问题4.其他常规问题省略wh零售事…

在线学习(online learning)——Chapter 2 Problem Formulations and Related Theory

在线学习(online learning)——Chapter 2 Problem Formulations and Related Theory 本章中,我们将首先给出一个经典的在线学习问题的形式化描述,即在线二分类(online binary classification),然后介绍统计学习理论、在线凸优化和博弈论的基…

Zabbix“专家坐诊”第179期问答汇总

欢迎大家加入乐维社区zabbix问答专栏,除了在论坛发帖求问外,还可以在QQ群里交流进步,并且每周三我们会进行免费的技术答疑活动。 问题一: Q:Zabbix alert syncer processes more than 75% busy,这个告警&…

Live800:优秀的在线客服系统配置哪些功能模块?

在线客服系统是企业客服解决客户疑惑的软件系统,是企业统一对外联系的窗口。为了提升客户服务质量,提高客服人员工作效率,越来越多的企业配置了在线客服系统。那一款优秀的在线客服系统需要配置哪些功能模块呢?一、在线沟通模块在…

简明精要Android IPC通信

目录 一、Android应用层IPC通信方式 二、IPC通信数据拷贝次数 这里指的从应用层角度,IPC通信方式。简单记录一下。 一、Android应用层IPC通信方式 Bundle:四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中…

MySQL学习之一条SQL更新语句的执行

文章目录前言一、MySQL更新操作大致流程二、redo log介绍三、binlog介绍四、MySQL更新操作的具体流程前言 今天我们通过一条SQL更新语句,了解MySQL的日志系统 一、MySQL更新操作大致流程 更新数据库表上的操作,跟这个表有关的查询缓存会失效。这条语句…

MyBatisPlus(MP)学习记录(分页查询的开启+日志打印配置+乐观锁+映射匹配+字段匹配和表名匹配+null值判定+代码生成器等等)

MP介绍(官网链接) MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 前言 本篇文章展示的MP教学中涉及到的版本如下: IDE…

Unity 之 Addressable可寻址系统 -- 可寻址系统概念介绍 -- 入门(一)

可寻址系统面板概念 -- 入门(一)一,可寻址系统概念介绍1.1 官方话术1.2 几个概念二,可寻址系统目录介绍2.1 导入工程2.2 目录介绍概述:本片文章带大家了解可寻址系统的相关概念,为大家介绍可寻址系统导入方…

Elasticsearch:如何在 Docker 上运行 Elasticsearch 8.x 进行本地开发

对于 Elasticsearch 的新主要版本 (8.x.x),有关于在 Docker 上运行 Elasticsearch 和 Kibana 的重大更新。 过去适用于以前版本的 Docker 和 Docker Compose 的命令和语法需要更新才能适用于最新版本。 在这篇文章中,我们将介绍如何使用 Docker 和 Docke…

Hudi系列5:Hudi与Spark集成

文章目录一. Spark操作Huid概述二. Spark-Shell方式三. pyspark方式四. SparkSQL方式参考:一. Spark操作Huid概述 Hudi各个版本支持Spark版本情况: 将hudi集成spark的jar包,放到spark的jars目录 -- 同步到其它节点 cd /home/hudi-0.12.0/packaging/hudi-spark-b…

【设计模式】UML类图

设计模式学习之旅(一) 查看更多可关注后查看主页设计模式DayToDay专栏 一.UML概述 统一建模语言(Unified Modeling Language,UML),是一种用于软件系统分析和设计的语言工具。特点是简单、统一、图形化、能表达软件设计中的动态与静…

Matlab论文插图绘制模板第72期—金字塔图

前段时间,有朋友觉得一篇文章里的插图看着不错,问Matlab能不能实现: 想了想,Matlab中并没有现成的画图代码。 但本质上,这种图其实就是横向柱状图的变体,而横向柱状图的绘制模板之前有分享过: …

Java多线程:线程的优先级 || 线程的中断 || 线程的分类 || 线程的定时器

Java多线程:线程的优先级 || 线程的中断 || 线程的分类 || 线程的定时器 每博一文案 正如村上春树所说:“当暴风雨过去,你不会记得自己是如何度过的,你甚至不确定,暴风雨是否真正结束了, 但你已不再是当初…

分布式唯一ID的几种生成方案,一次性全掌握!

上一篇文章,我们聊了一下分库分表相关的一些基础知识,具体可以参见:《用真实业务场景告诉你,高并发下如何设计数据库架构?》。 这篇文章,我们就接着分库分表的知识,来具体聊一下全局唯一id如何…

Flutter 基础-上

一、初始化项目 Material Design (Google 推出的前端UI 解决方案) 官网: https://www.material.io/中文网: https://material-io.cn/ Flutter 中一切内容都是组件(Widget) 无状态组件(StatelessWidget)有状态组件(StatefulWidget) 二、app结构 MaterialApp title (任务管理器…

【VScode技巧】:platformio部署ESP32Cam开发板

学习目标: 前几天用Arduino开发了ESP32Cam,实现了人脸识别的功能,今天无聊想了想ESP32Can也可以在VScode的Platformio中使用,于是就试着配置了一下。以下是配置环境的过程,谢谢大家观看。 正所谓工欲善其事&#xff0c…

【零基础】学python数据结构与算法笔记10

文章目录前言57.链表介绍58.链表的创建和遍历59.链表的插入和删除60.双链表61.链表总结62.哈希表62.哈希表实现64.哈希表应用总结前言 学习python数据结构与算法,学习常用的算法, b站学习链接 57.链表介绍 链表是由一系列节点组成的元素集合。每个节点…