JAVA网站制作之(代码级)Java功能的优化
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。功能|优化Java在九十年月中期呈现今后,在博得惊叹的同时,也引来了一些品评。博得的惊叹次要是Java的跨平台的操纵性,即所谓的”WriteOnce,RunAnywhere”.但因为Java的功能和运转效力同C比拟,仍旧有很年夜的差异,从而引来了良多的品评。关于服务器真个使用程序,因为不年夜触及到界面计划和程序的频仍重启,Java的功能成绩看似不年夜分明,从而一些Java的手艺,如JSP,Servlet,EJB等在服务器端编程方面失掉了很年夜的使用,但实践上,Java的功能成绩在服务器端仍然存在。上面我将分四个方面来会商Java的功能和实行效力和进步Java功能的一些办法。
一.关于功能的基础常识
1.功能的界说
在我们会商如何进步Java的功能之前,我们必要分明“功能“的真正寄义。我们一样平常界说以下五个方面作为评判功能的尺度。
1)运算的功能----哪个算法的实行功能最好
2)内存的分派----程序必要分派几内存,运转时的效力和功能最高。
3)启动的工夫----程序启动必要几工夫。
4)程序的可伸缩性-----程序在用户负载太重的情形下的体现。
5)功能的熟悉------用户如何才干熟悉到程序的功能。
关于分歧的使用程序,对功能的请求也分歧。比方,年夜部分的使用程序在启动时必要较长的工夫,从而对启动工夫的请求有所下降;服务器真个使用程序一般都分派有较年夜的内存空间,以是对内存的请求也有所下降。可是,这并非所这两方面的功能能够被疏忽。其次,算法的功能关于那些把商务逻辑使用到事件性操纵的使用程序来说十分主要。总的来说,对使用程序的请求将决意对各本性能的优先级。
2.如何才干进步JAVA的功能
进步JAVA的功能,一样平常思索以下的四个次要方面:
(1)程序计划的办法和形式
一个优秀的计划能进步程序的功能,这一点不但合用于JAVA,也合用也任何的编程言语。由于它充实使用了各类资本,如内存,CPU,高速缓存,对象缓冲池及多线程,从而计划出高功能和可伸缩性强的体系。
固然,为了进步程序的功能而改动本来的计划是对照坚苦的,可是,程序功能的主要性经常要高于计划上带来的变更。因而,在编程入手下手之前就应当有一个好的计划模子和办法。
(2)JAVA布署的情况。
JAVA布署的情况就是指用来注释和实行JAVA字节码的手艺,一样平常有以下五种。即注释指令手艺(InterpreterTechnology),实时编译的手艺(JustInTimeCompilierTechnology),顺应性优化手艺(AdaptiveOptimizationTechnology),静态优化,提早编译为呆板码的手艺(DynamicOptimization,AheadOfTimeTechnology)和编译为呆板码的手艺(TranslatorTechnology).
这些手艺一样平常都经由过程优化线程模子,调剂堆和栈的巨细来优化JAVA的功能。在思索进步JAVA的功能时,起首要找到影响JAVA功能的瓶颈(BottleNecks),在确认了计划的公道性后,应当调剂JAVA布署的情况,经由过程改动一些参数来进步JAVA使用程序的功能。详细内容见第二节。
(3)JAVA使用程序的完成
当会商使用程序的功能成绩时,年夜多半的程序员城市思索程序的代码,这固然是对的,当更主要的是要找到影响程序功能的瓶颈代码。为了找到这些瓶颈代码,我们一样平常会利用一些帮助的工具,如Jprobe,Optimizit,Vtune和一些剖析的工具如TowerJPerformance等。这些帮助的工具能跟踪使用程序中实行每一个函数或办法所损耗失落的工夫,从而改良程序的功能。
(4)硬件和操纵体系
为了进步JAVA使用程序的功能,而接纳跟快的CPU和更多的内存,并以为这是进步程序功能的独一办法,但现实并不是云云。理论履历和现实证实,只要遭到了使用程序功能的瓶颈,从而接纳得当得办法,如计划形式,布署的情况,操纵体系的调剂,才是最无效的。
3.程序中一般的功能瓶颈。
一切的使用程序都存在功能瓶颈,为了进步使用程序的功能,就要尽量的削减程序的瓶颈。以下是在JAVA程序中常常存在的功能瓶颈。
懂得了这些瓶颈后,就能够有针对性的削减这些瓶颈,从而进步JAVA使用程序的功能
4.进步JAVA程序功能的步骤
为了进步JAVA程序的功能,必要遵守以下的六个步骤。
a)明白对功能的详细请求
在实行一个项目之前,必需要明白该项目关于程序功能的详细请求,如:这个使用程序要撑持5000个并发的用户,而且呼应工夫要在5秒钟以内。但同时也要分明关于功能的请求不该该同对程序的其他请求抵触。
b)懂得以后程序的功能
你应当懂得你的使用程序的功能同项目所请求功能之间的差异。一般的目标是单元工夫内的处置数和呼应工夫,偶然还会对照CPU和内存的使用率。
c)找到程序的功能瓶颈
为了发明程序中的功能瓶颈,一般会利用一些剖析工具,如:TowerJApplicationPerformanceAnalyzer或VTune来观察和剖析程序仓库中各个元素的损耗工夫,从而准确的找到并更正引发功能下降的瓶颈代码,从而进步程序的功能。这些工具还能发明诸如过量的非常处置,渣滓接纳等潜伏的成绩。
d)接纳得当的措施来进步功能
找到了引发程序功能下降的瓶颈代码后,我们就能够用后面先容过的进步功能的四个方面,即计划形式,JAVA代码的完成,布署JAVA的情况和操纵体系来进步使用程序的功能。详细内容将鄙人面的内容中作具体申明。
e)只举行某一方面的修正来进步功能
一次只改动大概引发功能下降的某一方面,然后察看程序的功能是不是有所进步,而不该该一次改动多个方面,由于如许你将不晓得究竟哪一个方面的改动进步了程序的功能,哪一个方面没有,即不克不及晓得程序瓶颈在哪。
f)前往到步骤c,持续作相似的事情,一向到达请求的功能为止。
二.JAVA布署的情况和编译手艺
开辟JAVA使用程序时,起首把JAVA的源程序编译为与平台有关的字节码。这些字节码就能够被各类基于JVM的手艺所实行。这些手艺次要分为两个年夜类。即基于注释的手艺和基于提早编译为当地码的手艺。其表示图以下:
详细可分为以下的五类:
a)注释指令手艺
其布局图和实行历程以下:
JAVA的编译器起首把JAVA源文件编译为字节码。这些字节码关于JAVA假造机(JVM)来说就是呆板的指令码。然后,JAVA的注释器不休的轮回掏出字节码举行注释并实行。
如许做的长处是能够完成JAVA言语的跨平台,同时天生的字节码也对照松散。JAVA的一些长处,如平安性,静态性都得坚持;但弱点是省天生的字节码没有经由甚么优化,同全体编译好的当地码比拟,速率对照慢。
b)实时编译手艺(JustInTime)
实时编译手艺是为懂得决指令注释手艺效力对照低,速率对照慢的情形下提出的,其布局图以下所示。
其次要变更是在JAVA程序实行之前,又JIT编译器把JAVA的字节码编译为呆板码。从而在程序运转时间接实行呆板码,而不必对字节码举行注释。同时对代码也举行了部分的优化。
如许做的长处是年夜年夜进步了JAVA程序的功能。同时,因为编译的了局其实不在程序运转间保留,因而也勤俭了存储空间了加载程序的工夫;弱点是因为JIT编译器对一切的代码都想优化,因而也华侈了良多的工夫。
IBM和SUN公司都供应了相干的JIT产物。
c)顺应性优化手艺(AdaptiveOptimizationTechnology)
同JIT手艺比拟,顺应性优化手艺其实不对一切的字节码举行优化。它会跟踪程序运转的成个历程,从而发明必要优化的代码,对代码举行静态的优化。对优化的代码,接纳80/20的战略。从实际上讲,程序运转的工夫越长,代码就越优化。其布局图以下:
其长处是顺应性优化手艺充实使用了程序实行时的信息,刊行程序的功能瓶颈,从而进步程序的功能;其弱点是在举行优化时大概会选择不妥,发而下降了程序的功能。
其次要产物又IBM,SUN的HotSpot.
d)静态优化,提早编译为呆板码的手艺(DynamicOptimization,AheadOfTime)
静态优化手艺充实使用了JAVA源码编译,字节码编译,静态编译和静态编译的手艺。其输出时JAVA的原码或字节码,而输入是经由高度优化的可实行代码和个来静态库的夹杂(Window中是DLL文件,UNIX中是共享库.a.so文件)。其布局以下:
其长处是能年夜年夜进步程序的功能;弱点是损坏了JAVA的可移植性,也对JAVA的平安带来了必定的隐患。
Java功能的优化(下)
--------------------------------------------------------------------------------
黄伟峰
三.优化JAVA程序计划和编码,进步JAVA程序功能的一些办法。
经由过程利用一些后面先容过的帮助性工具来找到程序中的瓶颈,然后就能够对瓶颈部分的代码举行优化。一样平常有两种计划:即优化代码或变动计划办法。我们一样平常会选择后者,由于不往挪用以下代码要比挪用一些优化的代码更能进步程序的功能。而一个计划优秀的程序可以精简代码,从而进步功能。
上面将供应一些在JAVA程序的计划和编码中,为了可以进步JAVA程序的功能,而常常接纳的一些办法和技能。
1.对象的天生和巨细的调剂。
JAVA程序计划中一个广泛的成绩就是没有好好的使用JAVA言语自己供应的函数,从而经常会天生大批的对象(或实例)。因为体系不但要花工夫天生对象,今后大概还需花工夫对这些对象举行渣滓接纳和处置。因而,天生过量的对象将会给程序的功能带来很年夜的影响。
例1:关于String,StringBuffer,+和append
JAVA言语供应了关于String范例变量的操纵。但假如利用不妥,会给程序的功能带来影响。以下面的语句:
Stringname=newString(“HuangWeiFeng”);
System.out.println(name+”ismyname”);
看似已很精简了,实在并不是云云。为了天生二进制的代码,要举行以下的步骤和操纵。
(1)天生新的字符串newString(STR_1);
(2)复制该字符串。
(3)加载字符串常量”HuangWeiFeng”(STR_2);
(4)挪用字符串的构架器(Constructor);
(5)保留该字符串到数组中(从地位0入手下手)
(6)从java.io.PrintStream类中失掉静态的out变量
(7)天生新的字符串缓冲变量newStringBuffer(STR_BUF_1);
(8)复制该字符串缓冲变量
(9)挪用字符串缓冲的构架器(Constructor);
(10)保留该字符串缓冲到数组中(从地位1入手下手)
(11)以STR_1为参数,挪用字符串缓冲(StringBuffer)类中的append办法。
(12)加载字符串常量”ismyname”(STR_3);
(13)以STR_3为参数,挪用字符串缓冲(StringBuffer)类中的append办法。
(14)关于STR_BUF_1实行toString命令。
(15)挪用out变量中的println办法,输入了局。
由此能够看出,这两行复杂的代码,就天生了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五个对象变量。这些天生的类的实例一样平常都寄存在堆中。堆要对一切类的超类,类的实例举行初始化,同时还要挪用类极为每一个超类的构架器。而这些操纵都长短常损耗体系资本的。因而,对对象的天生举行限定,是完整有需要的。
经修正,下面的代码能够用以下的代码来交换。
StringBuffername=newStringBuffer(“HuangWeiFeng”);
System.out.println(name.append(“ismyname.”).toString());
体系将举行以下的操纵。
(1)天生新的字符串缓冲变量newStringBuffer(STR_BUF_1);
(2)复制该字符串缓冲变量
(3)加载字符串常量”HuangWeiFeng”(STR_1);
(4)挪用字符串缓冲的构架器(Constructor);
(5)保留该字符串缓冲到数组中(从地位1入手下手)
(6)从java.io.PrintStream类中失掉静态的out变量
(7)加载STR_BUF_1;
(8)加载字符串常量”ismyname”(STR_2);
(9)以STR_2为参数,挪用字符串缓冲(StringBuffer)实例中的append办法。
(10)关于STR_BUF_1实行toString命令。(STR_3)
(11)挪用out变量中的println办法,输入了局。
由此能够看出,经由改善后的代码只天生了四个对象变量:STR_1,STR_2,STR_3和STR_BUF_1.你大概以为少天生一个对象不会对程序的功能有很年夜的进步。但上面的代码段2的实行速率将是代码段1的2倍。由于代码段1天生了八个对象,而代码段2只天生了四个对象。
代码段1:
Stringname=newStringBuffer(“HuangWeiFeng”);
name+=”ismy”;
name+=”name”;
代码段2:
StringBuffername=newStringBuffer(“HuangWeiFeng”);
name.append(“ismy”);
name.append(“name.”).toString();
因而,充实的使用JAVA供应的库函数来优化程序,对进步JAVA程序的功能时十分主要的.其注重点次要有以下几方面;
(1)尽量的利用静态变量(StaticClassVariables)
假如类中的变量不会随他的实例而变更,就能够界说为静态变量,从而使他一切的实例都共享这个变量。
例:
publicclassfoo
{
SomeObjectso=newSomeObject();
}
就能够界说为:
publicclassfoo
{
staticSomeObjectso=newSomeObject();
}
(2)不要对已天生的对象作过量的改动。
关于一些类(如:String类)来说,宁肯在从头天生一个新的对象实例,而不该该修正已天生的对象实例。
例:
Stringname=”Huang”;
name=”Wei”;
name=”Feng”;
上述代码天生了三个String范例的对象实例。而前两个即刻就必要体系举行渣滓接纳处置。假如要对字符串举行毗连的操纵,功能将得更差。由于体系将不得为今生成更多得一时变量。如上例1所示。
(3)天生对象时,要分派给它公道的空间和巨细
JAVA中的良多类都有它的默许的空间分派巨细。关于StringBuffer类来说,默许的分派空间巨细是16个字符。假如在程序中利用StringBuffer的空间巨细不是16个字符,那末就必需举行准确的初始化。
(4)制止天生不太利用或性命周期短的对象或变量。
关于这类情形,因该界说一个对象缓冲池。觉得办理一个对象缓冲池的开支要比频仍的天生和接纳对象的开支小的多。
(5)只在对象感化局限内举行初始化。
JAVA同意在代码的任何中央界说和初始化对象。如许,就能够只在对象感化的局限内举行初始化。从而勤俭体系的开支。
例:
SomeObjectso=newSomeObject();
If(x==1)then
{
Foo=so.getXX();
}
能够修正为:
if(x==1)then
{
SomeObjectso=newSomeObject();
Foo=so.getXX();
}
2.非常(Exceptions)
JAVA言语中供应了try/catch来发便利用户捕获非常,举行非常的处置。可是假如利用不妥,也会给JAVA程序的功能带来影响。因而,要注重以下两点。
(1)制止对使用程序的逻辑利用try/catch
假如能够用if,while等逻辑语句来处置,那末就尽量的不必try/catch语句
(2)重用非常
在必需要举行非常的处置时,要尽量的重用已存在的非常对象。觉得在非常的处置中,天生一个非常对象要损耗失落年夜部分的工夫。
3.线程(Threading)
一个高功能的使用程序中一样平常城市用到线程。由于线程能充实使用体系的资本。在其他线程由于守候硬盘或收集读写而时,程序能持续处置和运转。可是对线程使用不妥,也会影响程序的功能。
例2:准确利用Vector类
Vector次要用来保留各类范例的对象(包含不异范例和分歧范例的对象)。可是在一些情形下利用会给程序带来功能上的影响。这次要是由Vector类的两个特性所决意的。第一,Vector供应了线程的平安回护功效。即便Vector类中的很多办法同步。可是假如你已确认你的使用程序是单线程,这些办法的同步就完整不用要了。第二,在Vector查找存储的各类对象时,经常要花良多的工夫举行范例的婚配。而当这些对象都是统一范例时,这些婚配就完整不用要了。因而,有需要计划一个单线程的,保留特定范例对象的类或汇合来替换Vector类.用来交换的程序以下(StringVector.java):
publicclassStringVector
{
privateString[]data;
privateintcount;
publicStringVector(){this(10);//defaultsizeis10}
publicStringVector(intinitialSize)
{
data=newString;
}
publicvoidadd(Stringstr)
{
//ignorenullstrings
if(str==null){return;}
ensureCapacity(count+1);
data=str;
}
privatevoidensureCapacity(intminCapacity)
{
intoldCapacity=data.length;
if(minCapacity>oldCapacity)
{
StringoldData[]=data;
intnewCapacity=oldCapacity*2;
data=newString;
System.arraycopy(oldData,0,data,0,count);
}
}
publicvoidremove(Stringstr)
{
if(str==null){return//ignorenullstr}
for(inti=0;i<count;i++)
{
//checkforamatch
if(data.equals(str))
{
System.arraycopy(data,i+1,data,i,count-1);//copydata
//allowpreviouslyvalidarrayelementbegcd
data[--count]=null;
return;
}
}
}
publicfinalStringgetStringAt(intindex){
if(index<0){returnnull;}
elseif(index>count)
{
returnnull;//indexis>#strings
}
else{returndata;//indexisgood}
}
/****************StringVector.java*****************/
因而,代码:
VectorStrings=newVector();
Strings.add(“One”);
Strings.add(“Two”);
StringSecond=(String)Strings.elementAt(1);
能够用以下的代码交换:
StringVectorStrings=newStringVector();
Strings.add(“One”);
Strings.add(“Two”);
StringSecond=Strings.getStringAt(1);
如许就能够经由过程优化线程来进步JAVA程序的功能。用于测试的程序以下(TestCollection.java):
importjava.util.Vector;
publicclassTestCollection
{
publicstaticvoidmain(Stringargs[])
{
TestCollectioncollect=newTestCollection();
if(args.length==0)
{
System.out.println(
"Usage:javaTestCollection");
System.exit(1);
}
if(args.equals("vector"))
{
Vectorstore=newVector();
longstart=System.currentTimeMillis();
for(inti=0;i<1000000;i++)
{
store.addElement("string");
}
longfinish=System.currentTimeMillis();
System.out.println((finish-start));
start=System.currentTimeMillis();
for(inti=0;i<1000000;i++)
{
Stringresult=(String)store.elementAt(i);
}
finish=System.currentTimeMillis();
System.out.println((finish-start));
}
elseif(args.equals("stringvector"))
{
StringVectorstore=newStringVector();
longstart=System.currentTimeMillis();
for(inti=0;i<1000000;i++){store.add("string");}
longfinish=System.currentTimeMillis();
System.out.println((finish-start));
start=System.currentTimeMillis();
for(inti=0;i<1000000;i++){
Stringresult=store.getStringAt(i);
}
finish=System.currentTimeMillis();
System.out.println((finish-start));
}
}
}
/****************TestCollection.java*****************/
测试的了局以下(假定尺度的工夫为1,越小功能越好):
关于线程的操纵,要注重以下几个方面。
(1)避免过量的同步
如上所示,不用要的同步经常会形成程序功能的下落。因而,假如程序是单线程,则必定不要利用同步。
(2)同步办法而不要同步全部代码段
对某个办法或函数举行同步比对全部代码段举行同步的功能要好。
(3)对每一个对象利用多”锁”的机制来增年夜并发。
一样平常每一个对象都只要一个”锁”,这就标明假如两个线程实行一个对象的两个分歧的同步办法时,会产生”逝世锁”。即便这两个办法其实不共享任何资本。为了不这个成绩,能够对一个对象实施”多锁”的机制。以下所示:
classfoo
{
privatestaticintvar1;
privatestaticObjectlock1=newObject();
privatestaticintvar2;
privatestaticObjectlock2=newObject();
publicstaticvoidincrement1()
{
synchronized(lock1)
{
var1++;
}
}
publicstaticvoidincrement2()
{
synchronized(lock2)
{
var2++;
}
}
}
4.输出和输入(I/O)
输出和输入包含良多方面,但触及最多的是对硬盘,收集或数据库的读写操纵。关于读写操纵,又分为有缓存和没有缓存的;关于数据库的操纵,又能够有多品种型的JDBC驱动器能够选择。但不管如何,城市给程序的功能带来影响。因而,必要注重以下几点:
(1)利用输出输入缓冲
尽量的多利用缓存。但假如要常常对缓存举行革新(flush),则倡议不要利用缓存。
(2)输入流(OutputStream)和Unicode字符串
事先用OutputStream和Unicode字符串时,Write类的开支对照年夜。由于它要完成Unicode到字节(byte)的转换.因而,假如大概的话,在利用Write类之前就完成转换或用OutputStream类取代Writer类来利用。
(3)当需序列化时利用transient
当序列化一个类或对象时,关于那些原子范例(atomic)或能够重修的原素要表识为transient范例。如许就不必每次都举行序列化。假如这些序列化的对象要在收集上传输,这一小小的改动对功能会有很年夜的进步。
(4)利用高速缓存(Cache)
关于那些常常要利用而又不年夜变更的对象或数据,能够把它存储在高速缓存中。如许就能够进步会见的速率。这一点关于从数据库中前往的了局集特别主要。
(5)利用速率快的JDBC驱动器(Driver)
JAVA对会见数据库供应了四种办法。这个中有两种是JDBC驱动器。一种是用JAVA外包的当地驱动器;另外一种是完整的JAVA驱动器。详细要利用哪种得依据JAVA布署的情况和使用程序自己来定。
5.一些其他的履历和技能
(1)利用部分变量
(2)制止在统一个类中动过挪用函数或办法(get或set)来设置或挪用变量。
(3)制止在轮回中天生统一个变量或挪用统一个函数(参数变量也一样)
(4)尽量的利用static,final,private等关头字
(5)当复制大批数据时,利用System.arraycopy()命令。
JAVA学习必须明确这是一项投资,对于大多数的人来说,学习JAVA是为了就业,还有就是刚走向工作位置的朋友想尽快赶上工作的节奏。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading) 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 是一种将安全性(Security)列为第一优先考虑的语言 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 是一种使网页(Web Page)产生生动活泼画面的语言
页:
[1]
2