(Java基础) List转换为数组 & 数组转换为List

朴灿烈づ我的快乐病毒、 2023-02-23 12:10 136阅读 0赞

前言

前段时间, 一直看到Spark内的一处进行序列化的语句. 想起来之前看过Arrays的源代码. 于是, 在此总结一下.

  1. String [] array = new String[]{"a","b","c"};
  2. JavaRDD<String> javaRDDTmp = new JavaSparkContext(new SparkConf().setMaster("SEAN-YANXML")).parallellize(Array.asList(array));

在这里插入图片描述
其实. 值得注意的是Spark内的RDD都是不可变的. 所以, 这里的转换没有问题. 但是在我们日常的开发中, 转换可变的数组的时候, 是不可以这样进行转换的.


转换操作

数组Array -> List
  • 错误做法

    // Array -> List 错误示范.

    1. public static void testFromArrayToListError() {
    2. String [] array = new String[] {"A","BC","DEFE"};
    3. // 方法2 不太好 会报出异常
    4. List<String> stringList = Arrays.asList(array);
    5. // stringList.add("B");
    6. }

不可变List. 如果添加元素会报如下异常.

  1. // Exception in thread "main" java.lang.UnsupportedOperationException
  2. //at java.util.AbstractList.add(AbstractList.java:148)
  3. //at java.util.AbstractList.add(AbstractList.java:108)
  4. //at com.yanxml.util.convert.ArrayToList.testFromArrayToList(ArrayToList.java:13)
  5. //at com.yanxml.util.convert.ArrayToList.main(ArrayToList.java:24)

原因: 转变的ArrayList是Arrays的局部类. 而非我们平时使用的ArrayList.

  1. private static class ArrayList<E> extends AbstractList<E>
  2. implements RandomAccess, java.io.Serializable
  3. {
  4. private static final long serialVersionUID = -2764017481108945198L;
  5. private final E[] a;
  6. ArrayList(E[] array) {
  7. a = Objects.requireNonNull(array);
  8. }
  9. @Override
  10. public int size() {
  11. return a.length;
  12. }
  13. @Override
  14. public Object[] toArray() {
  15. return a.clone();
  16. }
  17. @Override
  18. @SuppressWarnings("unchecked")
  19. public <T> T[] toArray(T[] a) {
  20. int size = size();
  21. if (a.length < size)
  22. return Arrays.copyOf(this.a, size,
  23. (Class<? extends T[]>) a.getClass());
  24. System.arraycopy(this.a, 0, a, 0, size);
  25. if (a.length > size)
  26. a[size] = null;
  27. return a;
  28. }
  29. @Override
  30. public E get(int index) {
  31. return a[index];
  32. }
  33. @Override
  34. public E set(int index, E element) {
  35. E oldValue = a[index];
  36. a[index] = element;
  37. return oldValue;
  38. }
  39. @Override
  40. public int indexOf(Object o) {
  41. E[] a = this.a;
  42. if (o == null) {
  43. for (int i = 0; i < a.length; i++)
  44. if (a[i] == null)
  45. return i;
  46. } else {
  47. for (int i = 0; i < a.length; i++)
  48. if (o.equals(a[i]))
  49. return i;
  50. }
  51. return -1;
  52. }
  53. @Override
  54. public boolean contains(Object o) {
  55. return indexOf(o) != -1;
  56. }
  57. @Override
  58. public Spliterator<E> spliterator() {
  59. return Spliterators.spliterator(a, Spliterator.ORDERED);
  60. }
  61. @Override
  62. public void forEach(Consumer<? super E> action) {
  63. Objects.requireNonNull(action);
  64. for (E e : a) {
  65. action.accept(e);
  66. }
  67. }
  68. @Override
  69. public void replaceAll(UnaryOperator<E> operator) {
  70. Objects.requireNonNull(operator);
  71. E[] a = this.a;
  72. for (int i = 0; i < a.length; i++) {
  73. a[i] = operator.apply(a[i]);
  74. }
  75. }
  76. @Override
  77. public void sort(Comparator<? super E> c) {
  78. Arrays.sort(a, c);
  79. }
  80. }

可以看到. 其内并没有实现AbstartList内的add()方法.

  • 正确做法

    // Array -> List 正确示范

    1. public static void testFromArrayToList() {
    2. String []array = new String[] {"A","BC","DEFE"};
    3. // 正确方法1
    4. List<String> stringListA = new ArrayList<>(Arrays.asList(array));
    5. stringListA.add("OPP");
    6. // 正确方法2
    7. List<String> stringListB = new ArrayList<>(array.length);
    8. Collections.addAll(stringListB,array);
    9. // 正确方法3
    10. List<String> stringListC = new ArrayList<>(array.length);
    11. for(String str:array) {
    12. stringListC.add(str);
    13. }
    14. }

List -> Array
  • 错误做法

    // List -> String [] 错误示范

    1. public static void testFromListToArrayError() {
    2. List<String> stringList = new ArrayList<String>();
    3. stringList.add("a");
    4. stringList.add("b");
    5. String[] stringArray = (String[])stringList.toArray();
    6. }

如上写法. 会报强制转换异常. 因为 toArray()转换的是Object[]. 父类无法强制转换为子类对象的.

  1. // Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
  2. // at com.yanxml.util.convert.ArrayToList.testFromListToArray(ArrayToList.java:34)
  3. // at com.yanxml.util.convert.ArrayToList.main(ArrayToList.java:39)
  • 正确写法

    // List -> String[] 正确示范

    1. public static void testFromListToArray() {
    2. // 方法1
    3. List<String> stringList = new ArrayList<String>();
    4. stringList.add("a");
    5. stringList.add("b");
    6. String[] stringArrayA = stringList.toArray(new String[stringList.size()]);
    7. // 方法2
    8. String[] stringArrayB = new String[stringList.size()];
    9. for(int i=0;i<stringList.size();i++) {
    10. stringArrayB[i] = stringList.get(i);
    11. }
    12. }

Reference

[1]. java List和数组相互转换方法

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读