当前位置:   article > 正文

Arrays.asList()不能使用add和remove方法的原因_arrays.aslist 不能add

arrays.aslist 不能add

今天无意中测试了一下数组转集合的jdk封装好的工具类Arrays,意外发生了。。。

代码如下:

  1. public static void main(String[] args) {
  2. Integer[] i = {128,12,1};
  3. List<Integer> list = Arrays.asList(i);
  4. list.add(123);
  5. System.out.println(list);
  6. }

运行结果:

  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 test.demo.Test.main(Test.java:10)

让我们一起走进源码查看情况

首先查看Arrays的asList方法实现

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

这明明是创建的ArrayList对象啊,没什么不一样啊。鼠标放上去你会发现显示java.util Arrays.ArrayList 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. }

只实现了这些方法,根本就没有add和remove方法

但是ArrayList继承了AbstractList类,让我们看看他的add和remove方法是怎么写的吧。

  1. public void add(int index, E element) {
  2. throw new UnsupportedOperationException();
  3. }
  4. public E remove(int index) {
  5. throw new UnsupportedOperationException();
  6. }

知道了吧,这就是Arrays.asList为什么不能进行add和remove操作了。

但是就是想使用add和remove操作,我们可以先把这个集合放到java.util.ArrayList中在操作哦OvO

List list = new ArrayList(Arrays.asList(arr));

?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/982233
推荐阅读
  

闽ICP备14008679号