不要创建非必要对象

STM32F407与W5100S的SPI通信实战:从硬件连接到TCP服务器搭建 本文详细介绍了STM32F407微控制器通过SPI接口驱动W5100S以太网模块,并搭建TCP服务器的完整实战过程。内容涵盖硬件连接、SPI驱动配置、网络参数设置及Socket编程,重点解析了SPI通信时序、W5100S寄存器操作和TCP连接管理,为嵌入式网络通信开发提供实用指南。 阅读详情

原文地址:http://leihuang.org/2014/11/10/avoid-creating-unnecessary-objects/


首先我们来看下面两个语句的区别:

String s = new String("hello world!") ;
String s = "hello world!" ;


当你循环调用上面两个语句的时候,你会发现:第一条语句总是new了一个新的值相等的对象,而第二条则一直是同一个值为"hello world!"的对象。由此第二条语句的效率要更高。

其实我们前面讲过的静态工厂方法其实也是遵循这个原理。

看下面这段代码,是判断一个人是否是1946至1964年之间所生。

class Preson {
    private final Date birthDate;

    // Other fields, methods, and constructor omittedITEM 5: AVOID CREATING
    // UNNECESSARY OBJECTS
    // DON'T DO THIS!
    public boolean isBabyBoomer() {
        // Unnecessary allocation of expensive object
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomStart = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomEnd = gmtCal.getTime();
        return birthDate.compareTo(boomStart) >= 0
                && birthDate.compareTo(boomEnd) < 0;
    }
}


从上面的代码中我们可以看出,在isBabyBoomer函数中其实有很大一部分是不需要每次都调用的,因为1946和1965的起始时间时固定不变的,但是每次调用这个函数的时候,都要执行这些代码,所以我们就可以对其进行改进,如下。

class Preson {
    private final Date birthDate;

    static{
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomStart = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomEnd = gmtCal.getTime();
    }
    public boolean isBabyBoomer() {
        return birthDate.compareTo(boomStart) >= 0
                && birthDate.compareTo(boomEnd) < 0;
    }
}


这样静态区域里面的代码就不属于Person类的对象了,而属于Person自己了,就是说每一个Person都拥有了同一份数据。


再看下面一段代码

Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
    sum += i;
}


上面这段代码其实时效率非常低的,因为它变量sum申明的是Long对象,而不是long。这样每一次执行加法操作的时候,都要创建一个新的Long对象(Long是final class)。

prefer primitives to boxed primitives, and watch out for unintentional autoboxing.


2014-11-10 15:45:38

Brave,Happy,Thanksgiving !


电源管理芯片PMIC (Power Management Integrated Circuits,简称:将电源电压转换为电子设备各部分所需的适当电压水平,包括升压(Boost)、降压(Buck)和升降压(Buck-Boost)转换。:控制和限制流向电子设备各部分的电流,以保护组件免受过电流损害。:管理多个电源轨,为不同的部分提供稳定的电能控制。电源轨指电路板上传输电力的线路。电源监控:提供过电压、欠电压、过电流、过热和短路保护,以防止电子设备损坏。:通过高效的电源转换技术,减少能量损耗,提高能源利用效率。 阅读详情

相关推荐

ROS2+MoveIt2+Gazebo仿真实战:从零搭建六轴机械臂控制闭环

本文详细介绍了如何从零搭建一个完整的ROS2+MoveIt2+Gazebo六轴机械臂仿真控制闭环。通过手写URDF模型、配置MoveIt2运动规划、集成Gazebo物理仿真与ROS2 Control控制器,最终实现RViz中规划轨迹、Gazebo中同步执行的完整数字孪生验证平台,为机器人算法开发和硬件验证提供低成本、高效的仿真解决方案。

weixin_29093017的博客 486

不要创建String对象

在js中不要创建String对象。它会拖慢执行速度,并可能产生其他副作用。

android_jackzhou的博客 831

从Gotham到Foundry:一文读懂Palantir三大产品线(Gotham/Foundry/Apollo)的核心差异与适用场景

本文深度解析Palantir三大产品线Gotham、Foundry和Apollo的核心差异与适用场景。Gotham专为国防与情报设计,提供军事级安全分析;Foundry是企业数字化转型的通用平台,支持低代码开发;Apollo则是云原生基石,确保系统可靠运行。通过对比产品架构与典型应用,帮助技术决策者根据需求做出明智选择。

weixin_42524499的博客 843

关于创建String对象的抉择

关于创建String对象的抉择标签(空格分隔): 与String有关的那些事

XQF 421

(一)企业微信 - 会话内容存档

企业微信获取会话记录。

专打丶小豆豆的博客 2894

ansys workbench 静力结构分析 高阶教程

ansys workbench 静力结构分析 高阶教程 目录ansys workbench 静力结构分析 高阶教程新建工程模型导入设置材料模型简化: 主要内容: 材料设置、模型简化、网格细化、约束分析、接触设置、求解设置、报错处理、结果分析 基础教程: ansys workbench 静力结构分析 基础操作流程(入门) ansys版本: 19.0(16.0及以上均可) 参考资料: 推荐教学视频《有限元分析 张晔》(超详细 ???? )、ansys workbench 超级学习手册(查阅用) 说明:一些基

weixin_43434624的博客 5万+

避免创建不必要的对象

要点一一般来说,最好能重用对象而不是在每次需要的时候创建一个相同功能的新对象。反面例子String a=new String("hello world");该语句每次被执行的时候都会创建一个String实例,是完全没有必要的,如果此行代码在循环中则会创建成千上万的实例。改进后String a="hello world";这行代码执行后只用了一个String的实例,而不是每次执行都会创建一个新的实例...

搬砖工 441

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解)

