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

40岁开始学Java:避免创建不必要的对象

在这里插入图片描述

在Java中避免创建不必要的对象可以通过以下几种方法实现,从而提升性能和减少内存消耗:

1. 重用不可变对象

  • 字符串常量池:使用字面量而非new String,例如String s = "hello",复用常量池中的对象。
  • 静态工厂方法:如Integer.valueOf()会缓存-128到127的实例,优先于new Integer()
  • 预编译高开销对象:如正则表达式Pattern,避免在循环中重复编译:
    public class RegexExample {
        private static final Pattern PATTERN = Pattern.compile("regex");
        public static boolean validate(String input) {
            return PATTERN.matcher(input).matches();
        }
    }
    

2. 避免自动装箱

  • 使用基本类型(int而非Integer),尤其在循环中:
    long sum = 0L;  // 使用基本类型long,避免Long自动装箱
    for (long i = 0; i < 10000; i++) {
        sum += i;
    }
    

在这里插入图片描述

3. 缓存频繁使用的对象

  • 静态初始化:将高成本对象在类加载时初始化并缓存:
    public class Person {
        private static final Date BOOM_START;
        static {
            Calendar cal = Calendar.getInstance();
            cal.set(1946, Calendar.JANUARY, 1);
            BOOM_START = cal.getTime();
        }
        // 复用BOOM_START
    }
    

4. 对象池与享元模式

  • 对重量级对象(如数据库连接)使用池化技术(如Apache Commons Pool)。
  • 享元模式共享无状态对象,如适配器或常量对象。

5. 避免在循环内创建对象

  • 将对象创建移至循环外,并重置状态(注意线程安全):
    Calendar cal = Calendar.getInstance();
    for (int i = 0; i < 100000; i++) {
        cal.setTime(date);  // 复用Calendar实例
        // 处理逻辑
    }
    

6. 处理线程安全问题

  • 使用ThreadLocal保存线程专有对象,避免重复创建:
    public class DateUtil {
        private static final ThreadLocal<SimpleDateFormat> formatCache =
            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
        
        public static String format(Date date) {
            return formatCache.get().format(date);
        }
    }
    

7. 优化集合与工具类

  • 使用不可变视图(如Collections.unmodifiableList)避免拷贝。
  • 复用缓冲区数组,例如在I/O操作中重复使用字节数组。

在这里插入图片描述

总结

  • 关键点:识别可复用的对象,尤其是初始化成本高或频繁使用的不可变对象。
  • 权衡:避免过度优化轻量级对象,对象池适用于高成本资源。
  • 注意事项:确保线程安全,合理使用缓存和静态工厂方法。

通过这些策略,可以有效减少不必要的对象创建,优化程序性能。

相关文章:

  • 分治算法+题目
  • 基金 word-->pdf图片模糊的解决方法
  • MyBatis调用外部静态方法
  • 飞致云开源社区月度动态报告(2025年2月)
  • 基于HTML的贪吃蛇小游戏
  • 目前主流 AI 大模型体系全解析:架构、特点与应用
  • 代码规范和简化标准
  • macos下myslq图形化工具之Sequel Ace
  • 记Android12上一个原生bug引起的system_server crash
  • Scala的match表达式的基本简单介绍
  • ​Java 实体类中的常见问题:@Data 注解与 is 前缀字段的陷阱​
  • DrissionPage动态库过(某网)滑块(100%成功)
  • LeetCode279完全平方数(动态规划)
  • LeetCode 2 - 两数相加
  • 关于博客系统的测试报告
  • 机器人学习模拟框架 robosuite (3) 机器人控制代码示例
  • 【redis】redis持久化
  • Mysql的基础命令有哪些?
  • 学习Java:全面解析构造方法重载详解
  • 如何为Java面试准备项目经验
  • 重庆网站快速排名优化/专业培训机构
  • 银川市建设工程质量监督站网站/镇江网站建设制作公司
  • 自己做盗版小说网站吗/seo销售是做什么的
  • 网站开发兼容极速字体颜色推荐/关键词优化软件排行
  • 站长之家关键词查询/搜图片找原图
  • 中国新冠肺炎疫情最新消息/好口碑关键词优化