千家信息网

在Java中怎么避免创建不必要的对象

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章将为大家详细讲解有关在Java中怎么避免创建不必要的对象,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介在Java开发中,程序员要尽可能的避免创建相同的功
千家信息网最后更新 2026年11月04日在Java中怎么避免创建不必要的对象

这篇文章将为大家详细讲解有关在Java中怎么避免创建不必要的对象,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

简介

在Java开发中,程序员要尽可能的避免创建相同的功能的对象,因为这样既消耗内存,又影响程序运行速度。在这种情况下可以考虑重复利用对象。

接下来举例几种对象重复利用的场景,看看我们是不是有中招了,如果有赶紧趁着还没被发现悄悄改掉,被发现了会被diss啦!

1、String和Boolean

如下两种写法看似没有什么区别,但是如果深入jvm底层了解,我们可以利用jvm运行时常量池的特性,避免创建具有相同功能的String对象(尤其是在循环内部创建)可以带来比较可观的性能优化以及节约内存。

错误写法

// 每次都会创建一个新的String对象,且不会加入常量池String name2 = new String("李子捌");

正确写法

// 正确写法String name1 = "李子捌";

除此之外,刚写Java代码的程序员们,也要正确的选择String、StringBuilder、StringBuffer类的使用。String为不可变对象,通常用于定义不变字符串;StringBuilder、StringBuffer用于可变字符串操作场景,如字符串拼接;其中StringBuffer是线程安全的,它通过Synchronized关键字来实现线程同步。

// StringBuffer中的append()方法public synchronized StringBuffer append(String str) {    toStringCache = null;    super.append(str);    return this;}// StringBuilder中的append()方法public StringBuilder append(String str) {    super.append(str);    return this;}

Boolean是常用的类型,在开发中也应该使用Boolean.valueof()而不是new Boolean(),从Boolean的源码可以看出,Boolean类定义了两个final static的属性,而Boolean.valueof()直接返回的是定义的这两个属性,而new Boolean()却会创建新的对象。

public static final Boolean TRUE = new Boolean(true);public static final Boolean FALSE = new Boolean(false);

2、自动拆箱和装箱

Java提供了基本数据类型的自动拆箱和装箱功能,那是不是意味着我们可以在代码中随意的使用这两个类型呢?其实理论上在代码层面是没得问题,不过在具体的性能方面还是有优化的空间啦!!!

我们来测试下性能

long start = System.currentTimeMillis();Integer sum = 0;for (int i = 0; i < 100000; i++) {    sum += i;}System.out.println(System.currentTimeMillis() - start);

使用Integer耗时3毫秒

long start = System.currentTimeMillis();// 修改Integer 为 int int sum = 0;for (int i = 0; i < 100000; i++) {    sum += i;}System.out.println(System.currentTimeMillis() - start);

使用int耗时0毫秒

因此关于自动拆箱装箱的使用,我们其实也可以做适当的考虑,毕竟有时候代码性能就是一点点挤出来的嘛!!!

3、正则表达式

正则表达式我们经常用于字符串是否合法的校验,我们先来看一段简单的代码(大家有没有一眼看出问题呢?我想你肯定看出来了!!!):

public static void main(String[] args) {    String email = "1057301174@qq.com";    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";    long start = System.currentTimeMillis();    for (int i = 0; i < 10000; i++) {        email.matches(regex);    }    System.out.println(System.currentTimeMillis() - start);}

执行这段代码的时间,一共耗时71毫秒,看似好像挺快的!

但是我们做个非常简单的优化,优化后的代码如下所示:

public static void main(String[] args) {    String email = "1057301174@qq.com";    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";    Pattern pattern = Pattern.compile(regex);    long start = System.currentTimeMillis();    for (int i = 0; i < 10000; i++) {        //email.matches(regex);        pattern.matcher(email);    }    System.out.println(System.currentTimeMillis() - start);}

再次执行代码,一共耗时1毫秒,快了70倍呀!!!

这是因为String.matches()方法在循环中创建时,每次都需要执行Pattern.compile(regex),而创建Patter实例的成本很高,因为需要将正则表达式编译成一个有限状态机( finite state machine)。这种我们经常会因为Java api提供了比较方便的方法调用而忽略了性能考究,往往不容易被发现。

关于"在Java中怎么避免创建不必要的对象"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

对象 代码 性能 写法 字符 字符串 方法 两个 功能 正则 程序 篇文章 类型 表达式 装箱 相同 会创 内存 场景 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡 深圳市人人互联网科技有限公司 广州紫鲸互联网科技有限公司 金融科技还是互联网 互联网科技公司介绍 互联网金融科技委员会 滨湖区互联网智能科技产品供应 深圳国际航运科技和互联网 随着互联网科技发展 阿里互联网科技公司 互联网金融科技公司干啥的 互联网校园科技培训 厦门千工互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 互联网科技研发水平 内蒙古九一互联网科技 阿里互联网科技企业 明优互联网科技有限公司 唐山双旺合互联网科技产业园 利用互联网等科技手段 互联网科技会 紫鲸互联网科技 互联网科技公司的市场部门 博兴的互联网电子科技公司 中国互联网有什么科技含量 互联网为啥属于高科技 互联网金融科技公司的优势 江苏互联网智能科技产品出厂价 恒生互联网科技趋势 互联网企业和网络科技有限公司
0