很多方法需要返回一个数组或集合
比如常见的 service 方法中,我们需要查询满足条件的集合
public List<T> getByNameLike(String name){
return mapper.selectByNameLike(name);
}
在非常多的返回集合的场景中,null 与 0长度集合都表示没有符合条件的结果,也就是多数时候,他们是等价的,而本条目讨论的就是这种情况
至于说 null 和空集合意义不同的场景,那就无需讨论,该返回什么就返回什么。
- 返回 null 有一个比较直接的优势,性能优势,避免了分配这一点点内存,当然也就节省了后续的一点点 gc
- 永远返回0长度的集合则在后续的直接操作中非常方便,可以直接循环或者 调用相应方法
- 与之相对的,当然就是空集合或数组的分配内存开销,不过,这种开销是非常微弱的,对性能的影响微乎其微,除非是这个方法在程序中执行占比非常之大。大多数时候,实际测试,你会发现,这个方法循环几百万遍甚至几千万遍,与几个 jdbc 或者 几遍 redis 等交互的性能差不多。也就是外部交互与内存中操作的性能差异在好几个数量级
- 即便这个方法真的是非常常用的,比如工具类一样的函数,依然有办法去优化,去尽量缩小这样的性能差异
public List<T> getByNameLike(String name){
List<T> list = mapper.selectByNameLike(name);
if(list== null){
return Collections.emptyList();
}
return list;
}
总结:
在方法的返回值中, null 和 空集合/数组 可能有不同的意义或相同的意义,本条目针对的是相同意义下应该返回什么
null 有微弱的性能优势,即便是这样的优势,空集合/数组也能通过优化来无限接近 null 的性能
当然最不合适的就是有些情况返回 null,有时候又返回空集合,这种情况使用者总要做两种判断来处理,并且可能造成意义上的困扰
对于空的返回值选择
[空集合/数组] 优于 null 优于 [可能空集合/数组 ,也可能 null]