Effective Java —— 避免创建不必要的对象
本文参考
本篇文章参考自《Effective Java》第三版第六条"Avoid creating unnecessary objects"
avoid creating unnecessary objects by using static factory methods in preference to constructors on immutable classes that provide both
若一个类同时提供了静态工厂方法和构造方法,尽量使用静态工厂方法,因为静态工厂方法"they are not required to create a new object each time they're invoked"
这在第一条"用静态工厂方法代替构造器"中已有提及,例如boolean的装箱类Boolean,它的valueOf()方法和构造器都能返回一个指定布尔值的实例,但是构造器会新创建一个对象,而valueOf()方法会返回类内已有的一个静态不可变实例
public static final Boolean FALSE = new Boolean(false);
注意,不要因此而时时避免创建对象,现代的JVM都能够很好地应对小对象的创建,并且创建额外的对象能够提高程序的清晰性和简化部分逻辑
On the contrary, the creation and reclamation of small objects whose constructors do little explicit work is cheap, especially on modern JVM implementations. Creating additional objects to enhance the clarity, simplicity, or power of a program is generally a good thing
some object creations are much more expensive than others.If you're going to need such an "expensive object" repeatedly, it may be advisable to cache it for reuse
这往往不太容易发现,在某些类的方法被调用时,可能会产生另外一个中间的类实例,例如String.match()方法被调用时,会生成一个中间的Pattern类实例,最好将Pattern类实例缓存(如作为静态不可变字段),直接用Pattern类实例匹配正则表达式
as is often the case with lazy initialization, it would complicate the implementation with no measurable performance improvement
懒加载模式的代码实现往往会因为多线程访问而变得复杂,可能不会带来明显的性能提升,可以使用饿汉模式,在类加载时便对静态字段进行构建
prefer primitives to boxed primitives, and watch out for unintentional autoboxing
尽量使用基类型进行运算,因为装箱类型可能会有中间对象的创建和销毁,例如Long类型的加法运算
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
程序在for循环内构造了多余的2^31个多余的Long实例
avoiding object creation by maintaining your own object pool is a bad idea unless the objects in the pool are extremely heavyweight
只有在对象的创建十分昂贵时,才进行池化,例如数据库连接池,现代的JVM的垃圾回收器性能很容易就会超过轻量级对象池的性能
Generally speaking, however, maintaining your own object pools clutters your code, increases memory footprint, and harms performance. Modern JVM implementations have highly optimized garbage collectors that easily outperform such object pools on lightweight objects
consider the case of adapters, also known as views
视图是一种特殊的情况,例如Map接口的keySet方法返回该Map对象的Set 视图
Returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa.
@Test
public void keySetTest() {
Map<String, String> map = new HashMap<>(3);
map.put("first key", "john");
map.put("second key", "Sara");
map.put("third key", "Mike");
Set<String> set = map.keySet();
for (String key : set) {
System.out.println(key);
}
System.out.println("after remove the second key");
map.remove("second key");
for (String key : set) {
System.out.println(key);
}
}

Effective Java —— 避免创建不必要的对象的更多相关文章
- Java中创建(实例化)对象的五种方式
Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...
- 和我一起学Effective Java之创建和销毁对象
前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...
- 《Effective Java》—— 创建与销毁对象
本篇主要总结的是<Effecticve Java>中关于创建和销毁对象的内容. 比如: 何时以及如何创建对象 何时以及如何避免创建对象 如何确保及时销毁 如何管理对象销毁前的清理动作 考虑 ...
- Effective Java - [2. 创建与销毁对象]
让对象的创建与销毁在掌控中. Item 1: 使用静态工厂方法而非使用构造函数 public static Boolean valueOf(boolean b) { return b ? Boolea ...
- Java避免创建不必要的对象
小Alan最近看到了<Effective Java>这本书,这本书包含的内容非常丰富,这本书我就不多介绍了,只能默默的说一句,作为一名java开发错过了这本书难免会成为一个小遗憾,所以还是 ...
- Java 避免创建不必要的对象
最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象.如果对象是不可变的,它就始终可以被重用. String s = new String("stringette"); ...
- 【读书笔记】《Effective Java》——创建和销毁对象
Item 1. 考虑用静态工厂方法替代构造器 获得一个类的实例时我们都会采取一个共有的构造器.Foo x = new Foo(): 同时我们应该掌握另一种方法就是静态工厂方法(static facto ...
- [Effective Java]第三章 对所有对象都通用的方法
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Effective Java 第三版——64. 通过对象的接口引用对象
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
随机推荐
- 【CPU】进程管理之五状态模型
本文为第三篇,进程管理之五状态模型,进程在操作系统里边是有多个状态的,本文就是了解进程在操作系统中的多个状态 1.进程的五个状态 创建状态 就绪状态 阻塞状态 执行状态 终止状态 2.进程处于这五种状 ...
- CentOS启动流程及Shell脚本编程练习
转至:http://www.178linux.com/88910 一.请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 第一步:POST加电自检 主要实现的功能是检测各个外围硬件 ...
- 3D打印第二弹:狗牌
给朋友做一个狗牌(误,给朋友的狗狗做一个狗牌 1. 设计 没有设计功底,看看别人是如何做的,搜到一个狗牌: 照着这个做一个,正面是上图这种的:狗狗名字+狗爪子:另一面是手机号加联系说明文字. 2. 建 ...
- 五、Java控制流程
Java流程控制* 用户交互Scanner.Scanner进阶使用 用户交互Scanner 之前我们学习的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获 ...
- 面试官:Java中对象都存放在堆中吗?你知道逃逸分析?
面试官:Java虚拟机的内存分为哪几个区域? 我(微笑着):程序计数器.虚拟机栈.本地方法栈.堆.方法区 面试官:对象一般存放在哪个区域? 我:堆. 面试官:对象都存放在堆中吗? 我:是的. 面试官: ...
- php 23种设计模型 - 中介者模式
中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行 ...
- 总结一下Java基础知识
重中之重-----------基础 底层结构决定上层建筑,所以,基础很重要. 自信心 在开始说基础之前先说明一下自信心的重要性,没有自信心学什么东西都学不好. 核心自信***** 核心自信从三个方面来 ...
- 打靶笔记-03-vulhub-Moriarty Corp
打靶笔记-03-vulhub-BoredHackerBlog 一.靶机信息 Name: BoredHackerBlog: Moriarty Corp(中-高级难度) Date release: 29 ...
- LGP6011题解
昨天考试考到了这道题,那就来补一下题解吧. 题意简单不再阐述. 首先删除之后还要向左移动,很容易想到 ODT 平衡树,这个过于一眼,不再阐述. 重点说第二种方法. 向左平移的这个操作,我们是否可以用别 ...
- 2022年官网下安装Elasticsearch最全版与官网查阅方法(8.1.0最新安装)
目录 一.环境整合(需要提前装好) 构建工具(参考工具部署方式) 二.官方下载Elasticsearch部署安装 1.百度搜索"Elasticsearch",或者访问官网https ...