Java集合类:list补充

来源:互联网 发布:js 正则大于0的正整数 编辑:程序博客网 时间:2024/06/08 02:36

ArrayList:
不是线程安全的,建议在单线程下使用,多线程下可以使用Vector或者CopyOnWriteArrayList。
包含两个重要的对象:
elementData(Object【】类型数组),用来保存添加到ArrayList中的元素;
(elementData是个动态数组,通过构造函数 ArrayList(int initialCapacity)来执行它的初始容量为initialCapacity;如果通过不含参数的构造函数ArrayList()来创建ArrayList,则elementData的容量默认是10。elementData数组的大小会根据ArrayList容量的增长而动态的增长。)
size:一个int类型数据,保存动态数组的实际大小;
注意的点:
(01) ArrayList 实际上是通过一个数组去保存数据的。当我们构造ArrayList时;若使用默认构造函数,则ArrayList的默认容量大小是10。
(02) 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 + 1”。
(03) ArrayList的克隆函数,即是将全部元素克隆到一个数组中。
(04) ArrayList实现java.io.Serializable的方式。当写入到输出流时,先写入“容量”,再依次写入“每一个元素”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
遍历方式:
(1)Iterator迭代器
Integer value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
(2)随机,通过索引(ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素)
Integer value = null;
int size = list.size();
for (int i=0; i< size; i++) {
value = (Integer)list.get(i);
}
(3)for
Integer value = null;
for (Integer integ:list) {
value = integ;
}
其中,用索引访问最快,用迭代器最慢

ArrayList.toArray():为得到一个实际的数组
ArrayList提供两个toArray函数:
Object[] toArray()//返回一个Object数组,将它向下转型是会报错:java.lang.ClassCastException(Java不支持向下转型)
T[] toArray(T[] contents)//调用这个
eg:Integer[] newText = (Integer[])v.toArray(new Integer[0]);

LinkedList:
非线程安全;可以被当作堆栈、队列或双端队列进行操作;
既然是双向链表,那么它的顺序访问会非常高效,而随机访问效率比较低。
双向链表和索引值联系:通过一个计数索引值来实现的。例如,当我们调用get(int location)时,首先会比较“location”和“双向链表长度的1/2”;若前者大,则从链表头开始往后查找,直到location位置;否则,从链表末尾开始先前查找,直到location位置。
注意的点:
(01) LinkedList 实际上是通过双向链表去实现的。
 它包含一个非常重要的内部类:Entry。Entry是双向链表节点所对应的数据结构,它包括的属性有:当前节点所包含的值,上一个节点,下一个节点。
(02) 从LinkedList的实现方式中可以发现,它不存在LinkedList容量不足的问题。
(03) LinkedList的克隆函数,即是将全部元素克隆到一个新的LinkedList对象中。
(04) LinkedList实现java.io.Serializable。当写入到输出流时,先写入“容量”,再依次写入“每一个节点保护的值”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
(05) 由于LinkedList实现了Deque,而Deque接口定义了在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。
遍历方式:
建议不要采用随机访问的方式去遍历LinkedList,而采用逐个遍历的方式
遍历LinkedList时,使用removeFist()或removeLast()效率最高。但用它们遍历时,会删除原始数据;
若单纯只读取,而不删除,应该使用for (Integer integ:list) ;
千万不要通过随机访问去遍历LinkedList!

Vector
线程安全;矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。
Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData , elementCount, capacityIncrement。
(01) elementData 是”Object[]类型的数组”,它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长。capacityIncrement是与容量增长相关的增长系数;
(02) elementCount 是动态数组的实际大小。
(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。

Stack
Stack是继承于Vector(矢量队列)的;

原创粉丝点击