OkHttp连接池
🧰 调整连接池的核心参数
✅ 最大空闲连接数(maxIdleConnections):
- 含义:连接池中最多保留的空闲连接数量。
- 默认值:5
- 建议值:10~50(视并发量而定)
✅ 连接保持时间(keepAliveDuration):
- 含义:空闲连接在连接池中保持的最大时间。
- 默认值:1 分钟
- 建议值:1 ~ 5 分钟(根据请求频率设定)
🔧 示例代码:如何调整连接池大小
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import java.util.concurrent.TimeUnit;public class HttpClient {public static OkHttpClient createClientWithCustomPool() {// 自定义连接池配置ConnectionPool connectionPool = new ConnectionPool(20, // 最大空闲连接数1, // 保持 1 分钟TimeUnit.MINUTES);return new OkHttpClient.Builder().connectionPool(connectionPool) // 设置自定义连接池.connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).build();}
}
配置自定义连接池可以帮助你更好地管理 HTTP 连接,特别是在高并发场景下。通过调整连接池的参数,如最大空闲连接数和保持存活时间,可以有效提高应用性能,减少超时的可能性。
以下是配置可复用自定义连接池的具体步骤:
1. 创建 ConnectionPool
实例
你可以根据你的应用需求创建一个 ConnectionPool
实例。以下是一个示例,其中设置了最大空闲连接数为20,连接保持时间为1分钟(60秒)。
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import java.util.concurrent.TimeUnit;public class HttpClientFactory {// 自定义连接池配置private static final int MAX_IDLE_CONNECTIONS = 20; // 最大空闲连接数private static final long KEEP_ALIVE_DURATION_MS = 1; // 连接保持时间(分钟)public static OkHttpClient createOkHttpClient() {ConnectionPool connectionPool = new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION_MS, TimeUnit.MINUTES);return new OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS) // 设置连接超时时间.readTimeout(20, TimeUnit.SECONDS) // 设置读取超时时间.writeTimeout(20, TimeUnit.SECONDS) // 设置写入超时时间.connectionPool(connectionPool) // 应用自定义连接池.build();}
}
2. 在 Retrofit 中使用自定义的 OkHttpClient
如果你正在使用 Retrofit,并希望在 Retrofit 配置中使用这个自定义的 OkHttpClient
,你可以这样做:
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;public class RetrofitClient {private static final String BASE_URL = "http://yourapi.com/";public static Retrofit getRetrofitInstance() {OkHttpClient okHttpClient = HttpClientFactory.createOkHttpClient();return new Retrofit.Builder().baseUrl(BASE_URL).client(okHttpClient) // 使用自定义的 OkHttpClient.addConverterFactory(GsonConverterFactory.create()).build();}
}
3. 考虑添加拦截器进行调试或日志记录
为了更好地调试或了解网络请求的情况,你可以考虑添加一些拦截器到 OkHttpClient
中,例如用于日志记录的拦截器:
import okhttp3.logging.HttpLoggingInterceptor;// 在 OkHttpClient 的 Builder 方法中添加:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // 设置日志级别return new OkHttpClient.Builder()....addInterceptor(loggingInterceptor) // 添加日志拦截器.build();
4. 根据实际情况调整参数
- MAX_IDLE_CONNECTIONS:这取决于你的应用可能同时打开的最大请求数量。如果不确定,可以从默认值5开始,逐步增加直到找到最佳性能点。
- KEEP_ALIVE_DURATION_MS:一般设置为1到5分钟是比较常见的选择,但这也取决于你的具体应用场景和服务端的支持情况。
通过上述步骤,你可以配置并使用自定义的连接池来优化你的网络请求处理逻辑,从而改善应用的整体性能和稳定性。如果有更多关于特定场景的问题或需要进一步的帮助,请随时提问!
💡 如何选择合适的连接池大小?
场景 | 推荐最大空闲连接数 | 推荐保持时间 |
---|---|---|
单线程、低频调用 | 5~10 | 1 分钟 |
多线程、中等并发 | 20~30 | 2~3 分钟 |
高并发、高频调用 | 50~100 | 5 分钟 |
文件上传/下载 | 适当减少连接数,增加超时时间 | 保持时间可适当延长 |
📌 注意事项
-
每个 OkHttpClient 实例拥有独立的连接池
- 如果你有多个
OkHttpClient
实例,需要为每个实例都设置相同的连接池,或复用同一个实例。 - 否则它们会使用各自的默认连接池,资源无法共享。
- 如果你有多个
-
避免连接池过大
- 过多的连接可能会导致系统资源耗尽(如文件句柄不足)。
- 或者被服务端限制(例如 Nginx、API 网关限制单 IP 的连接数)。
-
复用 OkHttpClient 实例
- 不要每次发起请求都新建一个
OkHttpClient
。 - 应该在整个应用生命周期内复用一个实例(推荐作为 Bean 注册到 Spring 容器中)。
- 不要每次发起请求都新建一个
✅ 在 Spring Boot 中注册 OkHttpClient Bean 示例
@Configuration
public class OkHttpConfig {@Beanpublic OkHttpClient okHttpClient() {ConnectionPool pool = new ConnectionPool(20, 1, TimeUnit.MINUTES);return new OkHttpClient.Builder().connectionPool(pool).connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)).build();}
}
然后在 Retrofit 配置中使用这个 Bean:
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.example.com").client(okHttpClient) // 使用 Spring 注入的 OkHttpClient.addConverterFactory(GsonConverterFactory.create()).build();
🛠️ 查看当前连接池状态(调试用)
你可以打印当前连接池的状态来监控其运行情况:
OkHttpClient client = ...; // 你的 OkHttpClient 实例
ConnectionPool pool = client.connectionPool();System.out.println("Max idle connections: " + pool.maxIdleConnections());
System.out.println("Keep alive duration (ms): " + pool.keepAliveDurationMillis());
✅ 总结
操作 | 方法 |
---|---|
调整连接池大小 | 创建 new ConnectionPool(maxIdle, keepAlive, unit) |
应用到 OkHttpClient | .connectionPool(connectionPool) |
复用建议 | 全局复用一个 OkHttpClient 实例 |
避免问题 | 不要设置过大的连接池,避免资源浪费或服务器限制 |
如果你能告诉我你的具体使用场景(比如每秒多少个请求、是否上传大文件、服务端响应时间等),我可以帮你定制更合理的连接池参数 😊
相关文章:
OkHttp连接池
🧰 调整连接池的核心参数 ✅ 最大空闲连接数(maxIdleConnections): 含义:连接池中最多保留的空闲连接数量。默认值:5建议值:10~50(视并发量而定) ✅ 连接保持时间&…...
哈希表的实现01
文章目录 哈希表的实现01哈希概念直接定址法哈希冲突负载因子将关键字转换为整数 哈希函数除法散列法:乘法散列法(了解)全域散列法(了解) 处理哈希冲突(开放定址法)线性探测:二次探测…...
学习日志06 java
还有四天要去比赛了,能赢吗?逼自己一把。。。!!加油! 1 对比一下java重写还是不重写tostring的区别 1. 不重写 toString() 的情况 java class Point {private int x;private int y;public Point(int x, int y) {th…...
spring中的@MapperScan注解详解
一、核心功能与作用 MapperScan是Spring与MyBatis框架集成时用于批量扫描Mapper接口的核心注解,其主要功能包括: 自动注册Mapper接口 通过指定包路径,Spring会自动扫描该路径下的所有Mapper接口,并将其注册为Spring Bean&#x…...
PYTHON训练营DAY25
BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐:捕获所有类型的异常&…...
视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解
引言 在数字图像与视频压缩领域,离散余弦变换(Discrete Cosine Transform, DCT)凭借其卓越的能量集中特性,成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域,分离出DC系数(直流分量&…...
YOLO v1:目标检测领域的革命性突破
引言 在计算机视觉领域,目标检测一直是一个核心任务,它不仅要识别图像中的物体类别,还要确定物体的精确位置。传统目标检测方法如R-CNN系列虽然准确率高,但计算复杂度高、速度慢。2016年,Joseph Redmon等人提出的YOLO…...
AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)
目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …...
HVV蓝队实战面试题
HVV蓝队实战,防守筹备之“部署蜜罐捕获横向扫描行为”。 蜜罐通过模拟内网脆弱服务(如SMB、SSH、数据库端口),诱捕攻击者突破边界后的横向探测行为。 通过监测高频端口扫描、非常规协议请求及非授权IP段遍历,结合多源…...
正则表达式(二)-高级应用_谨慎使用
没事建议别瞎用正则表达式,能让后端处理好的数据,尽量后端处理好,减少前端对数据的处理,保证数据原始的完整性,减少前端耗能。(其实就是懒╮(╯▽╰)╭) 1. 分组捕获 分组捕获用于提取匹配的子字符串,使用 () 定义分组。 示例:提取日期中的年、月、日 (\d{4})-(\d{2…...
在K8S集群中部署EFK日志收集
目录 引言环境准备安装自定义资源部署ElasticsearchMaster 节点与 Data 节点的区别生产优化建议安装好以后测试ES是否正常部署Fluentd测试filebeat是否正常推送日志部署Kibana获取账号密码,账号是:elastic集群测试 引言 系统版本为 Centos7.9内核版本为…...
解决常见数据库问题:保障数据安全与稳定的全方位指南
本文结合行业最佳实践与前沿技术,系统性总结数据库运维中的核心问题与解决方案,助力开发者构建高可靠、高性能的数据服务) 一、性能优化:从SQL到架构的全面调优 性能问题是数据库运维中最常见的挑战,直接影响用户体验…...
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛 2025年5月9日至11日,第五届中国膜计算论坛(CWMC 2025)在成都信息工程大学隆重召开。会议由 国际膜计算学会(IMCS) 主办,汇聚了来…...
Femap许可硬件绑定
在电磁仿真领域,Femap软件因其卓越的性能和广泛的应用场景而备受用户青睐。为了确保软件的安全与稳定运行,Femap提供了许可硬件绑定的功能。本文将详细介绍Femap许可硬件绑定的概念和优势,帮助您了解并充分利用这一功能,确保软件在…...
构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
一、建造者模式的本质与核心价值 在面向对象的软件设计中,创建复杂对象一直是一个需要精心处理的问题。当一个对象的构建需要多个步骤,并且这些步骤具有不同的组合方式时,传统的构造函数方式会显得力不从心。建造者模式(Builder …...
vim启动的时候,执行gg
在 Vim 编辑器中,gg 命令是一个非常有用的命令,它可以将光标快速移动到当前窗口的顶部(即第一行)。如果你想在 Vim 启动时自动执行 gg 命令,有几种方法可以实现这一点: 方法 1:使用 Vim 的启动…...
【SSL部署与优化】HTTP/2与HTTPS的协同效应
HTTP/2与HTTPS的协同效应:为何HTTP/2强制要求TLS 1.2? HTTP/2是HTTP协议的现代升级版,旨在通过多路复用、头部压缩等技术提升性能。然而,HTTP/2的设计与部署与HTTPS(TLS加密)紧密相关,甚至强制…...
JavaScript篇:揭秘函数式与命令式编程的思维碰撞
大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了…...
ubuntu24.04上安装NVIDIA driver+CUDA+cuDNN+Anaconda+Pytorch
一、NVIDIA driver 使用Ubuntu系统的:软件和更新——>附加驱动,安装NVIDIA驱动。 二、CUDA 安装命令:sudo apt install nvidia-cuda-toolkit 三、cuDNN cuDNN 9.10.0 Downloads | NVIDIA Developer 四、Anaconda Download Anaconda Di…...
vue3基础学习(上) [简单标签] (vscode)
目录 1. Vue简介 2. 创建Vue应用 2.1 下载JS文件 2.2 引用JS文件 2.3 调用Vue方法编辑 2.4 运行一下试试: 2.5 代码如下 3.模块化开发模式 3.1 Live Server插件 3.2 运行 4. 常用的标签 4.1 reactive 4.1.1 运行结果 4.1.2 代码: 4.2 ref 4.2.1 运行结果 4.2.2…...
.Net HttpClient 使用代理功能
HttpClient 使用代理功能 实际开发中,HttpClient 通过代理访问目标服务器是常见的需求。 本文将全面介绍如何在 .NET 中配置 HttpClient 使用代理(Proxy)功能,包括基础使用方式、代码示例、以及与依赖注入结合的最佳实践。 注意…...
深入理解Java适配器模式:从接口兼容到设计哲学
引言:接口不兼容的困局 在软件开发中,我们经常遇到这样的场景: 旧系统有一个「RS232串口设备」(仅支持sendByRS232(String data)方法),新系统需要通过「USB接口」(要求sendByUSB(String data)…...
非异步信号安全函数
这个程序演示了如何使用sigaction来捕获和处理信号(特别是SIGINT,即CtrlC)。以下是关键点和潜在问题的分析: 程序功能 信号捕获:注册自定义处理函数handler来捕获信号2(SIGINT,通常由CtrlC触发…...
PHP黑白胶卷底片图转彩图功能 V2025.05.15
关于底片转彩图 传统照片底片是摄影过程中生成的反色图像,为了欣赏照片,需要通过冲印过程将底片转化为正像。而随着数字技术的发展,我们现在可以使用数字工具不仅将底片转为正像,还可以添加色彩,重现照片原本的色彩效…...
【C++ / STL】封装红黑树实现map和set
文章目录 一. 源码及框架分析1.决定搜索类型的传参思考:为什么要传第一个参数 2.KeyOfValue的作用 二. 模拟实现map和set1. 实现出复用红黑树框架,并支持insert2. 支持iterator的实现iterator实现思路分析【iterator操作实现详解】 3.支持map的[ ]操作4.map和set代码…...
记录: Windows下远程Liunx 系统xrdp 用到的一些小问题(免费踩坑 记录)
采用liunx Ubuntu22.04版本以下,需要安装 xrdp 或者VNC 具体过程就是下载 在linux命令行里 首先更新软件包:sudo apt update 安装xrdp服务:sudo apt install xrdp 启动XRDP:sudo systemctl start xrdp(如果在启动的…...
WordPress 文章和页面:它们的区别是什么?
很多刚接触WordPress的用户,在创建网站内容时往往会遇到这样一个问题:“我应该用‘文章’还是‘页面’?”虽然两者都能发布内容,但它们之间到底有什么区别呢?这篇文章将从易于理解的角度,帮助大家厘清WordP…...
【工具变量】各省市场化指数-杨兴权版共三个方法(1997-2023年)
市场化指数是衡量中国各地区市场化改革进程的重要指标。本次数据基于杨兴全、马连福和夏立军三位学者的研究成果,系统整理并更新了我国1997-2023年间31个省、自治区、直辖市的市场化指数,便于研究者进行横向和纵向比较分析。 一、数据介绍 数据名称&…...
Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
团结引擎 1.5.0 版本已于 4 月 14 日正式发布,从 1.5.0 版本开始,团结引擎车机版带来了一个激动人心的新能力 —— Android App View。现在,开发者可以将任意第三方安卓应用以 2D 组件或 3D 组件的形式,原生嵌入到 Tuanjie 开发的…...
完整的 CentOS 6.10 虚拟机安装启动脚本
好的!下面是一个 完整的 CentOS 6.10 虚拟机安装启动脚本,专为你在 macOS(M 系芯片) QEMU(x86_64 软件模拟) 环境设计,确保你能顺利启动并安装一个接近 Red Hat 6.4 的开发环境。 ⸻ ✅ 前提准…...
如何远程执行脚本不留痕迹
通常我们在做远程维护的时候,会有这么一个需求,就是我想在远程主机执行一个脚本,但是这个脚本我又不想保留在远程主机上,那么有人就说了,那就复制过去再登录远程执行不就行了吗?嗯嗯,但是这还不…...
观测云:从云时代走向AI时代
过去十年,云计算让企业的数据处理能力实现了指数级增长,而观测云作为全栈监控观测平台,见证并参与了这一进程。通过强大的数据采集、处理与展示能力,观测云帮助数百家企业实现了对 IT 基础设施、应用服务、业务链路的全面掌控。 …...
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key DeepSeek v3的时候,它模型已经足够强大到能带来consistency稳定性。所以当这个DeepSeek R1 Zero或者DeepSeek R1使用GRPO进行训练的时候,它能够…...
鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp
UniApp 实现图片上传与压缩功能 前言 在移动应用开发中,图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片,都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大,直接上传会导致流量消耗过大、上传时间过长&#x…...
SymPy | 如何提取指定项的系数
SymPy 是 Python 中一个强大的符号计算库,广泛应用于数学、物理和工程领域的符号运算。在代数表达式的处理中,提取特定项的系数是一项常见且重要的操作。本文将详细介绍 SymPy 中提取指定项系数的多种方法,并通过丰富的示例帮助读者掌握这些技…...
MUSE Pi Pro 更换kernel内核及module模块
视频讲解: MUSE Pi Pro 更换kernel内核及module模块 脚本仓库: https://github.com/LitchiCheng/MUSE-Pi-Pro-Learning 结合上期编译内核,编译成功后的输出如下: 输入 uname -a 可以看到如下信息,未修改的内核时间在 …...
java每日精进 5.14【参数校验】
参数校验 1.1概述 本文使用 Hibernate Validator 框架对 RESTful API 接口的参数进行校验,确保数据入库的正确性。 例如,在用户注册时,校验手机号格式、密码强度等。如果校验失败,抛出 ConstraintViolationException 或相关异…...
CPS联盟+小程序聚合平台分销返利系统开发|小红书番茄网盘CPA拉新推广全解析
导语: 在私域流量与社交电商爆发的时代,CPS联盟分销返利系统与小红书CPA拉新推广成为企业增长的核心引擎。本文深度解析如何通过小程序聚合平台开发、多层级返利机制搭建及精准CPA推广策略,快速占领市场,实现用户裂变与收益倍增。…...
基于EFISH-SCB-RK3576/SAIL-RK3576的光伏逆变器控制器技术方案
(国产化替代J1900的能源物联网解决方案) 一、硬件架构设计 电力转换与控制模块 高精度功率控制: Cortex-M0硬实时核驱动多相PWM(频率>200kHz),动态调节DC-AC转换误差<0.5%FPGA实现MPPT算法…...
HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
HarmonyOS NEXT 适配高德地图 Flutter SDK 实现地图展示,添加覆盖物和移动 Camera 在现代移动应用开发中,地图功能是许多应用的核心组成部分之一。HarmonyOS NEXT 提供了强大的跨平台开发能力,而高德地图 Flutter SDK 则为开发者提供了丰富的…...
计算机网络:手机和基站之间是通过什么传递信息的?怎么保证的防衰减,抗干扰和私密安全的?
手机与基站之间的通信依赖无线电磁波信号,其传输介质、频率选择、抗衰减/抗干扰技术及隐私保护机制共同构成了现代移动通信的核心。以下从技术原理到实际应用逐一解析: 一、信号本质与传输介质 1. 信号类型 电磁波:手机与基站通过射频(RF)电磁波传递信息,采用数字调制技…...
C#调用C++dll 过程记录
C#调用Cdll 过程记录 问题:1、设置修改记录2 修改对应问题3 继续出问题4 许久之后的转机5 最后的成功 如题,过程记录 问题: 提示:main 已经在 dllmain.obj 中定义,针对该问题作进一步的处理 1、设置修改记录 &…...
Vue百日学习计划Day4-8——Gemini版
番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。灵活性: 这仍然是一个建议性计划。某些主题(尤其是 Flexbox 和 Grid)可能需要比预期更多的时间来练习和理解…...
DHCP协议
DHCP协议 1、掌握DHCP的工作原理 2、会在Windows server上去部署DHCP服务 3、抓流量 正常收到攻击后 一、DHCP 1、DHCP基本概念 dhcp(动态主机配置协议):主要就是给客户机提供TCP/IP参数(IP地址、子网掩码、网关、DNS等) 2、好处 减少管理员工作…...
级联与端到端对话系统架构解析:以Moshi为例
一、对话系统架构对比 1.1 级联对话系统(Cascaded Dialogue Systems) 传统级联系统采用多阶段处理流程: 语音识别(ASR):将24kHz音频信号通过卷积神经网络(CNN)和Transformer转换为…...
3、ubantu系统docker常用命令
1、自助查看docker命令 1.1、查看所有命令 docker 客户端非常简单,可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 angqiangwangqiang:~$ dockerUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:ru…...
【leetcode】349. 两个数组的交集
文章目录 代码1.set()2. 哈希表3. 数组 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输…...
BGP联邦和发射试验
一、要求 二、需求分析 1. **拓扑与地址规划** - **AS1**:环回16.1.1.0/24需宣告,192.168.1.0/24不宣告。 - **AS3**:环回11.1.1.0/24需宣告,192.168.2.0/24不宣告。 - **AS2**:使用172.16.0.0/16划分子…...
LeetCode Hot100 (1/100)
目录 一、有关数组和动态数组的排序(sort函数) 1.普通数组的排序 基本用法 降序排序 2.vector的排序 基本用法 降序排序 二、数组长度和一些vector的基本语法 1. 静态数组长度计算 2. 安全获取数组长度(C17 起) 3.vecto…...
LeetCode热题100--234.回文链表--简单
1. 题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入…...