java中不可变对象使用避坑

总结:

        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为基本数据类型提供了包装类,但有的情况用包装类真不合适,创建时间长,回收时间长,存取时间长。

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

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值