避免创建重复的对象,这个问题应该每个人都明白,但是我们很多人在平时没有给予足够的重视。
举个老生常谈的例子:
{
String a="Hello World";
String b=a;
}
{
String a="Hello World";
String b="Hello World";
}
{
String a="Hello World";
String b=new String("Hello World");
}
{
String a=new String("Hello World");
String b=new String("Hello World");
}
上面这些该死的代码块能说明什么问题?如果对每一个块做a==b的比较会得到什么结果?
虽然现在计算机整体性能的提升以及JVM效能的提高,都使得创建和回收一个对象不再是捉襟见肘的事情了,但是一个好的系统还是希望在时间和空间上实现最优化。重复创建不必要的对象第一维护起来会很困难,第二,在重用的问题上也得好好的斟酌斟酌。
JAVA虽然不提供指针运算,但是和提供了没有什么区别,反而更加让人糊涂。就拿上面的块来看:我们平时定义
String a="Hello World";
通俗的说,是先在内存中开辟一块空间放入“Hello World”(这就是创建了对象),然后把该内存空间地址的一个引用赋给变量a,也就是把a指向开辟的内存空间。我们使用该定义,如第二个块,实际上只创建了一个对象,而把它的引用赋给了不同的变量,就像起别名一样,怎么叫都是同一个人。但是,我们在实际的应用中确实也就只需要一个“Hello World”,不是吗?
如果还需要,再new一个也无妨。new 意思就是新建一个内存空间,也就是新建一个对象。仅仅定义了变量而不new,是没有用的,就像孩子还没有出生,名字就已经想好了一样。举个例子:
public class A
{
public static void main(String[] args)
{
String a;
for(int i=0;i<=10;i++)
{
a="Hello World";
System.out.println(a);
}
System.out.println(a);
}
}
编译上面的程序,你会发现通不过,提示:未初始化变量a。这就很能说明一个问题,你创建了a这个String变量,但是没有让他指向任何的对象,而创建内存空间,也就创建对象并把引用赋给a这个过程是在for块中进行的,等到出了for块,垃圾回收就把创建的内存空间回收掉了,a自然又成了有名无实的东西了。
所以,创建对象的时候,你new了几次,就创建了多少个对象,一个对象就是一块内存空间,你为“Hello World”分配了一堆空间,却仅仅是同一个用途,就是浪费。
对于复杂的程序,如果有一些对象是必须创建的,但是却只使用同一个实例,那么就将它们提取出来,单独的放在一个块中,最好的建议是把这些对象定义成final,然后在程序中提供一个static块初始化它们。