[Java學習] 原來Java中有兩個ArrayList
首先給出一段程式碼:
- public class AslistMethod {
- public static void main(String[] args) {
- String sentence = "i love you";
- List<String> words = Arrays.asList(sentence.split(" "));
- for (int i = 0; i < words.size(); ) {
- if (words.get(i).equals("love")) {
- words.remove(i);
- continue;
- }
- i++;
- }http://m.ynmxzx.com/yb/201606211038.html
- System.out.println(words);
- }
- http://m.ynmxzx.com/yb/201606211039.html
然後,執行這段程式碼,最後,報錯了:
- Exception in thread "main" java.lang.UnsupportedOperationException
- at java.util.AbstractList.remove(AbstractList.java:161)
- at list.AslistMethod.main(AslistMethod.java:12)
錯誤鏈的棧底list.AslistMethod.main(AslistMethod.java:12)說的是這一行程式碼:
- words.remove(i);
這個錯誤讓我很迷茫,因為我寫這段程式碼前大概看了一下,Arrays.asList方法返回的是一個ArrayList,咋就不能remove了呢?接下來,由於一個小小的失誤,把Arrays.asList的結果賦給了java.util.ArrayList,居然賦值不成功,我立馬有種瞎貓碰上死耗子的感覺。然後,就順著Arrays.asList方法一直點下去,發現此ArrayList非彼ArrayList。Arrays.asList返回的是java.util.Arrays.ArrayList,它只是Arrays的一個內部類。它的程式碼不長,這裡直接貼出來:
- private static class ArrayList<E> extends AbstractList<E>
- implements RandomAccess, java.io.Serializable
- {http://m.ynmxzx.com/yb/201606211040.html
- 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();
- }
- http://m.ynmxzx.com/yb/201606211041.html
- @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;
- }
- http://m.ynmxzx.com/yb/201606211042.html
- @Override
- public int indexOf(Object o) {
- 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);
- }
- }
從原始碼看到,它繼承自AbstractList,並且沒有remove方法,我找到AbstractList的remove方法:
- public E remove(int index) {
- throw new UnsupportedOperationException();
- }m.ynmxzx.com
這就是錯誤資訊的來源。最終知道,Arrays.asList返回的ArrayList並不支援remove,實際上,java.util.Arrays.ArrayList不支援任何形式的元素刪除。
總結一下,這次問題的解決確實有點兒瞎貓碰到死耗子的味道,但是,只要我認真看一下報的錯誤:
- at java.util.AbstractList.remove(AbstractList.java:161)
相關推薦
[Java學習] 原來Java中有兩個ArrayList
首先給出一段程式碼: 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
一個form中有兩個submit
<!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