第五 避免不必要的对象

原创 2016年06月01日 14:52:14

java 中流行一句话:万物皆对象

对象,能复用的最好不要重新创建,重用即快速又流行。如果对象不可变,它始终可以被复用。列举一个极端的反例,字符串

String s = new String("hello");

这里面有两个实例对象,一个是字符串“hello” 本身,一个是 s 。平白无故的多创建了一个对象,改进后版本为 String s = “hello”;即可

这个版本用了一个String 实例。并且对于同一台虚拟机中,相同的字符串字面常量,该对象就会被重用。

例如 

public static Boolean valueOf(boolean b) {

        return (b ? TRUE : FALSE);

    }

public static Boolean valueOf(String str) {

        return ("true".equals(str) ? TRUE : FALSE);

    }

中,Boolean.valueOf(String) 总是优先于构造器 Boolean(String) 


避免创建多余对象是规则,也是用于静态方法中,比如

计算时间经常会用到 Calendar 这个工具类,通常做法是在方法里面创建,每调用一次,创建一次

public static boolean isBorth(String day){

Calendar  cal = Calendar.getInstance();

int start = cal.getTime();

....

}

这样cal被不停的创建,可初步优化,把cal设置为成员变量,做非空判断

static Calendar  cal;

public static boolean isBorth(String day){

if(cal == null){

cal = Calendar.getInstance();

}

int start = cal.getTime();

....

}


这样做避免了cal被多次初始化,但存在两个小问题,一个是高并发,不能保证只创建了一个,就像是单例模式的懒汉式,另外一个就是每次调用都做了一次非空判断,初次时很有必要,创建对象,创建对象成功后,为了避免重新创建,需要判断,但我们能不能想办法去掉判断呢? 能 !用第一篇所说的static

可以用static代码块来改进

static Calendar  cal;

static{

cal = Calendar.getInstance();

}

public static boolean isBorth(String day){

int start = cal.getTime();

....

}

这样在大量调用该方法时,效率会有显著提高。


java jdk 1.5 以后有个自动装箱的概念,这样基本类型和装箱类型可以混用。但装箱类型都是对象,存在一个地址值。使用不恰当的话,很容易消耗不必要的内存

看个例子,

 public static void main(String[] args) {
Long num = 0L;
for(int x = 0; x<Integer.MAX_VALUE; x++){
num+=x;
}
System.out.println(num);
这段代码结果正确,但耗时。因为num的声明时Long而不是long,由于自动装箱的原因,这个方法多出了2的31次方个实例对象,
这个时joshua大神举的例子,在机器上运行时间为40多秒,改为long后,时间大概为6秒,由此可见一个小细节产生的问题。

创建对象代价并不昂贵,现在的jvm优化的很好,很容易回收无用的对象。但在优化代码,提高代码质量上,在有把握的前提下,尽量对象复用。

高效Java05:避免创建不必要的对象

就像我们大部分人所知道的,最好能重用对象,而不是每次都重复创建一个功能相同的新对象,下面举几个例子说明这个点。重用不可变对象如果对象是不可变的,那么它就始终可以被重用。对于同时提供了静态工厂方法和构造...
  • digvwell
  • digvwell
  • 2017年03月20日 23:03
  • 154

Effective Java学习笔记: 第59条 避免不必要地使用受检的异常

受检异常强迫程序员处理异常条件。 过分使用受检异常会是API使用起来非常不方便。 受检异常的使用场景: 如果正确地使用API并不能阻止这种异常条件的产生;并且一旦产生异常,使用API的程序员可以立即...
  • WLFIGHTER
  • WLFIGHTER
  • 2016年09月17日 17:29
  • 244

2015070407 - EffactiveJava笔记 - 第59条 避免不必要地使用受检异常

20150704 星期六 北京     使用异常可以增加可靠性,但是过分使用异常就会导致问题不断.    (异常的设计原则是在不正常的的情况下处理,如果可以把不正常的情况改变为正常思路下的部分,那...
  • zhtzyh2012
  • zhtzyh2012
  • 2015年07月04日 13:27
  • 222

避免创建不必要的对象。

博文中的内容来源《Effective Java Second Edition》这一本书,感激不尽。
  • en_joker
  • en_joker
  • 2017年08月17日 20:38
  • 83

循环体内包含了大量没有必要在循环中处理的语句或获取数据库连接或进行不必要的try-catch操作

错误案例 public class CheckCycle { public void cycleInfo() { String[] Str = null; ...
  • Rubenyu
  • Rubenyu
  • 2011年07月11日 08:48
  • 553

避免创建不必要的对象

1.不要这样做String str = new String("sss");,"sss"本身就是一个实例,改进后String str="sss"; 2.慎用自动拆装箱,应优先使用基本类型而不是基本装...
  • langyaonet
  • langyaonet
  • 2015年04月30日 22:55
  • 398

代码走查工具篇FxCop的规则总结与翻译_Part3

续接上篇:代码走查工具篇FxCop的规则总结与翻译_Part2 Performancerules(性能规则) 1、AvoidExcessiveLocals   CA1809      避...
  • lu_yongchao
  • lu_yongchao
  • 2013年04月05日 21:33
  • 2401

(5):避免创造不必要对象

一般来说,最好是能重用已有的对象,而不是每次有需要的时候就去创建一个相同功能的对象。比较下面两个例子 (1).String s1 = “string1”; (2).String s2 = new...
  • ahui2333
  • ahui2333
  • 2017年03月29日 16:44
  • 103

及时与同舟共济的股东分享重要信息,将会避免不必要的曝光。

一个男人在他妻子洗完澡后准备进浴室洗澡。这时,门铃响了。妻子迅速用浴巾裹住自己冲到门口。当她打开门时,邻居鲍勃站在那儿。在她开口前,鲍勃说,“你如果把浴巾拿掉,我给你800美元。”想了一会儿,这个女人...
  • wangzhe992611
  • wangzhe992611
  • 2014年03月28日 11:50
  • 290

Effective java1——避免创建不必要的对象

Java中String很特别,有如下两种初始化方式: (1)String s1 = "This is string1"; (2)String s2 = new String("This is st...
  • duanxin8678
  • duanxin8678
  • 2014年09月12日 14:37
  • 155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第五 避免不必要的对象
举报原因:
原因补充:

(最多只允许输入30个字)