常用优化组件和方法
- 缓冲
缓冲区市一块特定的内存区域。开辟缓冲区的目的是通过缓解应用程序上下层之间的性能差异,提高系统的性能。在日常生活中,缓冲的一个典例就是漏斗。
由于I/O 操作很容易成为性能瓶颈,所以,尽可能在I/O读写中加入缓冲组件,以提高系统的性能。 - 缓存
缓存也是为提升系统性能而开辟的内存空间。
使用动态代理无需修改一个逻辑方法的代码,便可以为它加上缓存功能,提高其性能。 - 对象复用- “池”
对象池化,它的核心思想是,如果一个对象被频繁请求使用,那么不必每次都生成一个实例,可以将这个类的一些实例保存在一个“池”中,待需要使用的时候直接从池中获取。
只有对重量级对象使用对象池技术才能提高系统性能,对轻量级的对象使用对象池,可能反而会降低系统性能。 - 负载均衡 nginx(以后学习)
java 程序优化
- 字符串优化处理
Java中String类的基本实现,它主要由3个部分组成:char 数组,偏移量和String的长度。Char 数组表示String的内容,它是String对象所表示字符串的超集。String的真实内容是需要由偏移量和长度在char数组中进行定位个截取。
(1) 不变性
(2) 针对常量池的优化
String str = "a"; // 常量池
String str1 = "b"; // 常量池
String str2 = "a"+"b"; // 常量池
String str3 = str+str1; // 用到StringBuilder对象
String str4 ="ab"; // 常量池
String str5 = new String("");
System.out.println(str4==str2); // true
System.out.println(str4==str3); // false
(3)StringBuffer 和StringBuilder
String 的 加法操作虽然会被优化,单“+”和“+=”尽量少用。
在无需考虑线程安全的情况下可以使用性能相对较好的StringBuilder,但若系统有线程安全需求,只能选择StringBuffer。
二 核心数据结构
- List 接口
ArrayList和Vector 使用了数组实现,ArrayList线程不安全,Vector绝大部分方法都做了线程同步。
LinkedList 使用了循环双向链表数据接口。
在能有效地评估ArrayList数据大小初始值的情况下,指定容量大小能对性能有较大的提升。 - Map接口
HashMap就是将key做hash算法,然后将hash值映射到内存地址,直接取得key所对应的数据。在HashMap中,底层数据结构使用的是数组,所谓的内存地址即数组的下标索引。
HashMap 的性能在一定程度上取决于hashCode()的实现。一个好的hashCode()算法,可以尽可能减少冲突,从而提高HashMap的访问速度。
LinkedHashMap 有序的。
注意:不要在迭代器模式中修改被迭代的集合。如果这么做爆出.ConcurrentModificationException异常。这个特性适合于所有的集合类,包括hashMao,Vector,ArrayList等
如果确定需要将排序功能个加入HashMap,使用Treemap,而不是在应用程序中实现排序。 - Set接口<–> 对应map
Set集合的对象是不能重复的。 - 优化集合访问代码
4.1 分离循环被重复调用的代码(例如:提起list.size)
4.2 省略相同操作(record = list.get()) - 改善性能的技巧
(1)慎用异常 try-catch
(2)使用局部变量。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度比较快,其他变量,如静态变量,实例变量等,都在堆中创建,速度比较慢。
(3)对于一些工具类,应用使用static 方法实现,这样不仅可以加快函数调用的速度,同时,调用static方法也不需要生成类的实例,比调用实例方法更为方便,易用。