Java 集合框架

2016/01/01 Java

Java 集合框架相关的总结。

toArray() 与 toArray(T [] a) 区别

        List<String> test = new ArrayList<>();
        test.add("a");
        test.add("b");
        test.add("c");
        System.out.println(Arrays.toString(test.toArray()));

        String[] first = new String[2];
        String[] first_r = test.toArray(first);
        System.out.println("first:" + Arrays.toString(first));
        System.out.println("first_r:" + Arrays.toString(first_r));
        System.out.println("eq:" + (first == first_r));

        String[] second = new String[4];
        String[] second_r = test.toArray(second);
        System.out.println("second:" + Arrays.toString(second));
        System.out.println("second_r" + Arrays.toString(second_r));
        System.out.println("eq:" + (second == second_r));

结果:

[a, b, c]
first:[null, null]
first_r:[a, b, c]
eq:false
second:[a, b, c, null]
second_r[a, b, c, null]
eq:true
  1. toArray() 只能返回 Object[],返回的结果遍历时需要强制转换。
  2. toArray() 内部使用 toArray(new Object[0]) 实现。
  3. toArray(T[] a) 如果 a 的长度小于集合的长度则 a 中运行后都为 null, 会创建一个等于集合长度的数组, 如果 a 的长度大于等于集合的长度则集合中的元素会填充进去。

反射生成特定类型、特定长度的数组

        String[] strs = (String[]) Array
                .newInstance((new String[0]).getClass().getComponentType(), 2);//一维数组
        System.out.println(Arrays.toString(strs));

        System.out.println((new String[0]).getClass());
        System.out.println("".getClass());

输出:

[null, null]
class [Ljava.lang.String;
class java.lang.String
        String[][] strs = (String[][]) Array
                .newInstance((new String[0]).getClass().getComponentType(), 2, 3); //二维数组
Array.set(strs,1, new String[]{"1", "2","3","4"}); //反射设置值

List 接口方法

add(E e) 与 add(int index, E e)
  1. add(E e)将指定的元素添加到此列表的尾部。而
  2. add(int index,E element) 将指定的元素插入此列表中的指定位置。

ListIterator 迭代器

  1. 继承自 Iterator, 并且可以前进来获取元素
  2. 新增 set(E e) 替换 list 中迭代器最后返回的元素
  3. 新增的 add(E e), 可以插入元素到游标之后,然后游标后移一位

subList(int fromIndex, int toIndex)

  1. 返回一个列表的子列表视图,包含 fromIndex 不包含 toIndex
  2. 原list 与 sublist 做的“非结构性修改”(non-structural changes)(不涉及list大小的修改),都会影响到彼此对方
  3. 结构性修改的时候 3.1 如果发生结构性修改的是返回的子list,那么原来的list的大小也会发生变化 3.2 如果发生结构性修改的是原来的list(不包括由于返回的子list导致的改变),那么返回的子list语义上将会是undefined

注:如何删除一个list的某个区段,比如删除list的第2-5个元素?

list.subList(from, to).clear();

Search

    Table of Contents