JAVA教程之Java程序的功能优化StringBuffer与Vect...
其实你不用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也是延续着它的拖拽控件的方法,提高速度。 是一种突破用户端机器环境和CPU 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 Java是一种计算机编程语言,拥有跨平台、面向对java 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
页:
[1]