目录
2、不要在 foreach 循环里进行元素的 remove/add 操作
一、数据库篇
1、尽量使用批量操作
数据库的增删改查,能使用批量操作的就使用,比如:
1、在for循环里不要去操作数据库;(这个就不写例子了)
使用集合,先将待操作的数据存入集合,再批量的进行数据库操作。
2、对于业务逻辑可能需要查询不同数据的,尽量封装为一个sql查询,将结果存入到内存的集合中,需要时再取出来。
比如现在有个场景:
车辆有3个状态,0-静止中;1-匀速行驶中;2-减速中;3-加速中;
有一段业务需求,需要依次获取处于各个状态的车辆,并根据返回值做不同的逻辑处理;
我们的处理方式有两种,一种就是根据状态,每次查询出一个车辆实体类;另一种就是一次性查询所有状态的车辆,并根据状态放入Map集合中,需要哪种状态时,再从Map集合去取出来。
在这种情况下,我们就应该采用方式2,一次性取出,因为通过内存的方式查询并取出的效率一定是比从数据库获取数据快的。
下面是小编最近使用的程序,先一次性从数据库获取想要的所有数据,放入map集合:
/**
* 根据userkey获取对应week的周报集合(包含不同的status的周报)
* @param submitUserKey
* @param teamId
* @param week
* @return Map集合 key:status
*/
@MapKey("status")
Map<Byte, Weekly> getSubmittedWeeklyMap(@Param("submitUserKey") String submitUserKey, @Param("teamId") Integer teamId,
@Param("week") String week);
在进行业务逻辑处理时,从map集合中获取到对应的数据,进行业务逻辑处理:
Map<Byte, Weekly> weeklyMap = weeklyMapper.getSubmittedWeeklyMap(submitUserKey, teamId, week);
Weekly weekly = weeklyMap.get(WeeklyStatusEnum.UPDATE_BUT_NOTSUBMINT.getCode());
if (weekly == null){
weekly = weeklyMap.get(WeeklyStatusEnum.SUBMIT.getCode());
}
if (weekly == null){
weekly = weeklyMap.get(WeeklyStatusEnum.NOT_SUBMIT.getCode());
}
if (weekly == null){
// 对应处理逻辑
}
二、for循环篇
关于for循环,目前的建议如下:
- 优先使用 lambda 表达式:代码简洁,效率高
- 次之,使用 foreeach
- 最后才用for循环
1、不要在循环里创建对象引用
// 不好的示范
for (int i = 0; i < 20; i++) {
Object o = new Object();
}
/*
上面这种做法会导致内存中有20个 Object 对象的引用存在
*/
//建议做法
Object obj = null;
for (int i = 0; i < 20; i++) {
obj = new Object();
}
/*
如上,这种实现方式,内存中就只有一份 Object 对象的引用
每次 new Object();的时候,object对象引用指向不同的 object而已
但是内存中只有一个object,节省内存空间
*/
2、不要在 foreach 循环里进行元素的 remove/add 操作
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
// remove最后一位元素时程序会抛异常
if ("2".equals(item)) {
list.remove(item);
}
}
System.out.println(list.toString());
}
使用循环remove集合的最后一位元素时,报错信息如下:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.hanclouds.teamwork.service.WeeklyServiceImpl.main(WeeklyServiceImpl.java:235)
应该使用迭代器或者lambda表达式进行remove
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
// 使用迭代器删除
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if ("2".equals(item)) {
iterator.remove();
}
}
// 或者使用lambda表达式
// list.removeIf("2"::equals);
System.out.println(list.toString());
}
三、if语句篇
- if 嵌套不要超过3层,而且能避免嵌套则避免嵌套
四、注释篇
- 规范,一定要规范,建议阅读《阿里巴巴Java开发手册》
- 简洁,只在必要的地方注释。