java中不可变对象使用避坑

news2025/1/20 10:49:12

总结:

        1,不要大量使用不可变对象和不可边对象提供的方法(每次调用不可变对象的修改方法会创建出新的对象出来,导致频繁的YGC

        2,计算密集型任务不要使用包装类(包装类体积大,数据密度低,增加取存数据时间。运算时也会创建大量的包装类对象出来)

        3,不要再循环体中使用不可变对象提供的方法(可能会创建大量的一次性对象出来)

一,java中的不可变对象

       Java中有许多不可变的对象,以下是其中的一些:

  1. 字符串(String):字符串在Java中是不可变的对象。一旦创建了一个字符串对象,它的值就不能被修改。
  2. 整数(Integer)、长整数(Long)、浮点数(Float)和双精度浮点数(Double):这些数字类型在Java中也是不可变的对象。一旦创建了一个数字对象,它的值就不能被修改。
  3. 枚举(Enum):枚举类型也是不可变的对象。枚举类型中的每个元素都是一个不可变的对象。
  4. LocalDate、LocalTime、LocalDateTime:Java 8中的日期和时间API中的这些类也是不可变的对象。一旦创建了一个日期或时间对象,它的值就不能被修改。
  5. BigInteger、BigDecimal:这些类提供了任意精度的整数和浮点数运算,也是不可变的对象。

Java 中的不可变对象(Immutable Objects)详解_immutable object is modified-CSDN博客

二,不可变对象的优点

        线程安装,当a、b两个线程使用一个不可变对象时obj时,b线程修改obj值时实际会创建一个新的对象给b使用,这时a、b所持有的实际是不同的对象,互不影响,所有是线程安全的、

三,测试不可变对象LocalDateTime的plusMinutes()方法

        1. main 方法

public class test6 {

    public static void main(String[] args) throws InterruptedException {
        String threadName = Thread.currentThread().getName();
        System.out.println("Current Thread Name: " + threadName);

        // 获取当前进程PID
        RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
        String processId = runtimeMxBean.getName().split("@")[0];
        System.out.println("Current Process ID: " + processId);
        Thread.sleep(2000);
        LocalDateTime dateTime1 = LocalDateTime.of(2024, 5, 1, 9, 0); // 2024年5月1日 9:00

        Double d = 1.0;
        double e = 1.0;
        while (true){
           // e +=1.0;
            dateTime1.plusMinutes(1);

        }
    }
}

        2. 运行方法 

        java -Xms100M -Xmx100M -Xmn50M -cp . test6.java

        这里设置设置JVM启动时的堆内存大小、最大堆内存为100M,设置新生代的大小为50M

        

        3 . 查看YGC次数,平均每秒50多次

        4,统计heap中的对象数量

        注:LocalDateTime对象中包含了LocalTime对象和LocalDate对象

        5,源码分析

plusMinutes()->plusWithOverflow()->with()

        当this的日期和时间不等时就会创建新的对象出来,

(LocalDateTime的date、time属性由final修饰,不可更改)

        6,可用同样的方法测试包装类

        虽然java为基本数据类型提供了包装类,但有的情况用包装类真不合适,创建时间长,回收时间长,存取时间长。

        当修改为基本数据类型时:

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

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

相关文章

数据中心逆变电源的功率容量计算方法

随着信息技术的快速发展,数据中心在现代社会中的地位日益凸显,各种企业和机构对数据中心的依赖程度也越来越高。而电源作为数据中心的核心基础设施,其可靠性和高效性直接影响着数据中心的稳定运行。因此,如何设计一款性能优越、可…

OpenAI 今日(北京时间 5 月 14 日凌晨两点)将发布的大更新,不是 GPT-5,也不是搜索引擎

🦉 AI新闻 🚀 OpenAI 今日(5月13日)将发布的大更新,不是 GPT-5,也不是搜索引擎 摘要:OpenAI 预计即将推出一款新的 AI 语音助手,该助手不仅可以进行语音和文字交流,还能…

【JavaScript】---- 使用 Tween 实现转盘抽奖

1. 实现效果 2. 需求分析 它和正常的转盘抽奖不一样,一般实现都是指针形式的,转盘转动,最后指针停留在奖品的随机位置;通过上边图发现奖品必须刚好停留在奖品的位置,因为不是指针,所以不能最后落到随机位置…

伦敦银晚盘预测方法:以经济数据为基础

晚盘是指北京时间晚上8点到凌晨的这个时段,覆盖了部分欧盘和大部分的美盘。一般来说,这个时段有欧美方面(主要是美国)的经济数据公布,其中一些重要的数据,如通胀数据、美联储公布利率决议等等,会…

企业为什么需要HTTPS

一.什么是HTTPS HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&a…

winserver系统设置图片查看器

新建 .bat 批处理执行文件,内容如下: echo off&cd&color 0a&cls echo Set Win10 Photo Viewer reg add "HKLM\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" /v ".jpg" /t REG_SZ /d Photo…

centos7.8 迁移为 TencentOS Server 2.4(TK4) 报错解决

文章目录 一 问题二 解决三 注意 一 问题 CentOS 官方计划停止维护 CentOS Linux 项目,公司某台腾讯云的centos7.8服务器计划迁移为 TencentOS Server 2.4(TK4) 。在下载rpm包执行迁移命令后报错,场景还原如下。 首先 安装 Python 3 yum install -y p…

Emby for Mac(轻松管理多媒体影音库)1.9.9中文版

Emby for Mac是一款强大的多媒体影音库管理工具,可以帮助用户轻松管理和浏览自己的影音资源。它可以将用户的个人视频、音乐和照片组合在一起,并将其流式传输到用户的设备上。 Emby for Mac 1.9.9中文版下载 Emby for Mac具有易于使用的界面,…

WMS系统业务学习

电商ERP 供应链整体流程 从采购到付款 需求—采购申请—报价请求—供应商报价—采购订单—接收—付款。 从销售到收款 销售定价—订单—发运—收款—开票。 WMS业务 收货管理 业务流程:采购订单—到货预约—货物交接—(质检)—上架。 …

【计算机毕业设计】ssm绿色农产品推广应用网站

21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的 重要性已逐渐被人们所认识,科学化的管理,使信息存储达到…

Spring AI开发前期开发指导(maven依赖下载问题解决)

文章目录 说明开发条件网络环境准备本地环境准备开发工具准备 特殊说明maven配置项目jar一致下载错误解决可行的版本搭配 说明 动力节点视频教程地址,本文章学习该教程,同时说明的maven配置问题导致的项目依赖下载失败的问题和其他问题的记录。 开发条…

SQL Server (MSSQLSERVER) 服务无法启动

解决方法: 打开服务,右键SQL Server (MSSQLSERVER) ->属性->登录,改为本地系统用户

vs2019 c++ 对左值引用取地址得到的是谁的地址?

(1) 测试一下: 对左值引用取地址,返回的地址是其引用的变量的地址,而非自身的地址。 (2) 用反汇编看一下,为了代码容易看懂,改一下源代码,不使用 cout 这个复…

北亚MF2200手机取证平台介绍

一、产品介绍。 北亚MF2200手机取证平台是由北亚企安科技(北京)有限公司(Frombyte)自主研发的一款针对智能手机(iPhone、Android)及 iPad 取证分析的法证平台。本平台采集速度快,可通过自动提取…

海外仓管理优化策略:花更少的钱,收获更大的收益

海外仓成本确实越来越高了。 仓储成本和人力成本几乎占据了海外仓经营成本的一大部分,这严重的影响了海外仓企业的盈利能力。如果你正打算开设海外仓业务或者已经在经营海外仓业务,那这个问题一定不能忽视,毕竟成本越高,就意味着你…

[算法面试]_01_L1和L2正则化,为什么L1正则化更容易导致稀疏?

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注收…

在idea中使用vue

一、安装node.js 1、在node.js官网(下载 | Node.js 中文网)上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装,一定要记住自己的安装路径 一直点击next即可,这部选第一个 3、安装成功后,按住winR输入…

Vue3+TS实现将html或富文本编辑器转为Word并下载

说明:我用的富文本编辑器是wangEditor: wangEditor官网 安装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save yarn add wangeditor/editor-for-vuenext # 或者 npm install wangeditor/editor-for-vuenext --save yarn add …

国内验签DV单域名SSL证书怎么购买?

JoySSL所签发的专业版单域名SSL证书可以做到国内验签,数据不出境,安全等级为业内最高。 JoySSL 专业版国际算法DV单域名证书-JoySSLJoySSL专业版国际算法DV单域名证书通过交叉授信方式,实现国产根与欧美根相互验证,完美兼容且自主…