原因

方便开发人员维护、让程序运行更快。

原则/标准

  • 保持代码可读性(可维护性)
  • 使用合适的数据结构和算法
  • 减少重复计算
  • 使用缓存、缓冲
  • 优化 I/O 和网络请求
    • 异步
    • 批量请求而非单次请求
    • 避免在循环中读取db
    • 使用http下载文件时,若文件已存在就不下载了,可以先判断文件是否存在,不存在再创建http连接
  • 尽可能少创建对象
  • 池化对象
  • 大对象复用
  • 并行计算
  • 锁优化
  • NIO
  • if-else 修改为Map/设计模式
  • 双重循环可以优化为单循环+Map
  • 查数据库时要加where/limit
  • 懒加载
  • 用完资源记得关闭
  • 数据库相关
    • 避免大事务
    • 索引
    • 批量获取、批量保存
    • 查询时限制条数
  • 调用rpc时要配置超时时间

代码优化

nginx开启gzip

没有并发时,使用非线程安全的对象

字符串拼接时使用StringBuilder而非StringBuffer。
使用ArrayList而不是Vector。

使用类库,如commons-lang/commons-lang3/commons-collections4

String s = str1 + "_" + str2 + "_" + str3 + "_" + str4
import org.apache.commons.lang3.StringUtils;

String s = StringUtils.joinWith("_", str1, str2, str3, str4)

字符串拆分时不使用String#split()而使用StringUtils.split()

import org.apache.commons.lang3.StringUtils;

String str = "abc,def,ghi";
// StringUtils.split()比String#split()效率高,后者是正则匹配
String[] s = StringUtils.split(str, ",");
String[] s2 = str.split(",");

不在循环中字符串+拼接

容器初始化时指定长度,减少不必要的扩容操作

Map<String, String> map = new HashMap<>(100);
Map<String, String> map2 = new HashMap<>(128);

List<String> list = new ArrayList<>(20);

不使用SimpleDateFormat,使用java8提供的DateTimeFormatter.ofPattern(pattern).withZone(targetZone)

log中使用占位符,不要拼接字符串

log.inf("userInfo=" + userInfo); // 不推荐
log.inf("userInfo={}", userInfo);//   推荐

编写更可读的代码

public void cr8User(XXX xxx) {
}

方法是createUser,但取了谐音,不利于理解。

使用redis时构建key时出现多处字符串拼接,可以优化为静态方法,并给一个业务名称。如

// 出现多处拼接
String redisUserKey = "user:" + userId;

// 可以提取成方法,并赋予业务名称
public static String buildUserKey(Long userId) {
    return "user:" + userId;
}

静态变量替代多次出现的字符串

缓存

如从mysql中查数据,但数据不常变化,可以查出后放到缓存一定时间如10分钟。

redis multiGet

数据库优化

连接池

查询时限制条数

作者:张三  创建时间:2022-04-19 19:20
最后编辑:张三  更新时间:2025-04-28 16:11