当前位置: 首页 > 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…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...