1.对于不可变类(immutable),他始终可以被重用。

如:String类
String s = new String(“string”);
这种方法创建了两个String对象,因为传入String构造器的参数本身就是一个String实例,new再创建一个对象,由s指向它,事实上这样做浪费了两倍内存。
所以应该这样:
String s = “string”;

又如:Integer类等包装类
Integer比较特殊,也是面试中坑点之一:
先来看一个简单的例子:

 Integer i1 = new Integer(127)Integer i2 = new Integer(127)  Integer i3 = 127System.out.println(i1 == i2); System.out.println(i1 == i3); 

这两个判断跟String原理一样,都是false;
再来

 int i1 = 128;Integer i2 = 128;Integer i3 = new Integer(128);System.out.println(i1 == i2); System.out.println(i1 == i3); 

答案都是true,很简单,基本类型和装箱类型比较,装箱类型会自动拆箱,两个int比较当然是true。

最后一波坑

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);

答案第一个true,第二个false,原因是Integer常量池只存了-128-127的数,所以Integer i3 = 128,相当于创建了一个新的Integer对象!

2.除了重用不可变对象,还可以重用那些不可修改的可变对象。

比如jdbc的driver,connection中,如果你在每个sql操作中,都创建新的对象,那么代价回非常非常大。

常用的解决方法是把这些不可修改的可变对象放在静态代码块中或者构造方法中。其实就是饿汉式加载和懒汉式加载的问题。jdbc采用的是维护一个

3.避免创建不必要的对象不等于避免创建对象

对于现代jvm来说,对于小对象的回收和创建的动作是非常廉价的,创建小的对象来提升程序清晰性,简洁性,通常是好事。

有的人为了避免创建对象,维护自己的对象池,需要时只需要从对象池中取出,这样避免了创建很多对象。但是这种方法通常不可行,通常会把代码弄的难以理解,难以维护,有时候还不如jvm直接创建回收来的快。

但是jdbc的连接线程池不同,每个数据库连接都是非常珍贵的,重用这些对象价值很大。

Effective Java之避免创建不必要的对象(五)相关推荐

  1. Effective Java之避免创建不必要的对象

    Effective Java中有很多值得注意的技巧,今天我刚开始看这本书,看到这一章的时候,我发现自己以前并没有理解什么是不必要的对象,所以拿出来跟大家探讨一下,避免以后犯不必要的错误! 首先书中对不 ...

  2. Effective java 总结1 - 创建和销毁对象

    Effective java 总结 - 创建和销毁对象 第1条 用静态工厂方法代替构造器 优势 静态工厂方法有名称 不必每次调用的时候创建一个新的对象 可以返回原返回类型的任何子类型对象 返回对象的类 ...

  3. [Effective Java]第二章 创建和销毁对象

    第一章      前言 略... 第二章      创建和销毁对象 1.            考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Bool ...

  4. 《Effective Java》 第二讲:对于所有对象都通用的方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接<Effective Java> 第一讲:创建和销毁对象 八.覆盖 equals 时 ...

  5. Java中类的创建及类与对象的关系

    //import java.util.Scanner;//创建一个类 class Person{//属性和方法的定义不是必须的//属性String name ; int age ;//方法public ...

  6. Effective Java之注解优于命名模式(三十五)

    Java 1.5之前,一般使用命名模式表明有些程序元素需要通过某种工具或者框架进行特殊处理.例如,JUnit测试框架原本要求用户一定要用test作为测试方法名称的开头. 命名模式的缺点: 文字拼写错误 ...

  7. java 有五个学生_《Java程序设计》 创建5个学生对象,给一个学生数组赋值,每个学生属性有:学号,姓名,年龄。...

    展开全部 附件是完整的eclipse/MyEclipse工程包,可32313133353236313431303231363533e59b9ee7ad9431333335326133以导入自行测试: ...

  8. Effective Java读书笔记三:创建和销毁对象

    第1条:考虑用静态工厂方法代替构造器 对于类而言,为了让客服端获得它的一个实例最常用的的一个方法就是提供一个公有的构造器.还有一种方法,类可以提供一个公有的静态工厂方法(static factory ...

  9. Effective Java:创建和销毁对象

    前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.本博客是针对<Effective Java>这本书第2章所写的一篇读书笔记 ...

最新文章

  1. android6 运行,Xbox串流开放测试,只需安卓6即可运行
  2. 一篇文章带你解析,乐观锁与悲观锁的优缺点
  3. Android深度探索(卷1)HAL与驱动开发第六章总结
  4. uap--studio设置文本字体
  5. 大学计算机在线答题,大学计算机基础网上考试答题卷理论部分(含答案)
  6. 从 linux内核来看进程与线程的异同
  7. 【Linux】在Linux环境下使用VSCode调试C/C++程序
  8. python朴素贝叶斯分布对数据的要求_统计学习方法与Python实现(三)——朴素贝叶斯法...
  9. Java 学习笔记之 线程安全
  10. Postgresql:本地化支持
  11. linux python3命令_linux安装python3
  12. Quartus II软件的使用
  13. 联想服务器r525维修,扩展性强易管理 联想R525 G2服务器拆解
  14. flash activex java_adobe flash player activex
  15. idea使用@Slf4j
  16. windows加载wim文件
  17. 学生信息管理系统之 查询学籍信息流程
  18. win10如何开启电源高性能模式
  19. win7防火墙例外设置方法_win7防火墙添加端口方法
  20. 怎么做app开发?如何去开发适合自己企业的APP应用

热门文章

  1. C++中ASCII、unicode与Utf8之间的相互转化
  2. IOCP 浅析与实例
  3. DLL入门浅析(5)——使用DLL在进程间共享数据
  4. Python中的MySQL数据库编程
  5. 性能优化实战|使用eBPF代替iptables优化服务网格数据面性能
  6. 收藏:DPDK内存基本概念
  7. 动态规划之KMP字符匹配算法
  8. 音视频技术开发周刊 | 205
  9. WebRTC:应用中最大难点在于根据业务需求的适当折中
  10. GC之G1垃圾收集器