java频繁new对象的优化方案
在实际开发中,某些情况下,我们可能需要频繁去创建一些对象(new),下面介绍一种,我从书上看到的,可以提高效率的方法。
首先,对于将会频繁创建的对象,我们要让这个类实现Cloneable接口,因为这个优化的核心,就是利用clone。
clone的最大特点就是,不会去调用任何构造方法,所以,在我看来重点应该放在构造方法中。
1.先写一个实体类:
在此实体类中写一个getInstance(),其中就是返回clone()。
import java.io.Serializable; /**
* @ClassName: 生产单ERP
* @author hanwl
* @Description: TODO
*/ public class ErpProduct implements Serializable,Cloneable{
private static final long serialVersionUID = 1L;
private static ErpProduct erpProduct = new ErpProduct(); private String topicNum;//选题号 选填
private String compName;//部件名 必填 (多个部件以 ','分隔 封面,正文)
private String printShop;//印厂名 必填
private String printUser; //分发人 必填
private String reback;//是否撤回 必填 0 默认分发 1撤回分发
private String printNum;//印数 (选填) public ErpProduct() {
super();
} /**
* 调用对象创建优化
*
* @return
*/
public static ErpProduct getInstance(){
try {
return (ErpProduct) erpProduct.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new ErpProduct();
} public String getTopicNum() {
return topicNum;
}
public void setTopicNum(String topicNum) {
this.topicNum = topicNum;
}
public String getCompName() {
return compName;
}
public void setCompName(String compName) {
this.compName = compName;
}
public String getPrintShop() {
return printShop;
}
public void setPrintShop(String printShop) {
this.printShop = printShop;
}
public String getPrintUser() {
return printUser;
}
public void setPrintUser(String printUser) {
this.printUser = printUser;
}
public String getPrintNum() {
return printNum;
}
public void setPrintNum(String printNum) {
this.printNum = printNum;
}
public String getReback() {
return reback;
}
public void setReback(String reback) {
this.reback = reback;
} }
2.在主方法中调用的时候直接getInstance()就可以。
public static void main(String[] args) {
long beginTime = System.currentTimeMillis(); for (int i = 0; i < 100; i++) {
ErpProduct.getInstance();
} long endTime = System.currentTimeMillis();
System.out.println("采用clone的方法,一共花费的时间:" + (endTime - beginTime)); beginTime = System.currentTimeMillis(); for (int i = 0; i < 100; i++) {
new ErpProduct();
} endTime = System.currentTimeMillis();
System.out.println("采用new的方法,一共花费的时间:" + (endTime - beginTime));
}
当一个类存在继承关系时,你创建一个子类的对象时,如果在没有明确指定的情况下,子类是会隐式的去调用父类的无参构造的。假设,我们需要频繁创建的对象,是一个继承关系比较深的类的话,调用构造函数的开销不容小窥。
如果一时间内,频繁创建某对象时,这些平时不显眼的消耗一叠加起来,就变得很客观了。但是,当我们使用clone的话,就可以避免这个问题。
java频繁new对象的优化方案的更多相关文章
- Java网络编程-对象编解码方案、优劣对照
书籍推荐: 实例代码 :http://download.csdn.net/detail/jiangtao_st/7677503 watermark/2/text/aHR0cDovL2Jsb2cuY ...
- 【性能优化】面试官:Java中的对象都是在堆上分配的吗?
写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...
- java、JavaScript获取微信用户信息登录优化方案
1.获取微信用户信息要调用微信的好几个接口,再加上自己系统的接口就会变的很慢,影响用户体验,之前走过的弯路我就不赘述了,直接说新的方案. 2.第一步都是向微信发起获取用户code请求: 请求接口:ht ...
- Adapter优化方案的探索
概要:使用Adapter的注意事项与优化方案本文的例子都可以在结尾处的示例代码连接中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request. ...
- 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结
本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言 MySQL作为开源技术的代表作之一,是 ...
- MySQL 大表优化方案(长文)
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
- [转帖] 数据库用优化方案 https://segmentfault.com/a/1190000006158186
Mysql大表优化方案 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部 ...
- 数据库SQL优化百万级数据库优化方案
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Android RecyclerView使用 及 滑动时加载图片优化方案
1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...
随机推荐
- log4net使用封装,无缝切换 dotnet 和 dotnetcore
log4net使用封装,无缝切换 dotnet 和 dotnetcore Intro 自己有几个自己的小项目,有许多公用的方法/扩展/工具类等等,于是封装了一些常用的工具类/扩展方法 WeihanLi ...
- MacBook Pro 安装win7 64 成功安装过程总结
安装对象: MacBook Pro (13 英寸, 2010 年中) 中安装win7 64位操作系统(原版安装非Ghost),且只保留win7系统即可. 场景还原: 拿到笔记本时,笔记本中已无Mac ...
- maven编译开源项目报enforce错解决
刚下载一个开源项目源码,用maven编译发现报错: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plu ...
- js常用写法
遍历数组 ES5 写法 arr.forEach(function(value,index){ console.log(index+'--'+value); }) 遍历数组 ES6 写法 for( l ...
- VS2019 实用设置
本文记录了 VS2019 预览版使用过程中的一些设置,这些设置也同样适用于 VS2017,我们可以根据个人的实际情况进行修改. 滚动条(Scroll Bar) 将滚动条设置为 map mode 后,则 ...
- [references] How to Do Research
目录: ** 0x01 做研究/写论文的Alpha/Beta ** 0x02 How to Do Research | 经典指南 ** 0x03 思考写作与研究的区别 | The difference ...
- consumer zookeeper is not a recognized option
kafka 创建消费者报错 consumer zookeeper is not a recognized option 在做kafka测试的时候,使用命令bin/kafka-console-consu ...
- [官网]Windows modules
Windows modules https://docs.ansible.com/ansible/latest/modules/list_of_windows_modules.html win_acl ...
- react native输入框定位在底部(虚拟键盘弹起)
1.通过Keyboard获取键盘高度,改变定位的bottom 缺点:虚拟键盘完全弹起时,才会获取到键盘高度,定位稍有延迟,而且键盘收起时,定位会出现悬空状态,然后再回到底部 import React, ...
- STL用法整理
百度百科 STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称.从根本上说,STL是一些“容器”的集合,这些“容器”有list,vect ...