当前位置: 首页 > news >正文

提高Java程序效率:ImmutableList、Stream API 和 JSON序列化实战指南

常用列表构建方法:

1.ImmutableList.of() : 静态方法、不可变的列表

可以接受任意数量的参数,并将它们作为元素添加到新创建的列表中,但是一旦创建,集合的内容就不能被改变。在多线程环境中非常有用,因为它可以避免并发修改异常,并且可以安全地在多个线程之间共享。

使用 ImmutableList.of() 创建的列表是线程安全的,并且具有高效的性能,因为它们是预先计算和缓存的,这使得访问元素非常快速。

此外,由于列表是不可变的,所以它们是不可变的集合的一个很好的选择,可以作为函数的返回值,或者作为对象的属性,以确保集合的内容不会被外部代码修改。

2.Lists.newArrayList() : 用于快速创建一个空的 ArrayList, 或者从已有的集合或数组中创建一个新的 ArrayList。可变的,可以添加、删除或修改其中的元素。

流中map和flatMap的使用场景

在Java的Stream API中,map 和 flatMap 是两个常用的方法,它们都用于转换流中的元素,但使用场景和转换的方式有所不同。

使用 map 的情况

map 方法用于将流中的每个元素转换成另一种形式或类型,但是它不会改变流中元素的数量。map 通常用于一对一的转换。

例子: 假设你有一个 List 包含员工对象,每个员工对象都有一个 getName() 方法返回员工的名字。如果你想要得到一个包含所有员工名字的 List,你可以使用 map 方法:

List<Employee> employees = ...; // 员工列表
List<String> names = employees.stream().map(Employee::getName) // 将每个员工对象转换为名字.collect(Collectors.toList());

使用 flatMap 的情况

flatMap 方法用于将流中的每个元素转换成另一个流,然后将这些流合并成一个流。flatMap 通常用于一对多的转换。

例子: 假设你有一个 List 包含订单对象,每个订单对象都有一个 getItems() 方法返回该订单包含的商品列表。如果你想要得到一个包含所有订单中所有商品的 List,你可以使用 flatMap 方法:

List<Order> orders = ...; // 订单列表
List<Item> items = orders.stream().flatMap(order -> order.getItems().stream()) // 将每个订单转换为商品列表.collect(Collectors.toList());

在这个例子中,每个订单可能包含多个商品,flatMap 将每个订单的 getItems() 方法返回的 List<Item> 流化,并合并这些流,最终得到一个包含所有商品的 List<Item>。

总结

  • 使用 map 当你需要将流中的每个元素转换成另一个对象或值,且转换是一对一的。
  • 使用 flatMap 当你需要将流中的每个元素转换成一个流(或集合),并且想要将这些流合并成一个更大的流,且转换是一对多的。

flatMap 可以看作是 map 和 flatten 的组合,即先映射(map),然后将结果展平(flatten)成一个单一的流。

预编译正则表达式

正则表达式的预编译是指将正则表达式的字符串模式编译成一个 Pattern 对象。编译过程是比较耗时的操作,如果在方法体内定义,每次方法调用时都会重新编译正则表达式,增加了不必要的开销。因此,推荐在类的静态成员中预先编译正则表达式,并在需要时直接使用预编译的 Pattern 对象。

public class XxxClass {// Use precompileprivate static final Pattern NUMBER_PATTERN = Pattern.compile("[0-9]+");public Pattern getNumberPattern() {// Return the precompiled patternreturn NUMBER_PATTERN;}
}

这样修改后,每次调用 getNumberPattern() 方法时都会返回同一个预编译的 Pattern 对象,避免了重复编译的开销,提高了运行效率。

所有的包装类对象之间值的比较,全部使用equals方法比较。

  1. 对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
Integer a = 235;
Integer b = 235;
if (a.equals(b)) {// code
}

SimpleDateFormat(线程不安全)

在Java 1.8之后,SimpleDateFormat存在线程安全问题,因为它是非线程安全的。多线程环境中使用SimpleDateFormat可能会导致不可预测的结果。

JDK1.8后用:

private static final DateTimeFormatter dateTimeFormatter = 
DateTimeFormatter.ofPattern("yyMMddHHmmss");

JSON对象转string性能

  1. List<String>数组,转String对象输出
