CRUD麻木了吗?系统慢被xxx投诉?你真的了解你的代码吗?今天就来说说java性能的一些细节。部分内容来自本站:http://java-performance.com,英文较好的朋友可直接阅读原文。我今天的内容是我自己的总结和部分翻译的结合。Mainpart1.java正则表达式相关优化使用Matcher和Pattern进行预编译,替换String.matches、split、replaceAll、replaceFirst等方法,避免不必要的pattern编译。二、java.util.LinkedList性能考虑使用ArrayDeque进行基于队列的算法替代LinkedList,性能优于LinkedList;使用ListIterator(forEach)遍历LinkedList【链表特性】;避免任何接受或返回列表中元素索引的LinkedList方法【类似获取索引的操作】,性能很差,通过遍历列表实现;使用pollFirst/pollLast替换LinkedList.remove/removeFirst/removeLast方法。三、java.util.Date、java.util.Calendar和java.text.SimpleDateFormat性能日期的存储、解析和转换除非你必须使用java.util.Date,否则不要使用它。改用普通长。java.util.Calendar可用于各种日期计算,但要避免存储大量此类对象或大量创建它们-它们会消耗大量内存并且创建起来很昂贵。java.text.SimpleDateFormat适用于一般情况下的日期时间解析,但如果您必须以相同的格式解析大量日期(尤其是没有时间的日期),最好避免使用它。改为手动实现解析器。相关优化案例请参考:https://github.com/alibaba/ar...,案例中还包含了一些List操作的优化。4.使用JodaTime类库进行时间处理,在某些方面有更好的表现。官网:https://www.joda.org/joda-time/5.java.io.ByteArrayOutputStream不应在性能关键代码中使用ByteArrayOutputStream对于性能关键代码,请尝试使用ByteBuffer而不是ByteArrayOutputStream。如果您仍想使用ByteArrayOutputStream-取消同步。在大多数情况下,避免使用ByteArrayOutputStream.toByteArray方法-它会创建内部字节数组的副本。如果您的应用程序使用几千兆字节的内存,垃圾收集这些副本可能会花费大量时间。六、java.io.BufferedInputStream、java.util.zip.GZIPInputStream、java.nio.channels.FileChannel:这两个流BufferedInputStream和GZIPInputStream中的一些小的性能陷阱有内部缓冲区。前者默认大小为8192字节,后者默认大小为512字节。一般来说,增加任何大小至少到65536是值得的。(减少BufferedInputStream的性能损失,GZIPInputStream自动扩容)七、各种通用压缩算法的性能——其中一些算法快得惊人(LZ4)如果你认为数据压缩非常慢,请检查LZ4(快速)实现,它能够以大约320Mb/秒的速度压缩文本文件-对于大多数应用程序来说,以这种速度压缩应该不会引起注意。如果可能,将LZ4压缩缓冲区大小增加到32M限制是有意义的(请记住,您需要一个类似大小的缓冲区来进行解压缩)。您还可以尝试链接2个缓冲区大小为32M的LZ4BlockOutputStream-s以充分利用LZ4。如果您仅限于3rd方库或想要更好的压缩,请查看JDKdeflate(lvl=1)[实现类:java.util.zip.DeflaterOutputStream/InflaterInputStream]编解码器-它能够以约75Mb/秒的速度进行压缩同一个文件。8、ava.util.Map、java.util.Set等大部分优化(尽量避免使用contains)对于集合,调用contains+add/remove被单次调用add/remove代替;对于Maps,避免使用contains+get,取而代之的是get,然后对get结果进行null检查。contains+remove对应关系被替换为删除并检查其结果的单个调用。【另:ConcurrentHashMap本身的containsKey方法是通过get方法实现的】9、java.util.Random和java.util.concurrent.ThreadLocalRandom在单线程和多线程环境下的概述。在之间共享一个java.util.Random实例,但将其包装在ThreadLocal中。十、使用ApacheCommonsStringUtils.replace代替String.replace如果代码中有大量的替换操作,可以考虑使用StringUtils。StringUtils远远优于Java8的String.replace方法。//替换这个test.replace("test","simpletest");//用这个StringUtils.replace(test,"test","simpletest");十一、尽量用double/long代替BigDecimal较小的货币单位,如(angle,cent),用double或long存储;在stackoverflow上看到一个老哥说BigDecimal比double慢1000倍,没实践过。总之,BigDecimal性能不佳是不争的事实。四舍五入并截取小数长度(在使用尽可能小的单位的前提下);避免将double转换为BigDecimal,如果要转换,请使用String转换BigDecimal;
