Java中Array和Arrays的区别

本文探讨了Java中的Array类和Arrays静态类。Array是基本的存储结构,高效但容量固定;Arrays则提供搜索、排序和复制等静态方法,如equals()用于比较数组相等,sort()对数组排序,binarySearch()在已排序数组中查找元素。此外,Arrays.asList(array)可将数组转换为List,但存在限制。

这里写自定义目录标题

数组类Array

Array为数组类,它是Java中的一个最基本的存储结构,为我们提供了动态创建和访问Java数组的方法。它是最高效的,但是其容量是固定的,并且无法动态改变,且存放同一数据类型的数据。
在这里插入图片描述

静态类Arrays

与Collections相似,此静态类专门用于处理Array,为此提供了搜索、排序、复制等静态方法。

  • equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
  • sort():用来对array进行排序。
  • binarySearch():在排好序的array中寻找元素。
  • Arrays.asList(array):将数组array转化为List (此种方法不正规,之后我们通过代码来分析)

我们希望将一个数组Array对象转换成列表ArrayList对象时,我们会使用Arrays.asList()方法,其实这并不是真正意义上的转成ArrayList对象了。因为该类的大小(size)是固定的。 Arrays.asList确实会返回一个ArrayList对象,但是该类是Arrays类 中一个私有静态内部类,而不是常见的java.util.ArrayList类。这个java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有任何添加或移除元素的任何方法。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200311185757404.png) 这是翻译版的api解释。。。 那换句话说,下面的方法是不正确的,但如果不进行添加操作,还是可用的。。。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200311190016330.png)
那么正确的方法应该是这下面的两种: **方法一** ArrayList的构造方法可以接受一个Collection类型的对象,而我们的 java.util.Arrays.ArrayList正好也是它的一个子类 ```java String attr[] = { "1", "2", "3" }; List list = new ArrayList(Arrays.asList(attr)); ``` **方法二(推荐)** ArrayList的构造方法可以接受一个Collection类型的对象,而我们的 java.util.Arrays.ArrayList正好也是它的一个子类 ```java String attr[] = { "1", "2", "3" }; List list = new ArrayList(attr.length); Collections.addAll(list, attr); ```

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    @Test
    public void test1() {
        String attr[] = { "1", "2", "3" };
        List<String> list = Arrays.asList(attr);
        System.out.println(list.getClass());
        list.add("4");// 报错
        for (String s : list) {
            System.out.println(s);
        }
    }


    @Test
    public void test2() {
        String attr[] = { "1", "2", "3" };
        List<String> list = new ArrayList<String>(Arrays.asList(attr));
        System.out.println(list.getClass());
        list.add("4");// 不会报错
        for (String s : list) {
            System.out.println(s);// 1234
        }
    }

    @Test
    public void test3() {
        String attr[] = { "1", "2", "3" };
        List<String> list = new ArrayList<String>(attr.length);
        Collections.addAll(list, attr);
        System.out.println(list.getClass());
        list.add("4");// 不会报错
        for (String s : list) {
            System.out.println(s);// 1234
        }
    }
### JavaArrayList Array 的对比 #### 数据结构定义 在 Java 中,`Array` 是一种基本的数据存储形式,而 `ArrayList` 则是基于数组实现的一种动态集合类。`Array` 需要在创建时指定长度,并且其大小不可变[^4]。相比之下,`ArrayList` 提供了一种更灵活的方式管理数据集,允许动态调整容量。 #### 类型支持 `Array` 可以保存原始类型(如 `int`, `char` 等),也可以保存对象类型的引用。然而,`ArrayList` 仅能保存对象类型的引用,无法直接存储原始类型。为了弥补这一不足,Java 提供了自动装箱/拆箱机制来处理原始类型到对应包装器类的转换[^2]。 #### 大小灵活性 `Array` 的尺寸一旦设定便不可更改。如果尝试向已满的数组中添加新元素,则会抛出异常或者需要手动复制到更大的数组中完成扩展。与此不同的是,当 `ArrayList` 达到当前容量上限时,它能够自动增加内部数组的大小以容纳更多项[^1]。 #### 性能考量 对于频繁访问操作而言,由于底层均采用连续内存布局的缘故,两者表现相似——随机存取时间复杂度均为 O(1)[^4]。但在涉及大量增删动作的情况下,尤其是中间位置上的变动,`ArrayList` 可能因为每次扩容都需要重新分配空间以及移动现有记录而导致效率下降;而对于固定规模的任务来说,原生 `Array` 往往具备更高的执行速度与更低的空间开销。 以下是将 `Array` 转换为 `ArrayList` 并再次还原成 `Array` 的简单示例: ```java import java.util.ArrayList; import java.util.Arrays; public class Test { public static void main(String[] args) { String[] array = {"A", "B", "C"}; // 将数组转化为列表 ArrayList<String> list = new ArrayList<>(Arrays.asList(array)); System.out.println("List after conversion: " + list); // 修改列表中的某个值 if (!list.isEmpty()) { list.set(0, "Modified"); } System.out.println("Updated List: " + list); // 把列表再转回数组 String[] newArray = list.toArray(new String[0]); System.out.println("New Array content: " + Arrays.toString(newArray)); } } ``` 此代码片段展示了如何利用 `Arrays.asList()` 方法快速构建一个初始状态固定的列表实例,随后通过新建一个可变版本 (`new ArrayList<>`) 来获得完全可控的操作权限^3]。 综上所述,在实际开发过程中应依据具体需求权衡选用合适的数据容器形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值