1. 程式人生 > >[Java學習] 原來Java中有兩個ArrayList

[Java學習] 原來Java中有兩個ArrayList

首先給出一段程式碼:

  1. public class AslistMethod {
  2. public static void main(String[] args) {
  3. String sentence = "i love you";
  4. List<String> words = Arrays.asList(sentence.split(" "));
  5. for (int i = 0; i < words.size(); ) {
  6. if (words.get(i).equals("love")) {
  7. words.remove(i);
  8. continue;
  9. }
  10. i++;
  11. }http://m.ynmxzx.com/yb/201606211038.html
  12. System.out.println(words);
  13. }
  14. http://m.ynmxzx.com/yb/201606211039.html
複製程式碼

然後,執行這段程式碼,最後,報錯了:

  1. Exception in thread "main" java.lang.UnsupportedOperationException
  2. at java.util.AbstractList.remove(AbstractList.java:161)
  3. at list.AslistMethod.main(AslistMethod.java:12)
複製程式碼

錯誤鏈的棧底list.AslistMethod.main(AslistMethod.java:12)說的是這一行程式碼:

  1. words.remove(i);
複製程式碼

這個錯誤讓我很迷茫,因為我寫這段程式碼前大概看了一下,Arrays.asList方法返回的是一個ArrayList,咋就不能remove了呢?接下來,由於一個小小的失誤,把Arrays.asList的結果賦給了java.util.ArrayList,居然賦值不成功,我立馬有種瞎貓碰上死耗子的感覺。然後,就順著Arrays.asList方法一直點下去,發現此ArrayList非彼ArrayList。Arrays.asList返回的是java.util.Arrays.ArrayList,它只是Arrays的一個內部類。它的程式碼不長,這裡直接貼出來:

  1. private static class ArrayList<E> extends AbstractList<E>
  2. implements RandomAccess, java.io.Serializable
  3. {http://m.ynmxzx.com/yb/201606211040.html
  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. http://m.ynmxzx.com/yb/201606211041.html
  18. @Override
  19. @SuppressWarnings("unchecked")
  20. public <T> T[] toArray(T[] a) {
  21. int size = size();
  22. if (a.length < size)
  23. return Arrays.copyOf(this.a, size,
  24. (Class<? extends T[]>) a.getClass());
  25. System.arraycopy(this.a, 0, a, 0, size);
  26. if (a.length > size)
  27. a[size] = null;
  28. return a;
  29. }
  30. @Override
  31. public E get(int index) {
  32. return a[index];
  33. }
  34. @Override
  35. public E set(int index, E element) {
  36. E oldValue = a[index];
  37. a[index] = element;
  38. return oldValue;
  39. }
  40. http://m.ynmxzx.com/yb/201606211042.html
  41. @Override
  42. public int indexOf(Object o) {
  43. if (o==null) {
  44. for (int i=0; i<a.length; i++)
  45. if (a[i]==null)
  46. return i;
  47. } else {
  48. for (int i=0; i<a.length; i++)
  49. if (o.equals(a[i]))
  50. return i;
  51. }
  52. return -1;
  53. }
  54. @Override
  55. public boolean contains(Object o) {
  56. return indexOf(o) != -1;
  57. }
  58. @Override
  59. public Spliterator<E> spliterator() {
  60. return Spliterators.spliterator(a, Spliterator.ORDERED);
  61. }
  62. }
複製程式碼

從原始碼看到,它繼承自AbstractList,並且沒有remove方法,我找到AbstractList的remove方法:

  1. public E remove(int index) {
  2. throw new UnsupportedOperationException();
  3. }m.ynmxzx.com
複製程式碼

這就是錯誤資訊的來源。最終知道,Arrays.asList返回的ArrayList並不支援remove,實際上,java.util.Arrays.ArrayList不支援任何形式的元素刪除。 
總結一下,這次問題的解決確實有點兒瞎貓碰到死耗子的味道,但是,只要我認真看一下報的錯誤:

  1. at java.util.AbstractList.remove(AbstractList.java:161)

相關推薦

[Java學習] 原來JavaArrayList

首先給出一段程式碼: public class AslistMethod { public static void main(String[] args) { String sentence = "i love you"; List<String> wo

Java學習篇之怎樣比較字串

1,在程式設計中,通常比較兩個字串是否相同的表示式是“==”,但在java中不能這麼寫。在java中,用的是equals(); 例:A字串和B和字串比較: if(A.equals(B)){ } 返回true 或false. String 的equals 方法用於比較

Java學習筆記12:交換變數

public class TestPassByValue { public static void main(String[] args) { int num1 = 1; int num2 = 2; System.out.println("交換前 num1 的值為

Java 多執行緒執行緒交替執行,一個輸出偶數,一個輸出奇數(方法二)

package com.up366.thread.example; import java.util.concurrent.Semaphore; /** * Java 多執行緒中。兩個執行緒交替執

Java 多執行緒執行緒交替執行,一個輸出偶數,一個輸出奇數(方法一)

public class DigitPrinterExample { public static void main(String[] args) { Number num =

解決ubuntu alt+tab切換窗口

自帶 gin man tab 提示 取消 code onf ubunt 癥狀,就是在alt+tab的時候,出現了兩個切換器.前面的切換器是帶預覽的.後面的那個切換器是系統自帶的. 安裝Compiz sudo apt-get install compiz-plugins su

陣列出現一次的數字,其他數字都出現次,找出這數字

public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int length=array.length; if(length==2){

從主檔案讀取n個子資料夾的圖片(每一子檔案資料夾,每檔案18張圖片)

tic clc; clear all; close all; str = 'F:\shijie-test\test-finger\'; pt = dir(str); foldname = []; k = 0; for i = 1 : length(pt)     ifstr

一個formsubmit

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

一個工程src資料夾

  在Eclipse中import一個工程後,在Eclipse中可以看到有兩個src資料夾,但是該工程在本地資料夾中只有一個src資料夾,這是哪個設定出了問題,還是什麼其他的原因呢,求指導!!!!!!!!

HttpClient在使用超時時間 區別

HttpClient在使用中有兩個超時時間。  一、連線超時:connectionTimeout     1.指的是連線一個url的連線等待時間。     2.設定方法為:  HttpClient client = new HttpClient();   HttpMetho

Mybatis延遲載入標籤支援延遲載入

1 延遲載入延遲載入也叫做懶載入lazy按需要進行載入,是優化查詢速度的方法Mybatis中有兩個標籤支援延遲載入<association><collection>操作步驟:1. 開啟延遲載入開關,關閉積極載入開關核心配置檔案sqlMapconfig.

一個整數陣列元素只出現一次,其他所有元素均出現次。 找出只出現一次的那元素。(java實現)

一個整數陣列中,有兩個元素只出現一次,其他所有元素均出現兩次。 找出只出現一次的那兩個元素。 思路大概是這樣的:因為除了這兩個只出現一次的數字外,其餘都是成對出現的,有一種運算子,異或運算,兩個相同的數字異或之後為0,所以將陣列中所有的數字依次異或,結果就是這個兩個支出現一

java如何知道一個字符串多少字,把每個字打印出來,舉例

有一個 url ont chapter 書籍 whole mar strong posit (視頻下載) (全部書籍) 9.6 About string,"I am a teacher",這個字符串中有多少個字,且分別把每個字打印出來。 /*本題的思路就是,當我有

Java判斷一句英文多少以p開頭的單詞

package Pak01; public class TestString { public static void main(String[] args) {      String s="peter piper picked a peck of pickled p

編寫一個Java應用程式,當用戶在輸入對話方塊輸入日期後(日期格式為YYYYMMDD,如1999年1月12日應輸入為19990112),程式將判斷日期的先後順序,以及日期之間的間隔天數(例

編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD, 如1999年1月12日應輸入為19990112), 程式將判斷兩個日期的先後順序, 以及兩個日期之間的間隔天數(例如1999年1月1日和1999年1月2日之間的間隔是1天。  

java比較double型別值的大小

非整型數,運算由於精度問題,可能會有誤差,建議使用BigDecimal型別,具體 BigDecimal的詳細說明參考jdk開發幫助文件。 import java.math.BigDecimal; public class DoubleCompare { public String co

java獲取字串字元(串)包含的所有資料

1、程式碼     /**      * 描述:獲取字串中被兩個字元(串)包含的所有資料      * @param str 處理字串      * @param start 起始字元(串)      * @param end 結束字元(串)      * @param i

JAVA對比:Comparable & compareTo & Comparator & compare

JAVA中的兩個對比:Comparable & compareTo & Comparator & compare java中的對比相關的幾個介面長的還都挺像,搞不好就容易搞忘了是哪個了。所以抽出時間來看看他的原始碼,梳理梳理這2個介面,一方面是個總結,同時也方便記

記錄一個演算法題(java程式碼):統計正整數n的二進位制寫法多少1

package ludims.main; import java.util.Scanner; public class myMain {     public static void main(String[] args) {         System.out.pri