登录
首页 >  文章 >  java教程

Java中Arrays常用方法有哪些?

时间:2026-01-15 09:00:39 103浏览 收藏

从现在开始,努力学习吧!本文《Java中Arrays类常用方法有哪些?》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

Arrays.asList()返回的List不支持增删操作,调用add/remove会抛UnsupportedOperationException;需可变列表应显式new ArrayList(Arrays.asList(arr));基本类型数组传入会导致装箱异常。

在Java里Arrays类提供了哪些常用方法_Java数组操作基础说明

Arrays.asList() 转数组为List但不支持增删

这个方法常被误用为“把数组变成可修改的ArrayList”,实际返回的是 Arrays.ArrayList(一个静态内部类),它继承自 AbstractList,但没有重写 add()remove() 等方法——调用会直接抛 UnsupportedOperationException

  • 适合只读场景:传参给需要 List 的 API,比如 Collections.binarySearch()
  • 若需真正可变的 ArrayList,得显式包装:
    new ArrayList(Arrays.asList(arr))
  • 注意泛型擦除问题:基本类型数组(如 int[])传入后,整个数组会被当作单个元素,结果是 List,不是你想要的 List

Arrays.sort() 对基本类型和对象数组行为不同

Arrays.sort() 重载多,但底层策略差异大,直接影响性能和稳定性:

  • int[]double[] 等基本类型数组,使用双轴快排(Dual-Pivot Quicksort),平均 O(n log n),最坏 O(n²),但实践中极难触发
  • 对对象数组(如 String[]MyObj[]),默认用 Timsort(归并+插入混合),稳定且最坏也是 O(n log n)
  • 若对象类没实现 Comparable,又没传 Comparator,运行时抛 ClassCastException
  • 多维数组排序只作用于第一维(即按引用排序),不会递归进子数组

Arrays.equals() 和 == 判等逻辑完全不同

新手常拿 == 比较两个数组,结果永远是 false(除非指向同一对象)。Arrays.equals() 才是语义正确的逐元素比较:

  • 对基本类型数组:逐个用 == 比较值
  • 对对象数组:逐个调用 Objects.equals(a, b)(即先判 null,再调 .equals()
  • 注意:它不递归比较嵌套数组,Arrays.equals(new int[][]{{1}}, new int[][]{{1}}) 返回 false;深层比较得用 Arrays.deepEquals()
  • 多线程下无同步开销,但别在循环里反复调用——自己缓存哈希或用 Arrays.hashCode() 预判

Arrays.fill() 只赋值,不扩容也不创建新数组

Arrays.fill() 是原地操作,仅修改已有数组内容,这点必须明确:

  • 它不能把 int[] arr = null 填成全 0;必须先初始化数组,否则 NPE
  • 填对象数组时,所有位置都指向同一个引用(比如 Arrays.fill(objArr, new MyObj()) 后,所有元素是同一实例)
  • 想填不同对象,得手动循环或用 Stream:
    IntStream.range(0, arr.length).forEach(i -> arr[i] = new MyObj());
  • 对大数组,fill() 比手写 for 循环略快(JVM 内联优化),但差距微乎其微,不必为此改写逻辑
容易被忽略的是:所有 Arrays 静态方法都不改变数组长度,也不处理 null 元素的自动装箱/拆箱。基本类型数组和包装类数组(如 Integer[])混用时,错误往往出现在类型推断和空指针上,而不是方法本身。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Java中Arrays常用方法有哪些?》文章吧,也可关注golang学习网公众号了解相关技术文章。

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>