collections.reverse()可直接反转列表顺序且修改原列表,时间复杂度o(n);collections.binarysearch()要求列表必须已按自然序或指定comparator排序,否则结果不可靠,返回值≥0表示找到并返回索引。
collections 类提供了对 list 的便捷操作,其中 reverse() 可一键反转列表顺序,binarysearch() 支持二分查找——但必须提前确保列表已升序(或按指定比较器排序),否则结果不可靠。
一键反转:用 reverse() 颠倒元素顺序
调用 Collections.reverse(list) 会直接修改原 List,无需新建对象,时间复杂度 O(n),适用于任何可变 List(如 ArrayList、LinkedList)。
- 原列表必须是可修改的;若传入
Collections.unmodifiableList()包装过的列表,运行时抛出UnsupportedOperationException - 不依赖元素类型,无需实现 Comparable,也不受 null 影响(null 被视为普通元素参与位置交换)
- 示例:List
list = new ArrayList(Arrays.asList("a", "b", "c")); Collections.reverse(list); // 结果为 ["c", "b", "a"]
安全二分查找:先排序,再查,否则结果无效
Collections.binarySearch() 不检查列表是否有序,它假定输入已按自然序(或指定 Comparator)排好。若未排序,返回值无意义(可能负数、可能碰巧命中,但不可预测)。
- 升序查找标准写法:Collections.sort(list); int index = Collections.binarySearch(list, key);
- 自定义顺序时,排序与查找必须使用同一 Comparator:Collections.sort(list, cmp); int index = Collections.binarySearch(list, key, cmp);
- 返回值含义:≥0 表示找到,值为索引;
组合使用技巧:反转后查找需重新排序
如果先用 reverse(),列表变成降序,此时不能直接调用 binarySearch() 查找——除非改用降序 Comparator 并同步排序逻辑。
- 常见误区:反转后直接 binarySearch → 结果错误
- 正确做法:若需查找,优先保持升序;若业务强制要降序数据,查找时传入
Collections.reverseOrder()作为 Comparator,并确保此前用同一 Comparator 排过序 - 示例(降序场景):Collections.sort(list, Collections.reverseOrder()); int idx = Collections.binarySearch(list, key, Collections.reverseOrder());
替代建议:考虑更现代的写法
JDK 8+ 中,对不可变或流式处理场景,可用 list.stream().sorted().toList() 或 list.reversed()(Java 21+ List 新增方法),但 Collections 工具方法仍是最轻量、零对象分配的选择,尤其适合就地修改和性能敏感场景。