本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用和可靠性等方面的显著优势。文章还提供了实战配置流程和优化技巧,帮助工程师快速构建高效的硬件保护系统。

weixin_28683689的博客 351

不要使用String作为非最终显示信息的承载对象

比如是一个加密的编码,其组合范围获取已经超出所有字符的承载范围,而使用String进行承装就会造成不可逆的损失。再进行解密或者其他操作是就会造成错误。 具体的机制还有待我学习。

WALLEZhe的博客 582

Webug4.0 打靶笔记

一、Webug 的安装 (1)基本信息 WeBug 名称定义为”我们的漏洞”靶场环境 ,基础环境是基于 PHP/mysql 制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境。部分漏洞是基于Windows操作系统的漏洞所以将WeBug的web环境都装在了一个纯净版的Windows 2003的虚拟机中。在 webug3.0 发布后的四百多天 226安全团队终于在大年初二发布了 webug 的 4.0 版本。 (2)虚拟机的安装 最新超详细VMware虚拟机下载与安装_隐

m0_60716947的博客 6128

ISO26262 功能安全各个阶段测试要求

1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...

AgingMoon的博客 1万+

避免创建非必要的对象

.NET的垃圾收集器(GC)让我们从繁杂的内存管理工作中解脱出来。它可以很好的管理内存,也会以一种非常高效的方式来移除内存对象中的垃圾对象。但是,尽管高效,如果我们的代码写的不够良好,不仅分配对象需要花费时间,GC帮我们销毁垃圾对象也是需要花费时间的。因此,我们应该通过一些方法来避免这些花费。 1)将被频繁调用的引用类型的局部变量提升为成员变量 举个例子,窗体的Paint处理函数中创建GDI对象 ...

weixin_30849403的博客 222

TeXstudio完整安装配置教程(2025最新版)

至此,你已经完成了TeXstudio的完整安装和配置!现在你可以:✅ 使用TeXstudio编写LaTeX文档✅ 正确编译中英文混排的文档✅ 掌握基本的编辑和配置技巧LaTeX的学习曲线较陡,但一旦掌握,你会发现它在学术写作中的强大之处。建议从简单的文档开始练习,逐步掌握更高级的功能。祝你LaTeX写作顺利!如果有任何问题,欢迎在评论区留言交流。关键词:TeXstudio安装、LaTeX环境配置、中文LaTeX、TeX Live、学术论文写作更新日期:2025年10月。

weixin_51241407的博客 4503

Java对象创建过程

java对象创建过程、对象的组成、对象头、实例数据、对齐填充、对象创建方式、new关键字、Class类的newInstance方法、Constructor类的newInstance方法、Object类的clone方法、反序列化、无父类的对象创建、有父类的对象创建......

骑个小蜗牛的博客 3万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

浅论创建子类对象时是否创建了父类对象

浅论创建子类对象时是否创建了父类对象 这仅仅是我个人的理解,因为是初学者,所有可能存在理解错误或者不到位的情况。如果存在错误请指出,谢谢。 我们都知道在创建子类对象时,调用子类构造方法前,必须调用父类的构造方法。 那么调用构造方法就代表着创建对象了吗? 假设1: 如果创建子类对象没有创建父类对象,那么我们子类继承过来的属性和通过super调用的方法来自哪里? // 父类A ...

caoruntao_的博客 6941

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

js创建对象数组_JS 对象