List<String> list = new ArrayList<>();
for(int i=0; i<2000000; i++){list.add(RandomString.get().randomAlphaNumeric(5));
}
long startone = System.currentTimeMillis();
cn.hutool.json.JSONUtil.toJsonStr(list);
long endone = System.currentTimeMillis();
System.out.println("cn.hutool.json.JSONUtil time:"+(endone-startone));
com.alibaba.fastjson.JSON.toJSONString(list);
long endtwo = System.currentTimeMillis();
System.out.println("com.alibaba.fastjson.JSON time:"+(endtwo-endone));
com.alibaba.fastjson2.JSON.toJSONString(list);
long endthree = System.currentTimeMillis();
System.out.println("com.alibaba.fastjson2.JSON time:"+(endthree-endtwo));
  1. 100个
    1. cn.hutool.json.JSONUtil time:14
    2. com.alibaba.fastjson.JSON time:55
    3. com.alibaba.fastjson2.JSON time:80
  1. 1000个
    1. cn.hutool.json.JSONUtil time:16
    2. com.alibaba.fastjson.JSON time:55
    3. com.alibaba.fastjson2.JSON time:85
  1. 10000个
    1. cn.hutool.json.JSONUtil time:24
    2. com.alibaba.fastjson.JSON time:69
    3. com.alibaba.fastjson2.JSON time:101
  1. 100000个
    1. cn.hutool.json.JSONUtil time:75
    2. com.alibaba.fastjson.JSON time:96
    3. com.alibaba.fastjson2.JSON time:93
  1. 1000000个
    1. cn.hutool.json.JSONUtil time:319
    2. com.alibaba.fastjson.JSON time:159
    3. com.alibaba.fastjson2.JSON time:124
  1. 2000000个
    1. cn.hutool.json.JSONUtil time:576
    2. com.alibaba.fastjson.JSON time:255
    3. com.alibaba.fastjson2.JSON time:132

结论:

  • 对于小规模数据的 JSON 序列化任务,Hutool 是一个很好的选择。
  • 对于大规模数据的 JSON 序列化任务,建议使用 Fastjson2,以获得更高的性能。

相关文章:

提高Java程序效率:ImmutableList、Stream API 和 JSON序列化实战指南

常用列表构建方法&#xff1a; 1.ImmutableList.of() &#xff1a; 静态方法、不可变的列表 可以接受任意数量的参数&#xff0c;并将它们作为元素添加到新创建的列表中&#xff0c;但是一旦创建&#xff0c;集合的内容就不能被改变。在多线程环境中非常有用&#xff0c;因为…...

[CP_AUTOSAR]_分层软件架构_接口之通信模块交互介绍

目录 1、协议数据单元(PDU)传输2、通信模块的案例2.1、SDU、 PCI & PDU2.2、通信模块构成2.3、从数据传输的角度看Communication2.4、Communication中的接口 在前面 《关于接口的一些说明》 以及  《Memory软件模块接口说明》 中&#xff0c;简要介绍了CP_AUTOSAR分层…...

C语言 ——— 浮点数类型 在 内存中 的 存储模式

目录 浮点数存储规则 单\双精度浮点数 存储 S、M、E 的布局 有效数字M 和 指数位E 的特殊规定 浮点数在内存中是否存储的S、M、E 浮点数存储规则 根据国际标准IEEE754&#xff08;电气和电子工程协会&#xff09;规定&#xff1a;任意一个 浮点数F的二进制 都可以表示成…...

socket 收发TCP/UDP

一、c 个人测试记录&#xff0c;有问题还请指出&#xff0c;谢谢 参考&#xff1a;C开发基础之网络编程WinSock库使用详解TCP/UDP Socket开发_c udp使用什么库-CSDN博客 代码中Logger测试见文章&#xff1a; c中spdlog的使用/python中logger的使用-CSDN博客 1、main.cpp 收…...

Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档

什么是 Swagger ? Swagger 是一组围绕 OpenAPI 规范构建的开源工具&#xff0c;可以帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具 包括&#xff1a; Swagger Editor&#xff1a;基于浏览器的编辑器&#xff0c;您可以在其中编写 OpenAPI 定义Swagger UI&…...

spark shell

