Java 避免创建不必要的对象
最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象。如果对象是不可变的,它就始终可以被重用。
String s = new String("stringette");
每次执行该语句时都会创建一个新的String实例,传递给String构造器的参数(“stringette”)本身是一个String实例,功能方面等同于构造器创建的所有对象。如果这种用法是在一个循环中,或者是在一个被频繁调用的方法中,会创建出成千上万不必要的String实例。
String s = "stringette";
只用了一个String实例,而不是每次执行的时候都创建一个新的实例。对于所有在同一台虚拟机中运行的代码,只要它们包含相同的字符串字面常量,该对象就会被重用。
对于同时提供了静态工厂方法(见第1条)和构造器的不可变类,使用静态工厂方法而不是构造器,避免创建不必要的对象。除了重用不可变的对象之外,也可以重用已知不会被修改的可变对象。
在Java 1.5发行版本中,有一种创建多余对象的新方法,称作自动装箱(autoboxing)。它允许程序员将基本类型和装箱基本类型混用,按需要自动装箱和拆箱。
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
每次sum增加时都会构造一个Long类实例,速度变慢。注意:要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
通过维护对象池(object pool)来避免创建对象不是好的做法,除非池中的对象是非常重量级的。正确使用对象池的典型对象示例是数据库连接池。建立数据库连接的代价是非常昂贵的,而且数据库的许可可能限制只能使用一定数量的连接。
参考资料
《Effective Java 中文版 第2版》 第5条:避免创建不必要的对象 P17-20
Java 避免创建不必要的对象的更多相关文章
- Java中创建(实例化)对象的五种方式
Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...
- Java避免创建不必要的对象
小Alan最近看到了<Effective Java>这本书,这本书包含的内容非常丰富,这本书我就不多介绍了,只能默默的说一句,作为一名java开发错过了这本书难免会成为一个小遗憾,所以还是 ...
- Effective Java —— 避免创建不必要的对象
本文参考 本篇文章参考自<Effective Java>第三版第六条"Avoid creating unnecessary objects" avoid creatin ...
- 《Effective Java》—— 创建与销毁对象
本篇主要总结的是<Effecticve Java>中关于创建和销毁对象的内容. 比如: 何时以及如何创建对象 何时以及如何避免创建对象 如何确保及时销毁 如何管理对象销毁前的清理动作 考虑 ...
- Effective Java之避免创建不必要的对象
Effective Java中有很多值得注意的技巧,今天我刚开始看这本书,看到这一章的时候,我发现自己以前并没有理解什么是不必要的对象,所以拿出来跟大家探讨一下,避免以后犯不必要的错误! 首先书中对不 ...
- Java进阶 创建和销毁对象
最近准备写点Javase的东西,希望可以帮助大家写出更好的代码. 1.给不可实例化的类提供私有构造器 比如:每个项目中都有很多工具类,提供了很多static类型的方法供大家使用,谁也不希望看到下面的代 ...
- java中String s = new String("abc")创建了几个对象?
答案是两个,现在我们具体的说一下: String s = new String("abc");一.我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变 ...
- 【Java基础】Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...
- Effective Java 第三版——6. 避免创建不必要的对象
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- vue生命周期探究(一)
前言 在使用vue开发的过程中,我们经常会接触到生命周期的问题.那么你知道,一个标准的工程项目中,会有多少个生命周期勾子吗?让我们来一起来盘点一下: 根组件实例:8个 (beforeCreate.cr ...
- html5 之 local storage \sessjion storage
转载: HTMl5的sessionStorage和localStorage html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessi ...
- move_uploaded_file中文乱码
move_uploaded_file($_FILES['file']['tmp_name'],iconv("UTF-8","gb2312",$filname)
- mysql inner jion多表查询
select vtiger_users.id, vtiger_users.user_name, vtiger_role.rolename FROM vtiger_users inner join vt ...
- RN错误随笔 - Unable to resolve module 'AccessibilityInfo'
错误信息:.React Native 运行报错:Unable to resolve module 'AccessibilityInfo' 可以看到在 异常的返回的JSON 结构中给出了推荐的解决方法 ...
- 用ArcMap打开MXD文件报One or more layers failed to draw错误!
错误信息: One or more layers failed to draw: FDO error: 0General function failure [PW_X]参数不足,期待是 1. 原因: ...
- 集群LVS
集群分为LB负载均衡集群,HA高可用集群,LB高应用集群. 前两种比较常见 LB是更加注重性能处理速度,而HA注重是服务器的在线时间. HA集群一般设有主重,当主服务器当掉时候,重服务器进行工作,此时 ...
- 用vs调式docker环境下web程序的一处坑
新建web项目,此时launchSettings.json文件为: "iisSettings": { "windowsAuthentication": fals ...
- 数仓1.4 |业务数仓搭建| 拉链表| Presto
电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...
- 大数据及Hadoop的概述
一.大数据存储和计算的各种框架即工具 1.存储:HDFS:分布式文件系统 Hbase:分布式数据库系统 Kafka:分布式消息缓存系统 2.计算:Mapreduce:离线计算框架 stor ...