Java中判断数组是否包含某元素需据类型、排序及查询频次选择方法:基本类型遍历最稳;引用类型可用Arrays.asList().contains();已排序数组用binarySearch();高频查询可转HashSet。

Java 中没有直接判断数组是否包含某元素的内置方法,得根据数组类型、是否排序、查询次数来选合适的方式。核心原则是:别硬套一种写法,先看清数组是什么类型、要不要反复查、排没排序。
基本类型数组(如 int[])就老老实实遍历
这是最稳、最没坑的选择。Arrays.asList() 对 int[] 完全无效,会把整个数组当成一个元素,contains() 永远返回 false。
- 用增强 for 循环,代码干净,适合小中规模数组
- 用 IntStream.of(arr).anyMatch(x -> x == target) 也行,语义清晰,但有少量流开销
- 别写错逻辑:一定要在循环内判断并 break 或 return,避免越界或漏判
引用类型数组(如 String[]、Integer[])可用 Arrays.asList().contains()
写起来最简洁,但只适用于对象数组,且底层仍是线性扫描,不是哈希查找。
- String[] arr = {"a", "b", "c"}; boolean exists = Arrays.asList(arr).contains("b");
- 注意 null 安全:如果数组含 null,目标值又是 null,equals 可能抛 NPE,建议提前判空
- 别对 Integer[] 用 == 比较,要用 equals,否则包装类缓存外的数值比较会出错
已排序数组优先用 Arrays.binarySearch()
这是唯一真正“快速”的方式,时间复杂度 O(log n),但前提是数组必须已排序——不是“差不多排”,而是严格升序(或按指定 Comparator 排)。
立即学习“Java免费学习笔记(深入)”;
- int index = Arrays.binarySearch(sortedArr, target); boolean exists = index >= 0;
- 传入未排序数组结果不可预测,哪怕碰巧对了一次,下次也可能错
- 浮点数组要小心 NaN 和 ±0,它们在排序和查找中行为特殊,binarySearch 可能失效
同一数组查很多次,就转成 HashSet
空间换时间,适合读多写少场景。一次建集合,后续每次查询接近 O(1)。
- 基本类型需用 IntSet(如 Trove 或 Eclipse Collections 的 IntOpenHashSet),或包装成 Integer(有装箱开销)
- 引用类型可直接 new HashSet(Arrays.asList(arr)),但要注意数组元素是否重写了 equals/hashCode
- 如果数组内容会变,HashSet 不会自动同步,得重新构建


















