1 尽量在合适的场合使用单例
使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:
第一,控制资源的使用,通过线程同步来控制资源的并发访问;
第二,控制实例的产生,以达到节约资源的目的;
第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
2 尽量避免随意使用静态变量
要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的内存
3 尽量避免过多过常的创建Java对象
尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。
4 尽量使用final修饰符
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如javalangString为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%
5 尽量使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。
6 尽量处理好包装类型和基本类型两者的使用场所
虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。
在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。
7 慎用synchronized,尽量减小synchronize的方法
都知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁 了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小,并且应尽量使用方法同步代替代码块同步。
8 尽量使用StringBuilder和StringBuffer进行字符串连接
这个就不多讲了。
9 尽量不要使用finalize方法
实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。
10 尽量使用基本数据类型代替对象
String str = "hello";
上面这种方式会创建一个"hello"字符串,而且JVM的字符缓存池还会缓存这个字符串;
String str = new String("hello");
此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o
11 单线程应尽量使用HashMap、ArrayList
HashTable、Vector等使用了同步机制,降低了性能。
12 尽量合理的创建HashMap
当你要创建一个比较大的hashMap时,充分利用另一个构造函数
public HashMap(int initialCapacity, float loadFactor)
避免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是 075,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。
13 尽量减少对变量的重复计算
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。
14 尽量避免不必要的创建
15 尽量在finally块中释放资源
程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。
16 尽量使用移位来代替'a/b'的 *** 作
"/"是一个代价很高的 *** 作,使用移位的 *** 作将会更快和更有效
17尽量使用移位来代替'ab'的 *** 作
同样的,对于'' *** 作,使用移位的 *** 作将会更快和更有效
18 尽量确定StringBuffer的容量
StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再 丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。
19 尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null
20 尽量避免使用二维数组
二维数据占用的内存空间比一维数组多得多,大概10倍以上。
21 尽量避免使用split
除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需 要频繁的调用split,可以考虑使用apache的StringUtilssplit(string,char),频繁split的可以缓存结果。
22 ArrayList & LinkedList
一 个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指 针,添加删除的 *** 作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2 者得数据结构,对症下药。
23 尽量使用Systemarraycopy ()代替通过来循环复制数组
Systemarraycopy() 要比通过循环来复制数组快的多
24 尽量缓存经常使用的对象
尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。
25 尽量避免非常大的内存分配
有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。
26 慎用异常
当创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈 *** 作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。
如 果您创建一个 Exception ,就得付出代价。好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来。从技术上讲,您甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw *** 作--尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常。幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就 抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则。
(1)。 用BooleanvalueOf(boolean b)代替new Boolean()
包装类的内存占用是很恐怖的,它是基本类型内存占用的N倍(N>2),同时new一个对象也是性能的消耗。
(2)。 用IntegervalueOf(int i)代替new Integer()
和Boolean类似,java开发中使用Integer封装int的场合也非常多,并且通常用int表示的数值都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128到127这256个状态的Integer,如果使用 IntegervalueOf(int i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用IntegervalueOf代替new Integer的话也将大大降低内存的占用。
(3)。 用StringBuffer的append方法代替"+"进行字符串相加。
这个已经被N多人说过N次了,这个就不多说了。
(4)。 避免过深的类层次结构和过深的方法调用。
因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。
(5)。 变量只有在用到它的时候才定义和实例化。
这是初学者最容易犯的错,合理的使用变量,并且只有在用到它的时候才定义和实例化,能有效的避免内存空间和执行性能上的浪费,从而提高了代码的效率。
(6)。 避免在循环体中声明创建对象,即使该对象占用内存空间不大。
这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误
采用上面的第二种编写方式,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方式中代码会在内存中产生大量的对象引用,浪费大量的内存空间,而且增大了垃圾回收的负荷。因此在循环体中声明创建对象的编写方式应该尽量避免。
(7)。 如果if判断中多个条件用'||'或者'&&'连接,请将出现频率最高的条件放在表达式最前面。
这个小技巧往往能有效的提高程序的性能,尤其是当if判断放在循环体里面时,效果更明显。
1JVM管理两种类型的内存:堆内存(heap),栈内存(stack),堆内在主要用来存储程序在运行时创建或实例化的对象与变量。而栈内存则是用来存储程序代码中声明为静态(static)(或非静态)的方法。
2JVM中对象的生命周期,创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段
3避免在循环体中创建对象,即使该对象点用内存空间不大。
4软引用的主要特点是具有较强的引用功能。只有当内存不够的时候,才回收这类内存,因此在内存足够的时候,它们通常不被回收。它可以用于实现一些常用资源的缓存,实现Cache的功能
5弱引用对象与Soft引用对象最大不同就在于:GC在进行回收时,需要通过算法检查是否回收Soft引用对象,而对于Weak引用对象,GC总是进行回收。
6共享静态变量存储空间
7有时候我们为了提高系统性能,避免重复耗时的 *** 作,希望能够重用一些创建完成的对象,利用对象池实现。类似JDBC连接池。
8瞬间值,序列化对象大变量时,如果此大变量又没有用途,则使用transient声明,不序列化此变量。同时网络传输中也不传输。
9不要提前创建对象
10 (1)最基本的建议就是尽早释放无用对象的引用
A a = new A();
a = null; //当使用对象a之后主动将其设置为空
(2)尽量少用finalize函数。
(3) 如果需要使用经常用到的展,可以使用软引用。
(4) 注意集合数据类型,包括数组,树等数据,这些数据结构对GC来说,回收更为复杂,
(5) 尽量避免在类的默认构造器中创建,初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费。
(6) 尽量避免强制系统做垃圾内存回收。
(7) 尽量避免显式申请数组空间。
(8) 尽量在合适的场景下使用对象池技术以提高系统性能,缩减系统内存开销。
11当做数组拷贝 *** 作时,采用Systemarraycopy()方法完成拷贝 *** 作要比采用循环的办法完成数组拷贝 *** 作效率高
12 尽量避免在循环体中调用方法,因为方法调用是比较昂贵的。
13 尽量避免在循环体中使用try-catch 块,最好在循环体外使用try--catch块以提高系统性能。
14 在多重循环中,如果有可能,尽量将最长的循环放在最内层,最短的循环放在最外层,以减少循环层间的变换次数。
15 在需要线程安全的情况下,使用List list = CollectionssynchronizedList(new ArrayList());
16 如果预知长度,就设置ArrayList的长度。
17 ArrayList 与 LinkedList 选择,熟悉底层的实现原理,选择适当的容器。
18 字符串累加采用StringBuffer
19 系统I/O优化,采用缓冲和压缩技术。优化性能。
20 避免在类在构造器的初始化其他类
21 尽量避免在构造中对静态变量做赋值 *** 作
22 不要在类的构造器中创建类的实例
23 组合优化继承
24 最好通过Classforname() 动态的装载类
25 JSP优化,采用out 对象中的print方法代替println()方法
26 采用ServletOutputStream 对象代替JSPWriter对象
27 采用适当的值初始化out 对象缓冲区的大小
28 尽量采用forward()方法重定向新的JSP
29 利用线程池技术处理客户请求
30Servlet优化
(1) 通过init()方法来缓存一些静态数据以提高应用性能。
(2) 用print() 方法取代println()方法。
(3) 用ServletOutputStream 取代 PrintWriter
(4) 尽量缩小同步代码数量
31 改善Servlet应用性能的方法
(1)不要使用SingleThreadModel
(2)使用线程池ThreadPool
32 EJB优化
实体EJB:
(1)实体EJB中常用数据缓存与释放
(2)采用延迟加载的方式装载关联数据
(3)尽可能地应用CMP类型实体EJB
(4)直接采用JDBC技术处理大型数据
33 优化JDBC连接
(1)设置合适的预取行值
(2)采用连接池技术
(3)全合理应用事务
(4)选择合适的事务隔离层与及时关闭连接对象
34 PreparedStatemetn只编译解析一次,而Statement每次都编译解析。
35 尽可能地做批处理更新
36 通过采用合适的getXXX方法提高系统性能
37 采用设计模式。
public static Object getInnter(Object con){
Object re=null;
Field f;
try {
f = con getClass() getDeclaredField( inner )
f setAccessible(true)
re= f get(con) //取得内部包装的Connection
f setAccessible(false)
} catch Exception e) {
}
return re;
}
以上代码运行后 输出
con Class Type is: mchange v c p impl NewProxyConnection
Inner con Class Type is: mysql jdbc JDBC Connection
Data from DB:
o and o is same object
Data from DB:
上述代码中 首先从数据库连接池获得一个连接 发现连接类型并不是mysql的数据库连接 而是 mchange v c p impl NewProxyConnection 根据类名中可以推测 从数据库连接池中获得的连接只是一个代理 接着 通过反射 取得这个对象中名为inner的属性 并打印其Class类型 发现这才是真正的mysql连接 关闭NewProxyConnection连接 再向池中请求一个新的连接 同样获取该连接内部的实际数据库连接对象 发现 第一次使用的实际数据库连接对象o 和第二次使用的对象o 是完全相同的
这说明 前后两次数据库连接的请求均返回了相同的数据库连接 关闭NewProxyConnection连接时 并没有真正关闭数据库连接 而只是将数据库连接放入连接池保存 使得数据库连接在连接池中得到了复用 而从连接池返回的NewProxyConnection对象 只是对真实数据库连接的包装
除了线程池和数据库连接池 对于普通的Java对象 在必要的时候 也可以进行池化管理 对于那些经常使用 并且创建很费时的大型对象来说 使用对象池维护 不仅可以节省获得对象实例的成本 还可以减轻GC频繁回收这些对象产生的系统压力 但对于生成对象开销很小的对象进行池化 反而可能得不偿失 维护对象池的成本可能会大于对象池带来的好处
注意 在JDK中 new *** 作的效率是相当高的 不需要担心频繁的new *** 作对系统有性能影响 但是new *** 作时所调用的类构造函数可能是非常费时的 对于这些对象 可以考虑池化
返回目录 Java程序性能优化 让你的Java程序更快 更稳定
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
lishixinzhi/Article/program/Java/gj/201311/27800
1不要重复初始化变量。
默认情况下,调用类的构造函数时,java会把变量初始化成确定的值,所有的对象被设置成null,整数变量设置成0,float和double变量设置成00,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键字创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,public int state = thisgetState();
2尽量重用对象。
特别是String对象的使用中,出现字符串连接情况时应使用StringBuffer代替,由于系统不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响。
3尽量使用局部变量。
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。
4尽量使用final修饰符。
带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如javalangString。为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。 5在java+Oracle的应用系统开发中,java中内嵌的SQL语言应尽量使用大写形式,以减少Oracle解析器的解析负担。
6java编程过程中,进行数据库连接,I/O流 *** 作,在使用完毕后,及时关闭以释放资源。因为对这些大对象的 *** 作会造成系统大的开销。
7过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。
JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。
8在使用同步机制时,应尽量使用方法同步代替代码块同步。
9尽量减少对变量的重复计算。
比如
for(int i=0;i<listsize();i++)1
应修改为
for(int i=0,len=listsize();i<len;i++)1
10采用在需要的时候才开始创建的策略。
例如:
String str="abc";if(i==1){ listadd(str);}12
应修改为:
if(i==1){String str="abc"; listadd(str);}
一般需从三点入手。
一、程序本身支持高并发。
简单来说就是要优化我们的代码。
1、避免使用错误的方式,尽量不用instanceof做条件判断,不要将数组声明为:public static final 。
2、使用java中效率高的类,比如尽量使用HashMap 和ArrayList ,除非必要,否则不推荐使用HashTable和Vector ,后者由于使用同步机制,而导致了性能的开销。
3、尽量指定类的final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如javalangString。为String类指定final防止了人们覆盖length()方法。另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50% 。
4、尽量重用对象,避免频繁的使用new对象。对于整个应用只需要存在一个实例的类,我们可以使用单例模式。对于工具类可以使用静态方法的方式访问。
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实
例非常简单。例如,
Java代码 收藏代码下面是Factory模式的一个典型实现:
public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCreditclone();
}
上面的思路对于数组处理同样很有用。
5、特别是String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。
6、StringBuffer 的使用:StringBuffer表示了可变的、可写的字符串。
它有三个构造方法 :
StringBuffer (); //默认分配16个字符的空间StringBuffer (int size); //分配size个字符的空间
StringBuffer (String str); //分配16个字符+strlength()个字符空间
你可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能。这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为,然 后再找出一条更好的提升性能的途径。
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量 的时候,它会将自身容量增加到当前的2倍再加2,也就是(2旧值+2)。如果你使用缺省值,初始化之后接着往里面追 加字符,在你追加到第16个字符的时候它会将容量增加到34(216+2),当追加到34个字符的时候就会将容量增加到 70(234+2)。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和 新字符都拷贝一遍――这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来 立竿见影的性能增益。
StringBuffer初始化过程的调整的作用由此可见一斑。所以,使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。
7、尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。
8、不要重复初始化变量 默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成00,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
9、在JAVA + ORACLE 的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担。
10、Java 编程过程中,进行数据库连接、I/O流 *** 作时务必小心,在使用完毕后,即使关闭以释放资源。因为对这些大对象的 *** 作会造成系统大的开销,稍有不慎,会导致严重的后果。
11、由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null。
12、在使用同步机制时,应尽量使用方法同步代替代码块同步。
13、尽量减少对变量的重复计算
例如:for(int i = 0;i < listsize; i ++) {
…
}
应替换为:
for(int i = 0,int len = listsize();i < len; i ++) {
…
}
14、尽量采用lazy loading 的策略,即在需要的时候才开始创建。
例如:String str = “aaa”;
if(i == 1) {
listadd(str);
}
应替换为:
if(i == 1) {
String str = “aaa”;
listadd(str);
}
15、慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。 异常只能用于错误处理,不应该用来控制程序流程。
16、不要在循环中使用trycatch,应把其放置在最外层。
17、合理的使用Java类 javautilVector。
简单地说,一个Vector就是一个javalangObject实例的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但是,Vector类型的对象在创建之后,对象的大小能够根据元素的增加或者删除而扩展、缩小。请考虑下面这个向Vector加入元素的例子:
Java代码 收藏代码Object obj = new Object();
Vector v = new Vector(100000);
for(int I=0;
I<100000; I++) { vadd(0,obj); }
第一阶段:Java基础,包括java语法,面向对象特征,常见API,集合框架;
第二阶段:java界面编程,包括AWT,事件机制,SWING,这个部分也可以跳过,用的时候再看都能来及;
第三阶段:javaAPI:输入输出,多线程,网络编程,反射注解等,java的精华部分;
第四阶段:数据库SQL基础,包括增删改查 *** 作以及多表查询;
第五阶段:JDBC编程:包括JDBC原理,JDBC连接库,JDBCAPI,虽然现在Hibernate比JDBC要方便许多,但是JDBC技术仍然在使用,JDBC思想尤为重要;
第六阶段:JDBC深入理解高级特性:包括数据库连接池,存储过程,触发器,CRM思想;
第七阶段:HTML语言学习,包括HTML标签,表单标签以及CSS,这是Web应用开发的基础;
第八阶段:JavaScript脚本语言,包括javaScript语法和对象,就这两个方面的内容;
第九阶段:DOM编程,包括DOM原理,常用的DOM元素以及比较重要的DOM编程思想;
第十阶段:Servlet开发,从此开始踏入java开发的重要一步,包括XML,Tomcat服务器的安装使用 *** 作,>
第十一阶段:JSP开发:JSP语法和标签,自定义标签,EL,JSTL库了解以及MVC三层架构的设计模式理念;
第十二阶段:AJAX开发:AJAX原理,请求响应处理,AJAX开发库;
第十三阶段:轻量级框架,三大框架之一Struts框架的学习,自此踏入javaweb开发的精华部分,包括Struts体系架构,各种组件,标签库和扩展性的学习;
第十四阶段:Hibernate框架学习,三大框架之一,包括检索映射技术,多表查询技术,缓存技术以及性能方面的优化;
第十五阶段:Spring框架的学习,三大框架之一,包括了IOC,AOP,DataSource,事务,SSH集成以及JPA集成;
还有些java的技术,包括EJB30等,可以选择学习,与三大轻量级框架相比,EJB就是当之无愧的重量级了。
以上就是关于Java代码如何优化全部的内容,包括:Java代码如何优化、Java程序性能优化-对象复用“池”(2)[2]、是否有进一步优化Java调用的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)