List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println("下标0开始:"+list.listIterator(0).next());//next()
System.out.println("下标1开始:"+list.listIterator(1).next());
System.out.println("子List 1-3:"+list.subList(1,3));//子列表
ListIterator it =list.listIterator();//默认从下标0开始
//隐式光标属性add操作 ,插入到当前的下标的前面
it.add("sss");
while(it.hasNext()){
System.out.println("next Index="+it.nextIndex()+",Object="+it.next());
}
//set属性
ListIterator it1 =list.listIterator();
it1.next();
it1.set("ooo");
ListIterator it2 =list.listIterator(list.size());//下标
while(it2.hasPrevious()){
System.out.println("previous Index="+it2.previousIndex()+",Object="+it2.previous());
}
}
}
程序的执行结果为:
下标0开始:aaa
下标1开始:bbb
子List 1-3:[bbb, ccc]
next Index=1,Object=aaa
next Index=2,Object=bbb
next Index=3,Object=ccc
next Index=4,Object=ddd
previous Index=4,Object=ddd
previous Index=3,Object=ccc
previous Index=1,Object=aaa
previous Index=0,Object=ooo
我们还需要稍微再解释一下 add() 操作。添加一个元素会导致新元素立刻被添加到隐式光标的前面。因此,添加元素后调用previous() 会返回新元素,而调用 next() 则不起作用,返回添加操作之前的下一个元素。下标的显示方式,如下图所示:
对于List的基本用法我们学会了,下面我们来进一步了解一下List的实现原理,以便价升我们对于集合的理解。
3 实现原理
前面已经提了一下Collection的实现基础都是基于数组的。下面我们就已ArrayList 为例,简单分析一下ArrayList 列表的实现方式。首先,先看下它的构造函数。
下列表格是在SUN提供的API中的描述:
ArrayList() Constructs an empty list with an initial capacity of ten.
ArrayList(Collection c) Constructs a list containing the elements of the specified collection, in the order they are returned by the collection's iterator.
ArrayList(int initialCapacity) Constructs an empty list with the specified initial capacity.
其中第一个构造函数ArrayList()和第二构造函数ArrayList(Collection c) 是按照Collection 接口文档所述,所应该提供两个构造函数,一个无参数,一个接受另一个 Collection。
第3个构造函数:
ArrayList(int initialCapacity) 是ArrayList实现的比较重要的构造函数,虽然,我们不常用它,但是某认的构造函数正是调用的该带参数:initialCapacity 的构造函数来实现的。 其中参数:initialCapacity 表示我们构造的这个ArrayList列表的初始化容量是多大。如果调用默认的构造函数,则表示默认调用该参数为initialCapacity =10 的方式,来进行构建一个ArrayList列表对象。
为了更好的理解这个initialCapacity 参数的概念,我们先看看ArrayList在Sun 提供的 源码中的实现方式。先看一下它的属性有哪些:
ArrayList 继承了AbstractList 我们主要看看ArrayList中的属性就可以了。
ArrayList中主要包含2个属性:
private transient ObjectelementData[];
private int size;
其中数组::elementData[]是列表的实现核心属性:数组。 我们使用该数组来进行存放集合中的数据。而我们的初始化参数就是该数组构建时候的长度,即该数组的length属性就是initialCapacity 参数。
Keys:transient 表示被修饰的属性不是对象持久状态的一部分,不会自动的序列化。
第2个属性:size表示列表中真实数据的存放个数。
我们再来看一下ArrayList的构造函数,加深一下ArrayList是基于数组的理解。
从源码中可以看到默认的构造函数调用的就是带参数的构造函数:
publicArrayList(int initialCapacity)
不过参数initialCapacity=10 。
我们主要看ArrayList(int initialCapacity) 这个构造函数。可以看到:
this.elementData= new Object[initialCapacity];
我们就是使用的initialCapacity这个参数来创建一个Object数组。而我们所有的往该集合对象中存放的数据,就是存放到了这个Object数组中去了。
我们在看看另外一个构造函数的源码:
这里,我们先看size() 方法的实现形式。它的作用即是返回size属性值的大小。然后我们再看另外一个构造函数public ArrayList(Collection c) ,该构造函数的作用是把另外一个容器对象中的元素存放到当前的List 对象中。
可以看到,首先,我们是通过调用另外一个容器对象C 的方法size()来设置当前的List对象的size属性的长度大小。
接下来,就是对elementData 数组进行初始化,初始化的大小为