.对象的生成和大小的调整
JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数从而常常会生成大量的对象(或实例)由于系统不仅要花时间生成对象以后可能还需花时间对这些对象进行垃圾回收和处理因此生成过多的对象将会给程序的性能带来很大的影响
例关于String StringBuffer+和append
JAVA语言提供了对于String类型变量的操作但如果使用不当会给程序的性能带来影响如下面的语句
String name=new String(HuangWeiFeng);
Systemoutprintln(name+is my name);
看似已经很精简了其实并非如此为了生成二进制的代码要进行如下的步骤和操作
() 生成新的字符串 new String(STR_);
() 复制该字符串
() 加载字符串常量HuangWeiFeng(STR_);
() 调用字符串的构架器(Constructor);
() 保存该字符串到数组中(从位置开始)
() 从javaioPrintStream类中得到静态的out变量
() 生成新的字符串缓沖变量new StringBuffer(STR_BUF_);
() 复制该字符串缓沖变量
() 调用字符串缓沖的构架器(Constructor);
() 保存该字符串缓沖到数组中(从位置开始)
() 以STR_为参数调用字符串缓沖(StringBuffer)类中的append方法
() 加载字符串常量is my name(STR_);
() 以STR_为参数调用字符串缓沖(StringBuffer)类中的append方法
() 对于STR_BUF_执行toString命令
() 调用out变量中的println方法输出结果
由此可以看出这两行简单的代码就生成了STR_STR_STR_STR_和STR_BUF_五个对象变量这些生成的类的实例一般都存放在堆中堆要对所有类的超类类的实例进行初始化同时还要调用类极其每个超类的构架器而这些操作都是非常消耗系统资源的因此对对象的生成进行限制是完全有必要的
经修改上面的代码可以用如下的代码来替换
StringBuffer name=new StringBuffer(HuangWeiFeng);
Systemoutprintln(nameappend(is my name)toString());
系统将进行如下的操作
() 生成新的字符串缓沖变量new StringBuffer(STR_BUF_);
() 复制该字符串缓沖变量
() 加载字符串常量HuangWeiFeng(STR_);
() 调用字符串缓沖的构架器(Constructor);
() 保存该字符串缓沖到数组中(从位置开始)
() 从javaioPrintStream类中得到静态的out变量
() 加载STR_BUF_;
() 加载字符串常量is my name(STR_);
() 以STR_为参数调用字符串缓沖(StringBuffer)实例中的append方法
() 对于STR_BUF_执行toString命令(STR_)
()调用out变量中的println方法输出结果
由此可以看出经过改进后的代码只生成了四个对象变量STR_STR_STR_和STR_BUF_你可能觉得少生成一个对象不会对程序的性能有很大的提高但下面的代码段的执行速度将是代码段的倍因为代码段生成了八个对象而代码段只生成了四个对象
代码段
String name= new StringBuffer(HuangWeiFeng);
name+=is my;
name+=name;
代码段
StringBuffer name=new StringBuffer(HuangWeiFeng);
nameappend(is my);
nameappend(name)toString();
因此充分的利用JAVA提供的库函数来优化程序对提高JAVA程序的性能时非常重要的其注意点主要有如下几方面
() 尽可能的使用静态变量(Static Class Variables)
如果类中的变量不会随他的实例而变化就可以定义为静态变量从而使他所有的实例都共享这个变量
例
public class foo
{
SomeObject so=new SomeObject();
}
就可以定义为
public class foo
{
static SomeObject so=new SomeObject();
}
() 不要对已生成的对象作过多的改变
对于一些类(如String类)来讲宁愿在重新生成一个新的对象实例而不应该修改已经生成的对象实例
例
String name=Huang;
name=Wei;
name=Feng;
上述代码生成了三个String类型的对象实例而前两个马上就需要系统进行垃圾回收处理如果要对字符串进行连接的操作性能将得更差因为系统将不得为此生成更多得临时变量如上例所示
() 生成对象时要分配给它合理的空间和大小
JAVA中的很多类都有它的默认的空间分配大小对于StringBuffer类来讲默认的分配空间大小是个字符如果在程序中使用StringBuffer的空间大小不是个字符那么就必须进行正确的初始化
() 避免生成不太使用或生命周期短的对象或变量
对于这种情况因该定义一个对象缓沖池以为管理一个对象缓沖池的开销要比频繁的生成和回收对象的开销小的多
() 只在对象作用范围内进行初始化
JAVA允许在代码的任何地方定义和初始化对象这样就可以只在对象作用的范围内进行初始化从而节约系统的开销
例
SomeObject so=new SomeObject();
If(x==) then
{
Foo=sogetXX();
}
可以修改为
if(x==) then
{
SomeObject so=new SomeObject();
Foo=sogetXX();
}