对象定义无序的数据集合键值对集合创建对象的方式new 操作符 + Object 创建对象var person = new Object(); person.name = "lisi"; person.age = 21; person.family = ["lida","lier","wangwu"]; person.say = function(){ ...

weixin_34644072的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

effecitve java 5 当你应该重用现有对象的时候,不要创建新对象

通过例子来看重用对象的好处 String类型 当写了这样子的代码 String test = new String("123"); 的时候,实际上创建的不是一个对象,而是两个,可以由String的源码来印证,这个构造方法传入的就是一个String对象,然后把这个String的值复制了一遍,返回这个复制后的String public String(String original) ...

weixin_39452731的博客 218

JVM中对象的创建

类加载:类字节码从磁盘加载到内存。内存分配:在堆内存中为对象分配空间。字段初始化:给对象的成员变量赋默认值或显式值。构造方法调用:父类构造器先执行,之后执行当前类构造器。返回对象引用:返回指向对象的引用。JVM 对象的创建过程是理解 Java 内存管理、性能优化和垃圾回收的基础。通过深入理解这些细节,可以更好地编写高效的 Java 程序,并有效管理对象的生命周期。

m0_69529796的博客 1649

java for循环创建对象_for循环创建对象

有时候奇怪的发现往list添加数据的时候,一直被最后一个元素覆盖,首先 ,我们得明白原理:在new 一个对象的时候,对象的ID是唯一确定的;将对象add入list中时,放入list中的其实是对象的引用 ;而每次循环只是简单 的set 对象的属性,set新的属性值,而add进list中的对象还是同一个对象id,也就是同一个对象;所以每次add之后,list发现对象引用和之前元素一样,就覆盖掉了之前a...

weixin_39846191的博客 7248

使用对象字面量创建对象

今天在学习《js高程》时看到了使用对象字面量创建对象的表示法,了解到对象字面变量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程,举一个简单的例子var person = {name : "tom",age : 21}; 这里,左边的花括号表示对象字面变量的开始,因为它出现在了表达式上下文中。然后我们定义了name属性,之后是一个冒号,再后面是这个属性的值。在对象字面量中,

周清城的博客 1万+

对象创建:经典,通过反射创建对象的几种方式

闲话不多说,直接代码示例,给大家展示一下,创建对象的几种方式: package com.jason.study.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* *创建对象...

撸起袖子加油干 3029

关于java中创建子类对象时,父类对象到底创建不创建

关于java中创建子类对象时,父类对象到底创建不创建 一个对象可以理解为一个房子,而一个类只是规定了什么地方要放什么东西,比如客厅要放沙发,餐厅要有餐桌 创建一个新对象,就是建造一栋新房子,如果你不去初始化对象,那么这个房子就是空的,没有任何装饰家具,你也不能用它来做任何有意义的事(当然这只是个比喻,空房子不能说没有用) 当调用构造函数时,才会真正让这个对象有意义,那就是布置这个房子,布置这个房子...

weixin_43750747的博客 1564

python循环创建对象_for循环创建对象

有时候奇怪的发现往list添加数据的时候,一直被最后一个元素覆盖,首先 ,我们得明白原理:在new 一个对象的时候,对象的ID是唯一确定的;将对象add入list中时,放入list中的其实是对象的引用 ;而每次循环只是简单 的set 对象的属性,set新的属性值,而add进list中的对象还是同一个对象id,也就是同一个对象;所以每次add之后,list发现对象引用和之前元素一样,就覆盖掉了之前...

weixin_39956350的博客 1897

对象的创建过程

一个Java对象的创建过程就是类实例化的过程,往往会包括类初始化的过程,在第一次创建一个类的对象时,就需要对类进行初始化,以后再创建这个类的对象时,只需进行类的实例化,就不需要进行类的初始化了。

cxbtdd的博客 1219

循环内不要不断创建对象引用

很多时候我们业务场景都是需要对实体进行赋值操作,我们大部分的习惯都是在循环中进行创建对象然后进行对象属性的赋值,如果数据量很大的情况下会创建很多对象的引用,正确的做法是:在循环的外部进行对象的声明,循环的里边进行创建,这样内存中存储的只有一份对象的引用,每次创建的时候只是引用指向不同的对象罢了,大大节省内存。 User user=null; for (int i = 0; i < n; i++) { user=new User(); } ...

九七的博客 995

不要提前创建对象

不要提前创建对象为了节省系统内存资源,不提前申请并不急需的内存空间。我们应当尽量在需要的时候创建对象。重复地分配、构造对象可能会因垃圾回收(GC)做额外的工作,降低系统性能,例如下面的代码:… …void f() {     int i;     A a = new A();     // 类A 的对象a被创建     // 在判断语句之外没有     // 应用过

dongliheng的专栏 704
上一篇: 构造器与工厂方法的区别
下一篇: java内存泄露
SpeedMe
博客等级 码龄15年 779粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值