Effective Java之避免创建不必要的对象
Effective Java中有很多值得注意的技巧,今天我刚开始看这本书,看到这一章的时候,我发现自己以前并没有理解什么是不必要的对象,所以拿出来跟大家探讨一下,避免以后犯不必要的错误! 首先书中对不可变的对象(immutable)做了简单解释:不可变对象都是可以重用的。因为String是不可变对象,所以这样创建String是没有必要的: ```javaString str = new String("abc"); ``` `'abc'`本身就是一个String实例了,再用实例去包裹他,就属于浪费资源了。这样创建的话,`'abc'`就可以实现重用了: ```javaString str = "abc"; ``` 如果本身不是不可变对象,JDK中很多类也提供了重用的功能。了解和使用它们,可以避免创建不必要对象。 例如`Long`、`Integer`等,都提供了`valueOf()`的静态方法。`Calendar`等也提供了`getInstance()`方法。
上面都不是重点,很多人都已经了解他们了。下面探讨一个很有意思的问题,看这段代码: ```javaLong sum = 0L;for (int i = 0; i < Integer.MAX_VALUE; i++) {sum += i;}System.out.println(sum); ``` JDK1.5支持自动装箱和拆箱,我们不用进行类型转换了。但作者说这里有一个疏忽,导致了计算时间的大大提升,我很是没看出来。其实这个问题还是大标题所讲的:创建了不必要的对象。 `sum`是一个`Long`类型的对象,在他本身相加的时候,他会再创建一个`Long`对象,因为这些对象的不同,决定他们不能重用,而就这样,我们创建了`Integer.MAX_VALUE`个`Long`对象。想想挺恐怖的,虽然创建一个对象的开销很小,但也不能这样玩儿。 解决之道就是把`Long sum`换成`long sum`,使用了基本类型,他们是在栈中,也没有创建对象一说,性能提升不止一倍。 在我的计算机上,`Long`计算花费30秒, `long`花费了3.1秒左右。 避免创建不必要的对象,注意自动装箱带来的影响,这一点在以后要提高警惕! 当然,不能因噎废食,章中最后的解说,个人感觉也非常精彩: 当然,我们不要认为创建对象的代价非常昂贵,因为小对象的构造器只做很少量的显式工作,他的创建和回收动作是非常廉价的。通过创建附加的对象,提升程序的清晰性、间接性和功能性,这通常是件好事。 反之,使用对象池来创建对象并不是一种好的做法,除非池中的对象是非常重量级的。
转载于:https://www.cnblogs.com/china-li/p/3410015.html
Effective Java之避免创建不必要的对象相关推荐
- Effective Java之避免创建不必要的对象(五)
1.对于不可变类(immutable),他始终可以被重用. 如:String类 String s = new String("string"); 这种方法创建了两个String对象 ...
- Effective java 总结1 - 创建和销毁对象
Effective java 总结 - 创建和销毁对象 第1条 用静态工厂方法代替构造器 优势 静态工厂方法有名称 不必每次调用的时候创建一个新的对象 可以返回原返回类型的任何子类型对象 返回对象的类 ...
- [Effective Java]第二章 创建和销毁对象
第一章 前言 略... 第二章 创建和销毁对象 1. 考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Bool ...
- 《Effective Java》 第二讲:对于所有对象都通用的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接<Effective Java> 第一讲:创建和销毁对象 八.覆盖 equals 时 ...
- Java中类的创建及类与对象的关系
//import java.util.Scanner;//创建一个类 class Person{//属性和方法的定义不是必须的//属性String name ; int age ;//方法public ...
- java 有五个学生_《Java程序设计》 创建5个学生对象,给一个学生数组赋值,每个学生属性有:学号,姓名,年龄。...
展开全部 附件是完整的eclipse/MyEclipse工程包,可32313133353236313431303231363533e59b9ee7ad9431333335326133以导入自行测试: ...
- Effective Java读书笔记三:创建和销毁对象
第1条:考虑用静态工厂方法代替构造器 对于类而言,为了让客服端获得它的一个实例最常用的的一个方法就是提供一个公有的构造器.还有一种方法,类可以提供一个公有的静态工厂方法(static factory ...
- Effective Java:创建和销毁对象
前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.本博客是针对<Effective Java>这本书第2章所写的一篇读书笔记 ...
- Effective Java(1)-创建和销毁对象
Effective Java(1)-创建和销毁对象 转载于:https://www.cnblogs.com/Johar/p/10556218.html
最新文章
- nlohmann/json使用笔记
- 为什么mac运行变慢,如何提升mac运行速度
- b区计算机考研招不满的大学,B区又一所院校招收大量调剂!一志愿不满!
- 【区间DP】释放囚犯
- 机器学习笔记(四)决策树
- V4L2 driver(一). 整体框架
- OAF_开发系列21_实现OAF事物控制TransactionUnitHelper(案例)
- DropDownList的常用属性和事件
- Android项目实战(十三):浅谈EventBus
- java有any类型吗_Java开发网 - 一个关于CORBA中any类型的问题
- URAL 1004 Sightseeing trip
- Redis 6.0 源码阅读笔记(0) -- Redis 哈希表和字典 铺垫
- Android利用canvas画画板
- 数据抽取工具——DMCTextFilter V4.2(纯文本抽出通用程序库)
- 3.Python data types
- 第6-5课:五子棋游戏的相关算法
- 大学物理-热学-教学总结
- BEC listen and translation exercise 39
- 【PNP与NPN两种三极管使用方法(工作在开关状态)】
- linux中mtd动态加载,Linux 2.6.11 下 MTD驱动情景实例分析
热门文章
- 删库不跑路,MySQL 数据库恢复教程
- 项目实战丨某高校校园网络升级改造方案
- 阿里云 Serverless 再升级,从体验上拉开差距
- 引领开源新风潮,阿里巴巴编程之夏第二期重磅来袭!
- elementui树形复选框_Element-ui表格树形控件结合复选框实践
- 润飞rf1800支持解密吗_《密逃2》新一期来袭:还是你期待的样子吗?
- 拼接名字_一个最简单的办法,教你识别原切肉和拼接肉
- 计算机二级考试vb知识点,2016计算机二级《VB》考试重要知识点
- python 条形图_Python数据可视化:基于matplotlib绘制「堆积条形图」
- java 怎么向串口发送指令_idea ssm项目java程序使用十六进制rxtx包向串口发送指令的方法...