数组和List之间的相互转换

本文详细介绍了Java中数组和列表(如ArrayList)的转换过程,包括Arrays.asList()和List.toArray()方法,强调了类型一致性、列表和数组的固定/可变特性以及转换时的效率和空元素处理问题。

数组和列表(List)在Java中是常用的数据结构,它们各自有不同的优点:数组大小固定,访问速度快;列表大小可变,使用更灵活。在实际开发中,我们经常需要在两者之间进行转换。以下是如何在数组和列表之间进行相互转换的详细方法、源码分析以及代码演示。

从数组到List

要将数组转换为列表,可以使用 Arrays.asList(T... a) 方法。它返回一个固定大小的列表。这个列表是一个适配器,它直接映射到原始数组上。来看下面的代码示例和解释。

代码演示:

import java.util.Arrays;
import java.util.List;

public class ConversionDemo {
    public static void main(String[] args) {
        String[] array = {"Apple", "Banana", "Cherry"};
        List<String> list = Arrays.asList(array);

        System.out.println(list);
    }
}

源码分析:

Arrays.asList() 是一个泛型方法,内部实现大致如下:

public class Arrays {
    // ... 省略其他代码 ...

    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    // ... 省略其他代码 ...

    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable {
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

        // ... 实现 AbstractList 的各种方法 ...
    }
}

这个内部的 ArrayList 类(注意,这不是 java.util.ArrayList)是一个固定大小的列表视图,它直接引用了传入的数组。当你尝试对这个列表执行添加或删除操作时,会抛出 UnsupportedOperationException

从List到数组

要将列表转换为数组,可以使用 List 接口的 toArray() 方法。这个方法有两个版本:一个返回 Object[],另一个可以返回更具体类型的数组。

代码演示:

import java.util.ArrayList;
import java.util.List;

public class ConversionDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 无参版本,返回 Object[]
        Object[] objectArray = list.toArray();

        // 有参版本,返回 String[]
        String[] stringArray = list.toArray(new String[0]);

        System.out.println(Arrays.toString(objectArray));
        System.out.println(Arrays.toString(stringArray));
    }
}

源码分析:

ArrayList 中的 toArray() 方法本质上调用了 System.arraycopy() 来复制列表中的元素到数组中。

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, Serializable {
    // ... 省略其他代码 ...

    public <T> T[] toArray(T[] a) {
        if (a.length < size) {
            // 如果传入数组大小不足,会创建一个新的数组实例
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        }
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size) {
            a[size] = null;
        }
        return a;
    }

    // ... 省略其他代码 ...
}

在使用 toArray(T[] a) 时,如果传入的数组大于或等于列表的大小,就会在传入的数组上直接进行元素复制。如果传入的数组小于列表的大小,则会在内部创建一个新的数组,类型为传入数组的类型,并返回。

注意细节

在进行数组和列表之间的转换时,以下是一些需要特别注意的细节:

  1. 类型一致性:使用 toArray(T[] a) 方法时,传入数组的类型应与列表元素的类型相匹配,否则会抛出 ArrayStoreException
  2. 列表的固定大小Arrays.asList() 返回的列表尺寸是固定的,不能增加或减少元素。
  3. 数组的固定大小:数组一旦创建大小固定,转换为列表后,如果需要动态改变大小,需要转换为 ArrayList
  4. 效率问题:转换操作是有成本的,特别是在列表到数组的转换中,可能涉及到数组的复制。如果性能是一个考虑点,这个成本需要被考虑进去。
  5. 空元素的处理:在将列表转换为数组时,如果传入的数组比列表大小要大,多出来的数组位置将被设置为 null

综上所述,数组和列表之间的转换是Java编程中的一个基本操作,理解它们的内在机制对于编写高效和可靠的代码非常重要。通过上述示例和解释,你应该对如何进行这些转换有了深入的理解。

基于新一代多媒体加密技术,更高安全性、支持win7(32,64)WIN8(32,64); 支持各种视频的高速编码加密与高速解码播放; 可以加密各种视频音频格式文件(wmv, avi, asf, mpg, rm, rmvb, mp4, flv, mp3, vob, mov, mkv, mpeg, dat等等其他各种音频视频格式); 加密后的文件可以通过离线方式授权播放,也可以通过网络方式授权播放; 只需要加密一次,就可以实现一机一码授权播放;V2017S版重要更新:1、正式版增加了自定义播放器图标功能,个性化图标个性化界面可以显著提升企业形象;2、正式版增加了默认水印功能,无需设置播放密码就可以给视频添加水印;3、正式版采用更高强度加密内核,让所有形式的翻版方式都失效;4、正式版采用更高强度播放密码算法,让所有形式的偷换机器码播放方式均失效;5、正式版金盾2017S防翻录又增利器,新增播放窗口位移功能,播放过程中播放窗口会按你指定的时间移动变换位置, 让任何翻录软件都无可奈何,如果是全屏播放会自动退出全屏再换位置;V2017版重要更新:1、播放器开启速度大幅度提高;2、新增U盘移动硬盘召回功能;3、增加文件关联功能,加密后的视频可以自动关联到播放器,双击视频即可打开;4、可以自定义个性化认证界面图,专业的认证界面可以显著提升企业形象;5、新增自毁功能,加密后的视频检测到破解可以自毁,此功能可以抵御市面上所有破解方式;6、新增天狼加密内核,此加密措施从未被破解过,金盾高级武器库又增利器;7、新增防翻录问答功能,对试图翻录你视频的人是一个噩梦!金盾2016SS重要更新:1、新增扭曲变换加密算法,加密算法增加至4种,加密算法混用可以达到奇效;2、新增加密强度分级显示;3、改进RSA加密算法;4、新增内存保护功能;V2016版重要更新:1、加密视频可以设置保留原始格式,也可以自定义格式,加密后的视频杀毒软件永不误报 !2、单个视频支持无穷大,逐帧加密,加密后的视频可以在1秒钟左右打开播放,边解密边播放;3、有两种加密算法可以选择,几乎可以加密所有常见或不常见的视频格式;4、加密后的视频可以采用各种灵活调用方式,可以命令行调用播放、插件方式调用播放[定制]、双击播放等等;5、非对称加密算法采用国际上最高强度加密算法,技术上领先国内国外其他软件整整两代,可谓视频加密领域的第五代战机!6、可启用高清播放,图像放大播放边缘依然平滑,不产生锯齿,颜色不失真;7、酷炫视频水印功能,真正透明水印,可以设置水印颜色、大小、旋转角度、浮动范围;防翻录水印可以设置透明度,不影响用户播放!8、快进播放不影响音质,快进播放时声音依然是高保真原声效果;9、播放过程中可以切换硬件加速,降低CPU使用率;10、可以自动绑定用户第一次播放的电脑,无需用户机器码!11、灵活的绑定选项,加密视频可以绑定主板、硬盘,显卡、网卡、U盘、加密狗等;12、灵活的试播文件制作功能;13、灵活的业务接口,可以结合网站、结合网银、结合支付宝,淘宝、结合Discuz! 论坛;14、加密后的视频无法用OD等破解调试工具加载;15、增加了配置保存功能,可以保存多种配置;16、增加了播放授权导入导出功能;17、增加了已授权播放密码日志记录功能;18、播放器界面做了重大美化设计,整个界面美观大方;19、增加了播放菜单功能,播放时可以右键显示功能菜单;20、可以在播放时设置显示或隐藏播放控制条;21、重大安全性升级;22、其他各种小改进
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值