1.判断元素是否在集合中,可以使用HashSet、HashMap代替List
因为List比较集合中的所有元素,才能查找到具体的值,HashMap、HashSet分桶存储,通过查找key的hash值可以快速找到其所在的桶,接近线性的时间复杂度
2.字符串连接操作
大量字符串连接,使用append连接,不建议使用+,每次使用+会产生很多无用的String对象,占用过多的内存,加重GC的负担。
3.拆分字符串
使用StringUtils的split方法拆分字符串,不建议使用String类的split方法,因为String类的split采用正则表达式匹配,匹配效率低,而StringUtils采用的是普通字符串匹配的方式
4.尽量使用基本类型和String常量,避免使用包装类和String对象
基本类型数据产生和处理都在栈中,包装类型都在堆中。因为使用String常量是存在常量池中,所有线程共享的。而创建String对象是在堆中产生一个新的实例。例如
正确示例: String str = “aaaa”
错误示例: String const = new String(“aaaa”)
5.复制数组元素时,采用System的arraycopy()方法代替循环复制
因为arraycopy使用更加底层的函数调用,效率更高
6.避免创建集合不设置初始容量
因为ArrayList的初始容量为10,一旦存储的元素个数超过阈值,会造成集合扩容。如果产生多次扩容,则会产生很多无用的中间集合对象,以及多次无意义的元素拷贝,性能低下。
7.RDD关联
一大一小RDD关联,如果小的RDD是中间计算结果,使用广播小的RDD并在大的RDD的partion函数中从小的RDD查找元素进行关联,避免直接使用Join或GroupBy操作。
一大一小RDD关联,如果小的RDD来源于HDFS文件,使用广播HDFS文件路径并在大的RDD的partion函数中读取HDFS文件查找元素进行关联,避免先读取HDFS文件成RDD后再广播该RDD。
8.多线程中,可以使用原子操作,使用ConcurrentHashMap代替Map,采用AtomicLong
9.常见的高性能集合组件:
(1)FastUtil
(2)Goldman Sachs Collections
(3)HPPC
(4)Koloboke
(5)Trove
10.对象池技术
11.Java NIO和IO,IO是面向流的,NIO是面向缓冲区的,Jetty
12.Java自带的序列化性能较为底下,业界许多的序列化框架Thrift、Kyro、Protostuff
13.JProfiler使用