数组和集合互转

数组转集合

方法一 遍历

        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);

最新文章

  1. Eclipse使用Git教程
  2. 【算法杂谈】Miller-Rabin素性测试算法
  3. jquery 中post 、get的同步问题
  4. 【WP8.1开发】选择与搜索联系人
  5. PHPUnit单元测试中类protected/private方法测试
  6. NYOJ题目11613n+1问题
  7. Activity not started, its current task has been brought to the front
  8. 查询各个商品分类中各有多少商品的SQL语句
  9. Eclipse中安装可以新建html文件的插件(Eclipse HTML Editor)
  10. linux shell “(())” 双括号运算符使用
  11. 手动修改VisualStudio IISExpress的配置
  12. 基于I2C EPPRPM(AT24C02B) + LCD12864实验
  13. Uncle Tom&#39;s Inherited Land*
  14. iOS 工程默认只允许竖屏,在单独界面进行横竖转换,屏幕旋转
  15. [SCOI2008]斜堆
  16. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
  17. Let&#39;sEncrypt 免费通配符/泛域名SSL证书添加使用教程
  18. Struts2多文件上传原理和示例
  19. js obj对象转formdata格式代码
  20. 在现实面前,IT从业者的无奈

热门文章

  1. 19-关键字package和import
  2. 一文搞定Python正则表达式
  3. JS笔记 数据类型分类以及转换
  4. 2020-07-22:你觉得使用redis的主从复制的时候有什么点需要注意的吗?
  5. C#LeetCode刷题之#671-二叉树中第二小的节点(Second Minimum Node In a Binary Tree)
  6. C#LeetCode刷题之#231-2的幂(Power of Two)
  7. C#LeetCode刷题之#121-买卖股票的最佳时机(Best Time to Buy and Sell Stock)
  8. 用前端姿势玩docker【五】快速构建中类Unix系统与Windows系统的差异化处理
  9. js获取当前地址信息
  10. Vue在v-for中给css传递一个数组参数