|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。程序|功能|优化?
Java使得庞大使用的开辟变得绝对复杂。毫无疑问,它的这类易用性对Java的年夜局限盛行功不成没。但是,这类易用性实践上是一把双刃剑。一个计划优秀的Java程序,功能体现常常不如一个一样计划优秀的C++程序。在Java程序中,功能成绩的年夜部分缘故原由其实不在于Java言语,而是在于程序自己。养成好的代码编写习气十分主要,好比准确地、奇妙地使用java.lang.String类和java.util.Vector类,它可以明显地进步程序的功能。上面我们就来详细地剖析一下这方面的成绩。
在java中,利用最频仍、同时也是滥用最多的一个类也许就是java.lang.String,它也是招致代码功能低下最次要的缘故原由之一。请思索上面这个例子:
Strings1="TestingString";
Strings2="ConcatenationPerformance";
Strings3=s1+""+s2;
几近一切的Java程序员都晓得下面的代码效力不高。那末,我们应当怎样办呢?大概能够尝尝上面这类代码:
StringBuffers=newStringBuffer();
s.append("TestingString");
s.append("");
s.append("ConcatenationPerformance");
Strings3=s.toString();
这些代码会比第一个代码片断效力更高吗?谜底是不是定的。这里的代码实践上恰是编译器编译第一个代码片断以后的了局。既然与利用多个自力的String对象比拟,StringBuffer并没有使代码有任何效力上的进步,那为何有那末多的Java书本品评第一种办法、保举利用第二种办法?
第二个代码片断用到了StringBuffer类(编译器在第一个片断中也将利用StringBuffer类),我们来剖析一下StringBuffer类的默许机关函数,上面是它的代码:
publicStringBuffer(){this(16);}
默许机关函数预设了16个字符的缓存容量。如今我们再来看看StringBuffer类的append()办法:
publicsynchronizedStringBufferappend(Stringstr){
?if(str==null){?
???str=String.valueOf(str);
?}
?intlen=str.length();
?intnewcount=count+len;
?if(newcount>value.length)expandCapacity(newcount);
?str.getChars(0,len,value,count);
?count=newcount;returnthis;
}
append()办法起首盘算字符串追加完成后的总长度,假如这个总长度年夜于StringBuffer的存储才能,append()办法挪用公有的expandCapacity()办法。expandCapacity()办法在每次被挪用时使StringBuffer存储才能更加,并把现有的字符数组内容复制到新的存储空间。
在第二个代码片断中(和在第一个代码片断的编译了局中),因为字符串追加操纵的最初了局是“TestingStringConcatenationPerformance”,它有40个字符,StringBuffer的存储才能必需扩大两次,从而招致了两次价值高贵的复制操纵。因而,我们最少有一点能够做得比编译器更好,这就是分派一个初始存储容量年夜于大概即是40个字符的StringBuffer,以下所示:
StringBuffers=newStringBuffer(45);
s.append("TestingString");
s.append("");
s.append("ConcatenationPerformance");
Strings3=s.toString();
再思索上面这个例子:
Strings="";
intsum=0;
for(intI=1;I<10;I++){
?sum+=I;
?s=s+"+"+I;
?}
s=s+"="+sum;
剖析一下为什么后面的代码比上面的代码效力低:
StringBuffersb=newStringBuffer();
intsum=0;
?for(intI=1;
?I<10;I++){
?sum+=I;
?sb.append(I).append("+");
?}
Strings=sb.append("=").append(sum).toString();
缘故原由就在于每一个s=s+"+"+I操纵都要创立并撤除一个StringBuffer对象和一个String对象。这完整是一种华侈,而在第二个例子中我们制止了这类情形。
我们再来看看别的一个经常使用的Java类――java.util.Vector。复杂地说,一个Vector就是一个java.lang.Object实例的数组。Vector与数组类似,它的元素能够经由过程整数情势的索引会见。可是,Vector范例的对象在创立以后,对象的巨细可以依据元素的增添大概删除而扩大、减少。请思索上面这个向Vector到场元素的例子:
Objectobj=newObject();
?Vectorv=newVector(100000);
?for(intI=0;
?I<100000;I++){v.add(0,obj);}
除非有相对充分的来由请求每次都把新元素拔出到Vector的后面,不然下面的代码对功能倒霉。在默许机关函数中,Vector的初始存储才能是10个元素,假如新元素到场时存储才能不敷,则今后存储才能每次更加。Vector类就象StringBuffer类一样,每次扩大存储才能时,一切现有的元素都要复制到新的存储空间当中。上面的代码片断要比后面的例子快几个数目级:
Objectobj=newObject();
?Vectorv=newVector(100000);
?for(intI=0;I<100000;I++){v.add(obj);}
一样的划定规矩也合用于Vector类的remove()办法。因为Vector中各个元素之间不克不及含有“清闲”,删除除最初一个元素以外的恣意其他元素都招致被删除元素以后的元素向前挪动。也就是说,从Vector删除最初一个元素要比删除第一个元素“开支”低好几倍。
假定要夙昔面的Vector删除一切元素,我们可使用这类代码:
for(intI=0;I<100000;I++){v.remove(0);}
可是,与上面的代码比拟,后面的代码要慢几个数目级:
for(intI=0;I<100000;I++){v.remove(v.size()-1);}
从Vector范例的对象v删除一切元素的最好办法是:
v.removeAllElements();
假定Vector范例的对象v包括字符串“Hello”。思索上面的代码,它要从这个Vector中删除“Hello”字符串:
Strings="Hello";inti=v.indexOf(s);if(I!=-1)v.remove(s);
这些代码看起来没甚么毛病,但它一样对功能倒霉。在这段代码中,indexOf()办法对v举行按次搜刮寻觅字符串“Hello”,remove(s)办法也要举行一样的按次搜刮。改善以后的版本是:
Strings="Hello";inti=v.indexOf(s);if(I!=-1)v.remove(i);
这个版本中我们间接在remove()办法中给出待删除元素的准确索引地位,从而制止了第二次搜刮。一个更好的版本是:
Strings="Hello";v.remove(s);
最初,我们再来看一个有关Vector类的代码片断:
for(intI=0;I
假如v包括100,000个元素,这个代码片断将挪用v.size()办法100,000次。固然size办法是一个复杂的办法,但它仍然必要一次办法挪用的开支,最少JVM必要为它设置和扫除仓库情况。在这里,for轮回外部的代码不会以任何体例修正Vector范例对象v的巨细,因而下面的代码最好改写成上面这类情势:
intsize=v.size();for(intI=0;I
固然这是一个复杂的修改,但它仍然博得了功能。究竟,每个CPU周期都是可贵的。
低劣的代码编写体例招致代码功能下落。可是,正如本文例子所显现的,我们只需接纳一些复杂的措施就可以够明显地改良代码功能。
j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。 |
|