1.进行shell命令行 spark-shell 2.创建RDD 2.1 读取文件创建RDD 2.1.1读取linux文件系统的文件创建RDD --需要保证每一个worker中都有该文件 val data1 sc.textFile("file:/opt/file/word.txt") 2.1.2读取hdfs文件系统上的文件创建RDD val data2sc.textFile("…...

集群架构-web服务器(接入负载均衡+数据库+会话保持redis)--15454核心配置详解

紧接着前面的集群架构深化—中小型公司&#xff08;拓展到大型公司业务&#xff09;–下面图简单回顾一下之前做的及故障核心知识总结&#xff08;等后期完全整理后&#xff0c;上传资源希望能帮大家&#xff09; web集群架构-接入负载均衡部署web02服务器等 web集群-搭建web0…...

# Redis 入门到精通(七)-- redis 删除策略

Redis 入门到精通&#xff08;七&#xff09;-- redis 删除策略 一、redis 删除策略–过期数据的概念 1、Redis 中的数据特征 Redis 是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态。 XX &#xff1a;具有时效性…...

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到6月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

html+canvas 实现签名功能-手机触摸

手机上的效果图 需要注意&#xff0c;手机触摸和鼠标不是一个事件&#xff0c;不能通用&#xff0c;上一篇是关于使用鼠标的样例 相关代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…...

前端组件化探索与实践:Vue自定义暂无数据组件的开发与应用

摘要 随着前端开发技术的不断进步&#xff0c;组件化开发已成为提升开发效率、降低维护成本的关键手段。本文旨在通过介绍一款Vue自定义暂无数据组件的开发与实践&#xff0c;深入探讨前端组件化开发的重要性、优势及其在实际项目中的应用。 一、引言 在前端开发中&#xff0…...

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题&#xff08;可选&#xff09;5. 安装代码高亮插件 AsmDude&#xff08;可选&#xff09;6. 通义灵码&#xff08…...

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析 简介 本文档适用于合宙Air780E、Air780EP、Air780EQ、Air201 关联文档和使用工具&#xff1a; 从Ramdump里分析内存泄漏问题 无法抓底层log的情况下如何导出死机dump Luatools下载调试工具 EPAT抓取底层日志 F…...

吴松洋院长 艺后整形集团专家组特约成员 全方位责任塑美

...

前端经验:使用sheetjs导出CSV文本为excel

应用场景 很多web表格组件没有提供直接的导出excel功能&#xff0c;但提供了导出CSV的功能。 如果能想办法拿到CSV的内容&#xff0c;就可以利用sheetjs生成excel并导出。 实施步骤 1.拿到CSV的内容字符 每种表格组件都有各自的CSV生成方法&#xff0c;不管用什么方法&…...

【nnUNetv2进阶】十五、nnUNetv2 魔改网络-小试牛刀-引入ECA

nnunet使用及改进教程。 【nnUNetv2实践】一、nnUNetv2安装 【nnUNetv2实践】二、nnUNetv2快速入门-训练验证推理集成一条龙教程 【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会-CSDN博客 其他网络改进参考: 【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入…...

centos(或openEuler系统)安装kafka集群

安装192.168.9.60、192.168.9.61、192.168.9.62这3台kafka集群&#xff08;kraft模式&#xff0c;不用zookeeper&#xff09; 不带密码的 1.每台机器安装kafka&#xff1a; cd /home/kafka wget https://downloads.apache.org/kafka/3.3.1/kafka_2.13-3.3.1.tgz 不通就换这…...

HarmonyOS根据官网写案列~ArkTs从简单地页面开始

Entry Component struct Index {State message: string 快速入门;build() {Column() {Text(this.message).fontSize(24).fontWeight(700).width(100%).textAlign(TextAlign.Start).padding({ left: 16 }).fontFamily(HarmonyHeiTi-Bold).lineHeight(33)Scroll() {Column() {Ba…...

GraphRAG+ollama+LM Studio+chainlit

这里我们进一步尝试将embedding模型也换为本地的&#xff0c;同时熟悉一下流程和学一些新的东西 1.环境还是用之前的&#xff0c;这里我们先下载LLM 然后你会在下载nomic模型的时候崩溃&#xff0c;因为无法搜索&#xff0c;无法下载 解决办法如下lm studio 0.2.24国内下载…...

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程② | 5.4 - 5.8

前言 第 5 章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术的内容&#xff0c;学习要以教材为准。 目录 5.4 软件实现 5.4.1 软件配置管理 5.4.2 软件编码 5.4.3 软件测试 5.5 部署交付 5.5.1 软件部署 5.5.2 软件交付 5.5.3 持续交付 5.5.4…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...