数组和集合互转

数组转集合

方法一 遍历

        int[] array = new int[]{1, 2, 3, 4, 5, 6};

        List<Integer> list = new ArrayList<Integer>();
for (int i : array) {
list.add(i);
}

采用最直接的方式,代码量较大。

方法二 asList

        List<int[]> list1 = Arrays.asList(array);
List<int[]> list2 = Collections.singletonList(array);

以上两行代码完全等价,这里需要注意获得的list1和list2是阉割版的list。

以asList方法为例分析源码:

    public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);//返回的这个ArrayList并不是java.util包下的ArrayList,而是Arrays类里的内部类ArrayList
} /**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a; ArrayList(E[] array) {
a = Objects.requireNonNull(array);
} @Override
public int size() {
return a.length;
} @Override
public Object[] toArray() {
return a.clone();
} @Override
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class<? extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
} @Override
public E get(int index) {
return a[index];
} @Override
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
} @Override
public int indexOf(Object o) {
E[] a = this.a;
if (o == null) {
for (int i = 0; i < a.length; i++)
if (a[i] == null)
return i;
} else {
for (int i = 0; i < a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
} @Override
public boolean contains(Object o) {
return indexOf(o) != -1;
} @Override
public Spliterator<E> spliterator() {
return Spliterators.spliterator(a, Spliterator.ORDERED);
} @Override
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
for (E e : a) {
action.accept(e);
}
} @Override
public void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
E[] a = this.a;
for (int i = 0; i < a.length; i++) {
a[i] = operator.apply(a[i]);
}
} @Override
public void sort(Comparator<? super E> c) {
Arrays.sort(a, c);
}
}

asList方法返回的这个ArrayList并不是java.util包下的ArrayList,而是Arrays类里的内部类ArrayList。

这个内部类ArrayList集成了AbstractList,但是并没有实现全部方法,比如比较常用的add方法。

   public void add(int index, E element) {
throw new UnsupportedOperationException();
}

所以当调用add方法后,会抛出UnsupportedOperationException异常。

比较好的解决方法是采用ArrayList的构造函数。

List<int[]> list1 = new ArrayList<>(Arrays.asList(array));

所以此方式的效率较低。

方法三 steam

这里推荐第三种方式,jdk1.8后的steam类对于数组和集合的操作更具优雅,且代码量小。

        List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());

集合转数组

方法一 循环

        List<Integer> list = new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
}}; int[] array = new int[list.size()]; for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}

代码量大

方法二 toArray

正确的使用方法为

        Integer[] integers = list.toArray(new Integer[list.size()]);
Integer[] integers = list.toArray(new Integer[0]);

以上两种方法等价,当时得到的数组是包装类的数组,不推荐。

方法三 steam

这里推荐第三种,steam

        int[] array1 = list.stream().mapToInt(i -> i).toArray();
Integer[] array2 = list.stream().toArray(Integer[]::new);

基础数据类型和包装数据类型的数组都可以转,并且相对统一。

小结

推荐的转换方式

      //数组转list
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList()); //list转数组
int[] array1 = list.stream().mapToInt(i -> i).toArray();
Integer[] array2 = list.stream().toArray(Integer[]::new);

string转为Character数组

String str = "testString";

//[t, e, s, t, S, t, r, i, n, g]
Character[] charObjectArray =
str.chars().mapToObj(c -> (char)c).toArray(Character[]::new);

steam 数据转换的更多相关文章

  1. 利用Python进行数据分析(14) pandas基础: 数据转换

    数据转换指的是对数据的过滤.清理以及其他的转换操作. 移除重复数据 DataFrame里经常会出现重复行,DataFrame提供一个duplicated()方法检测各行是否重复,另一个drop_dup ...

  2. Linux下Steam中支持中文的办法

    搜索过好几个解决方案,诸如添加skin等等,在我的ARCH机器上似乎都不行然后在搜索linux steam cjk时, 发现一个链接中有解决DOTA2显示中文不正确的问题,感觉可能有用,就参考着搞定了 ...

  3. Linux C编程学习6---字符串处理、数据转换

    1.字符串 应用程序按其功能可分为数值计算.非数值计算以及输入输出操作等.非数值计算程序占相当大的比例,其核心就是字符串处理1.1.字符测试 1.1.1.测试字符是否为英文字母 int isalpha ...

  4. .NET LINQ数据转换

    使用 LINQ 进行数据转换      语言集成查询 (LINQ) 不仅可用于检索数据, 而且还是一个功能强大的数据转换工具. 通过使用 LINQ 查询,您可以将源序列用作输入,并采用多种方式修改它以 ...

  5. 【转】C#中将JSon数据转换成实体类,将实体类转换成Json

    http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...

  6. Ubuntu 16.04 Steam

    Ubuntu 16.04安装Steam,直接去Steam官网下载客户端安装包即可.

  7. LINQ之路 7:子查询、创建策略和数据转换

    在前面的系列中,我们已经讨论了LINQ简单查询的大部分特性,了解了LINQ的支持计术和语法形式.至此,我们应该可以创建出大部分相对简单的LINQ查询.在本篇中,除了对前面的知识做个简单的总结,还会介绍 ...

  8. SSIS数据转换后数值总数差异过大

    之前做过一个项目,犯了一个小错误,写出来给大家分享一下,以防大家出同样的错误. 做了一个ETL包,对货品的销售额进行数据转换,字符型 --〉 浮点型: 之后对销售额进行求和,在测试数据结果时发现与销售 ...

  9. SpringMVC 数据转换 & 数据格式化 & 数据校验

    数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 ...

随机推荐

  1. odoo13之给模块添加自定义配置项

    配置项效果图 odoo中给系统添加配置项有两种方式, 一种是使用odoo自带的设置,在设置中添加配置项:效果如下图, 第二种是在模块中自定义一个配置项管理菜单,在菜单form视图下添加配置项:效果如下 ...

  2. Android Spinner的简单用法。

    今天学到的是spinner,就是下拉列表,这可不是ExpandListView哈. 闲话不解释.这是控件,所以先上布局:就不上线性布局了,基本上可以总结出,控件都得在布局里写,写之前嵌个布局就行. & ...

  3. MySQL8.0.20安装配置+用Navicat连接详细教程(win10,Navicat15)

    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...

  4. 树莓派4B的CPU系统里查到为BCM2835而非BCM2711

    树莓派4B采用四核64位的ARM Cortex-A72架构CPU,型号为博通BCM2711 SoC.2711是个64位的四核,而2835是多年前的32位单核CPU. 查看当前芯片版本,显示为4核心,但 ...

  5. 微信小程序setData局部刷新列表

    利用setData局部刷新列表 当列表管理加载到第几页时,这个list的数据有十几条的,如果重新setData的话就要重新刷新和渲染列表, 这是个比较麻烦的事,当数据量大时,就会造成白屏, 这时就要局 ...

  6. 每日一道 LeetCode (19):合并两个有序数组

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  7. AVL树旋转

    什么是AVL树? AVL树是带有平衡条件的二叉查找树,一颗AVL树首先是二叉查收树(每个节点如果有左子树或右子树,那么左子树中数据小于该节点数据,右子树数据大于该节点数据),其次,AVL树必须满足平衡 ...

  8. Hitool打开出现failed to create the java virtual machine

    今天在安装Hitool后,打开hitool后出现了错误:failed to create the java virtual machine. 解决方法如下: 记事本打开HiTool.ini -star ...

  9. Shell编程—gawk进阶

    1使用变量 awk编程语言支持两种不同类型的变量: 内建变量 自定义变量 1.1内建变量 1. 字段和记录分隔符变量 数据字段变量允许你使用美元符号($)和字段在该记录中的位置值来引用记录对应的字段. ...

  10. 牛客网PAT练兵场-查验身份证

    题解:模拟题,直接算 题目地址:https://www.nowcoder.com/questionTerminal/779a72a420744b1d9c0ec7b7a8dd8f39 /** * *作者 ...