阿里巴巴java开发手册强制要求:空集合判空用isempty()而非size()==0;初始化集合需指定容量;禁止foreach中修改结构;变量命名须体现类型且泛型不可裸用。

阿里巴巴 Java 开发手册对集合处理有明确的强制性要求,核心是避免 NullPointerException、提升可读性、防止并发问题,并统一编码风格。以下为关键约束及落地建议:
使用 Collection.isEmpty() 判断空集合,禁止用 size() == 0
手册强制要求用 isEmpty() 替代 size() == 0,因为:
-
isEmpty()语义清晰,意图明确; - 部分集合(如某些懒加载或代理集合)
size()可能触发计算或 I/O,性能不可控; - 部分实现类(如
Guava的不可变集合)虽两者等价,但统一用isEmpty()更安全、更规范。
✅ 正确写法:if (list != null && !list.isEmpty()) { ... }
❌ 禁止写法:if (list != null && list.size() == 0) { ... }
集合初始化时指定初始容量,避免频繁扩容
对于已知大致规模的集合(尤其是 ArrayList、HashMap),必须显式传入初始容量:
-
ArrayList默认容量为 10,扩容需数组复制,开销明显; -
HashMap默认初始容量 16、加载因子 0.75,若实际存 100 个元素,至少扩容 2 次; - 推荐按预估数量 × 1.2~1.5 倍设置初始容量,兼顾空间与性能。
✅ 示例:List<string> list = new ArrayList(128);</string>Map<string object> map = new HashMap(32);</string>
禁止在 foreach 循环中修改集合结构(增删元素)
直接在增强 for 循环中调用 remove() 或 add() 会抛出 ConcurrentModificationException:
- 这是 fail-fast 机制的保护行为,非线程安全导致,而是迭代器检测到结构性修改;
- 正确方式:使用
Iterator.remove(),或改用普通 for 倒序遍历(仅限ArrayList等支持随机访问的集合); - 批量删除推荐用
removeIf()(JDK 8+),语义清晰且安全。
✅ 安全写法:list.removeIf(item -> item == null || item.isEmpty());for (Iterator<string> it = list.iterator(); it.hasNext(); ) {<br> if (shouldRemove(it.next())) it.remove();<br>}</string>
集合变量命名必须体现类型特征,且禁止使用泛型通配符裸用
手册强调命名即契约,例如:
- 用
userList、orderMap而非list、map; - 泛型必须具体化:
List<user></user>✅,List❌(原始类型)、List>❌(无界通配符裸用); - 若需协变/逆变,应明确使用
? extends T或? super T,并配合注释说明用途。
✅ 合规示例:private final List<order> orderList = new ArrayList();</order>public void processOrders(List extends Order> orders) { ... }










