AdrianHu99 / NOTES

0 stars 0 forks source link

Java代码性能优化的 40+ 细节 #31

Closed AdrianHu99 closed 5 years ago

AdrianHu99 commented 5 years ago

https://mp.weixin.qq.com/s/xRfn558-FzPc_edJU6eJYA

AdrianHu99 commented 5 years ago

避免随意使用静态变量 当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如

public class A { private static B b = new B(); }

此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。

AdrianHu99 commented 5 years ago

使用final修饰符 带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java、lang、String,为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),此举能够使性能平均提高50%。

https://stackoverflow.com/a/21485260/4458628

AdrianHu99 commented 5 years ago

使用基本数据类型代替对象 String str = "hello";

上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;

String str = new String("hello");

此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o

AdrianHu99 commented 5 years ago

合理的创建HashMap 当你要创建一个比较大的hashMap时,充分利用这个构造函数

public HashMap (int initialCapacity, float loadFactor);

避免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。

AdrianHu99 commented 5 years ago

减少对变量的重复计算 如:

for(int i =0;i<list.size();i++)

应该改为:

for(int i=0,len=list.size();i<len;i++)

并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

AdrianHu99 commented 5 years ago

避免使用split 除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

AdrianHu99 commented 5 years ago

在字符串相加的时候,使用 ' ' 代替 " ",如果该字符串只有一个字符的话