Java列表踩過的坑 其中subList是RandomAccessSubList,不是序列化的列表,不可以加入tair。 加入tair測試代碼 Java中怎樣把數組轉換為ArrayList? 方法二的方式不太好,因為 asList() 返回的列表的大小是固定的。事實上,返回的列表不是 java.ut ...
Java列表踩過的坑
其中subList是RandomAccessSubList,不是序列化的列表,不可以加入tair。
加入tair測試代碼
@Autowired private CacheManager cacheManager; @Test public void listTest() { ArrayList arrayList = new ArrayList(); arrayList.add(1); arrayList.add(2); arrayList.add(3); arrayList.add("我是字元串"); //正確 boolean dev_testkey = cacheManager.addToTair("dev_testkey", arrayList, 60 * 30); try { //報錯 ArrayList<String> list00 = (ArrayList<String>)arrayList.subList(1, 2); dev_testkey = cacheManager.addToTair("dev_testkey", list00, 60 * 30); }catch (Exception e){ System.out.println("error"); } try { //報錯 ArrayList list0 = (ArrayList)arrayList.subList(0, 1); dev_testkey = cacheManager.addToTair("dev_testkey", list0, 60 * 30); }catch (Exception e){ System.out.println("error"); } try { //報錯 List list1 = arrayList.subList(0, 1); dev_testkey = cacheManager.addToTair("dev_testkey", (ArrayList<String>)list1, 60 * 30); }catch (Exception e){ System.out.println("error"); } List list = new ArrayList(); list.add(1); list.add("我是字元串"); //正確 dev_testkey = cacheManager.addToTair("dev_testkey", arrayList, 60 * 30); String tags = "1,2,3,4,5"; List<String> tagslist = Arrays.asList(tags.split(",")); ArrayList<String> okList = new ArrayList<String>(Arrays.asList(tags.split(","))); try { //報錯 dev_testkey = cacheManager.addToTair("dev_testkey", (ArrayList<String>)tagslist, 60 * 30); }catch (Exception e){ System.out.println("error"); } //正確 dev_testkey = cacheManager.addToTair("dev_testkey", okList, 60 * 30); try { //報錯 List<String> okSubList = tagslist.subList(0, 3); dev_testkey = cacheManager.addToTair("dev_testkey", (ArrayList<String>)okSubList, 60 * 30); }catch (Exception e){ System.out.println("error"); } try { //報錯 dev_testkey = cacheManager.addToTair("dev_testkey3", (ArrayList<String>)tagslist, 60 * 30); }catch (Exception e){ System.out.println("error"); } List<String> subList = tagslist.subList(0, 3); try { //報錯 dev_testkey = cacheManager.addToTair("dev_testkey4", (ArrayList<String>)subList, 60 * 30); }catch (Exception e){ System.out.println("error"); } }
Java中怎樣把數組轉換為ArrayList?
方法1、較好 ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array)); 方法2、 List<Element> list = Arrays.asList(array); 方法3、 Element[] array = {new Element(1), new Element(2)}; List<element> list = new ArrayList<element>(array.length); Collections.addAll(list, array);
方法二的方式不太好,因為 asList() 返回的列表的大小是固定的。事實上,返回的列表不是 java.util.ArrayList ,而是定義在 java.util.Arrays 中一個私有靜態類。我們知道 ArrayList 的實現本質上是一個數組,而 asList() 返回的列表是由原始數組支持的固定大小的列表。這種情況下,如果添加或刪除列表中的元素,程式會拋出異常 UnsupportedOperationException 。
代碼示例
List<String> arrays_arrayList = Arrays.asList("王利虎","張三","李四","李四"); //是Arrays下的私有靜態類ArrayList,沒有序列化 List<String> randomAccessSubList = arrays_arrayList.subList(0, 1); //是RandomAccessSubList,沒有序列化 ArrayList list_0 = new ArrayList(); list_0.add(1); list_0.add("xxx"); List<String> arrayList_subList = list_0.subList(0, 1); //是ArrayList下的私有靜態類SubList,沒有序列化
ArrayList<String> error = (ArrayList<String>) arrays_arrayList; //出錯
徹底刪除列表中的一個元素
//想把列表裡全部的1刪除 使用removeAll ArrayList arrayList = new ArrayList(); arrayList.add(1); arrayList.add(2); arrayList.add(3); arrayList.add(1); arrayList.add(1); ArrayList arrayList2 = new ArrayList(); arrayList2.add(1); arrayList.removeAll(arrayList2);
1、ArrayList
ArrayList是大小可變列表的實現,允許任何數據加入
ArrayList arrayList = new ArrayList();
public boolean add(E e);
代碼示例
/** * arrayListTest */ public static void arrayListTest(){ ArrayList list = new ArrayList(); list.add(1);//int list.add("我是字元串"); list.add(2L);//long System.out.println("list:" + list); ArrayList list1 = new ArrayList(); list1.add(3); list1.add(0, 4); System.out.println("list1:" + list1); //將list2裡面的數據,全部放到list1指定位置的後面 list.add(2, list1); System.out.println("list:" + list); // 清空列表,刪除裡面所有的數據 list1.clear(); // 判斷列表裡是否包含某個數據 boolean found = list.contains(2l); System.out.println("found:"+found); ArrayList list2 = new ArrayList(); list2.add(1); list2.add("我是字元串"); // 判斷列表是否包含了另一個集合的所有數據 boolean containsAll = list.containsAll(list2); System.out.println("containsAll:"+containsAll); // 得到數據在列表中的位置,第一次出現 int index = list.indexOf(1); System.out.println("index:"+index); // 刪除某個位置的數據 list.remove(3); System.out.println("list:" + list); // 刪除指定對象的第一個出現的位置 // 註意,如果是整數,要區分其與remove(int)的區別 // 建議用 remove(new Integer(123)); 來刪除數據對象 list.remove(new Integer(123)); System.out.println("list:" + list); // 刪除列表裡在另一個集合里存在的數據 ArrayList list3 = new ArrayList(); list3.add(1); list3.add("我是字元串"); list.removeAll(list3); System.out.println("list:" + list); // 只保留在另一個集合里存在的數據,等於交集 ArrayList list4 = new ArrayList(); list4.add(2L); list.retainAll(list4); System.out.println("list:" + list); // 替換指定位置的數據 list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); list.add(8); list.set(0, 999); System.out.println("list:" + list); // 列表數據的數量 int size = list.size(); System.out.println("size:"+size); // 得到一個子數組,包含首碼,不包含尾碼 List subList = list.subList(2, 5); System.out.println("subList:" + subList); // 將集合轉化為數組 Object[] objs = list.toArray(); // 將集合轉化為指定格式的數組 // 比如集合里保存的都是String 可能會報錯 String[] objs2 = (String[]) list.toArray(new String[0]); // 列表的迭代器操作 // 順序嚴格按照列表的保存的順序 Iterator it = list.iterator(); // 列表的另一個迭代器 ListIterator listIT = list.listIterator(); //列表的另一個迭代器,可以指定起始位置 ListIterator listIT2 = list.listIterator(3); }
2、Vector
Vector同樣是大小可變列表的實現,與ArrayList不同的是,Vector的add相關方法是同步的。
Vector vector = new Vector();
public synchronized boolean add(E e);
代碼示例
/** * vectorTest */ public static void vectorTest(){ Vector list = new Vector(); list.add(1);//int list.add("我是字元串"); list.add(2L);//long System.out.println("list:" + list); Vector list1 = new Vector(); list1.add(3); list1.add(0, 4); System.out.println("list1:" + list1); //將list2裡面的數據,全部放到list1指定位置的後面 list.add(2, list1); System.out.println("list:" + list); // 清空列表,刪除裡面所有的數據 list1.clear(); // 判斷列表裡是否包含某個數據 boolean found = list.contains(2l); System.out.println("found:"+found); Vector list2 = new Vector(); list2.add(1); list2.add("我是字元串"); // 判斷列表是否包含了另一個集合的所有數據 boolean containsAll = list.containsAll(list2); System.out.println("containsAll:"+containsAll); // 得到數據在列表中的位置,第一次出現 int index = list.indexOf(1); System.out.println("index:"+index); // 刪除某個位置的數據 list.remove(3); System.out.println("list:" + list); // 刪除指定對象的第一個出現的位置 // 註意,如果是整數,要區分其與remove(int)的區別 // 建議用 remove(new Integer(123)); 來刪除數據對象 list.remove(new Integer(123)); System.out.println("list:" + list); // 刪除列表裡在另一個集合里存在的數據 Vector list3 = new Vector(); list3.add(1); list3.add("我是字元串"); list.removeAll(list3); System.out.println("list:" + list); // 只保留在另一個集合里存在的數據,等於交集 Vector list4 = new Vector(); list4.add(2L); list.retainAll(list4); System.out.println("list:" + list); // 替換指定位置的數據 list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); list.add(8); list.set(0, 999); System.out.println("list:" + list); // 列表數據的數量 int size = list.size(); System.out.println("size:"+size); // 得到一個子數組,包含首碼,不包含尾碼 List subList = list.subList(2, 5); System.out.println("subList:" + subList); // 將集合轉化為數組 Object[] objs = list.toArray(); // 將集合轉化為指定格式的數組 // 比如集合里保存的都是String 可能會報錯 String[] objs2 = (String[]) list.toArray(new String[0]); // 列表的迭代器操作 // 順序嚴格按照列表的保存的順序 Iterator it = list.iterator(); // 列表的另一個迭代器 ListIterator listIT = list.listIterator(); //列表的另一個迭代器,可以指定起始位置 ListIterator listIT2 = list.listIterator(3); }
3、LinkedList
實現了雙向隊列的控制,包括頭尾的操作,可用於堆棧和FIFO操作等。
LinkedList linkedList = new LinkedList();
代碼示例
/** * linkedListTest */ public static void linkedListTest(){ LinkedList list = new LinkedList(); list.add(1);//int list.add("我是字元串"); list.add(2L);//long System.out.println("list:" + list); LinkedList list1 = new LinkedList(); list1.add(3); list1.add(0, 4); System.out.println("list1:" + list1); //將list2裡面的數據,全部放到list1指定位置的後面 list.add(2, list1); System.out.println("list:" + list); // 清空列表,刪除裡面所有的數據 list1.clear(); // 判斷列表裡是否包含某個數據 boolean found = list.contains(2l); System.out.println("found:"+found); LinkedList list2 = new LinkedList(); list2.add(1); list2.add("我是字元串"); // 判斷列表是否包含了另一個集合的所有數據 boolean containsAll = list.containsAll(list2); System.out.println("containsAll:"+containsAll); // 得到數據在列表中的位置,第一次出現 int index = list.indexOf(1); System.out.println("index:"+index); // 刪除某個位置的數據 list.remove(3); System.out.println("list:" + list); // 刪除指定對象的第一個出現的位置 // 註意,如果是整數,要區分其與remove(int)的區別 // 建議用 remove(new Integer(123)); 來刪除數據對象 list.remove(new Integer(123)); System.out.println("list:" + list); // 刪除列表裡在另一個集合里存在的數據 LinkedList list3 = new LinkedList(); list3.add(1); list3.add("我是字元串"); list.removeAll(list3); System.out.println("list:" + list); // 只保留在另一個集合里存在的數據,等於交集 LinkedList list4 = new LinkedList(); list4.add(2L); list.retainAll(list4); System.out.println("list:" + list); // 替換指定位置的數據 list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); list.add(8); list.set(0, 999); System.out.println("list:" + list); // 列表數據的數量 int size = list.size(); System.out.println("size:"+size); // 得到一個子數組,包含首碼,不包含尾碼 List subList = list.subList(2, 5); System.out.println("subList:" + subList); // 將集合轉化為數組 Object[] objs = list.toArray(); // 將集合轉化為指定格式的數組 // 比如集合里保存的都是String 可能會報錯 String[] objs2 = (String[]) list.toArray(new String[0]); // 列表的迭代器操作 // 順序嚴格按照列表的保存的順序 Iterator it = list.iterator(); // 列表的另一個迭代器 ListIterator listIT = list.listIterator(); //列表的另一個迭代器,可以指定起始位置 ListIterator listIT2 = list.listIterator(3); }
4、Stack
集成自 Vector,提供了LIFO的堆棧操作方式
Stack stack = new Stack();
代碼示例
/** * stackTest */ public static void stackTest(){ Stack list = new Stack(); list.add(1);//int list.add("我是字元串"); list.add(2L);//long System.out.println("list:" + list); Stack list1 = new Stack(); list1.add(3); list1.add(0, 4); System.out.println("list1:" + list1); //將list2裡面的數據,全部放到list1指定位置的後面 list.add(2, list1); System.out.println("list:" + list); // 清空列表,刪除裡面所有的數據 list1.clear(); // 判斷列表裡是否包含某個數據 boolean found = list.contains(2l); System.out.println("found:"+found); Stack list2 = new Stack(); list2.add(1); list2.add("我是字元串"); // 判斷列表是否包含了另一個集合的所有數據 boolean containsAll = list.containsAll(list2); System.out.println("containsAll:"+containsAll); // 得到數據在列表中的位置,第一次出現 int index = list.indexOf(1); System.out.println("index:"+index); // 刪除某個位置的數據 list.remove(3); System.out.println("list:" + list); // 刪除指定對象的第一個出現的位置 // 註意,如果是整數,要區分其與remove(int)的區別 // 建議用 remove(new Integer(123)); 來刪除數據對象 list.remove(new Integer(123)); System.out.println("list:" + list); // 刪除列表裡在另一個集合里存在的數據 Stack list3 = new Stack(); list3.add(1); list3.add("我是字元串"); list.removeAll(list3); System.out.println("list:" + list); // 只保留在另一個集合里存在的數據,等於交集 Stack list4 = new Stack(); list4.add(2L); list.retainAll(list4); System.out.println("list:" + list); // 替換指定位置的數據 list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); list.add(8); list.set(0, 999); System.out.println("list:" + list); // 列表數據的數量 int size = list.size(); System.out.println("size:"+size); // 得到一個子數組,包含首碼,不包含尾碼 List subList = list.subList(2, 5); System.out.println("subList:" + subList); // 將集合轉化為數組 Object[] objs = list.toArray(); // 將集合轉化為指定格式的數組 // 比如集合里保存的都是String 可能會報錯 String[] objs2 = (String[]) list.toArray(new String[0]); // 列表的迭代器操作 // 順序嚴格按照列表的保存的順序 Iterator it = list.iterator(); // 列表的另一個迭代器 ListIterator listIT = list.listIterator(); //列表的另一個迭代器,可以指定起始位置 ListIterator listIT2 = list.listIterator(3); }