说出ArrayList,Vector, LinkedList的存储性能和特性 说出ArrayList,Vector, LinkedList的存储性能和特性 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /* * * List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack * * 讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习) * ArrayList与Vector都是基于数组实现的,这就说明ArrayList与Vector适合做遍历而不适合做频繁的插入和删除。 * vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。 * 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%. * 如过在集合中使用数据量比较大的数据,用vector有一定的优势 * LinkedList是基于链表实现的,所以它生来就是为了频繁插入与删除对象。 * * 讨论2:特殊功能 Stack是一个后进先出(LIFO)对象堆栈,而LinkedList除可以被用作堆栈外,还可以被用作队列或双端队列。 * 不同的是Stack继承自Vector,也就是说它也是基于数组实现的。 * * 讨论3:内存占用 基于数组实现的List,在动态扩展时会产生新的数组,然后把旧数组里的内容复制到新数组里, * 这会产生大量的不再被使用的对象引用变量等待系统回收。而基于链表实现的List就不会有这种问题。 * * 讨论4:同步问题 Vector与Stack生来就是同步的, * 而ArrayList与LinkedList需要使用Collections.synchronizedList(List list)方法来转换成同步List。 * 从它们的对象上返回的迭代器是快速失败的,也就是说在使用迭代器进行迭代的时候,必须使用迭代器本身的remove、add、set * 方法来添加或更改List元素,如果在迭代的同时,在其他线程中从结构上修改了List(结构上的修改是指任何添加或删除一个或多 * 个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改),快速失败迭代器会尽最大努力抛出ConcurrentModificationException。 * * 讨论5:使用策略 * 如果数据被从数据源提取,数据量不确定,该数据一经被提取后就几乎不会再添加或删除,那么应该建立一个LinkedList来保存从数据源中取出的数据,然后将 * 该LinkedList转换成ArrayList来优化遍历操作。反过来,数据量确定的数据从数据源取出可以先建立一个ArrayList来保存,根据需要如需频繁增删,就转换为LinkedList, * 如频繁遍历就不需转换。 * 转换的方法就是使用对应的List类来封装目标List对象。 * 如 ArrayList al = new ArrayList(); * LinkedList ll = new LinkedList(al); * 同理反过来也可以 LinkedList ll = new LinkedList(); * ArrayList al = new ArrayList(ll); * * 讨论6:toArray()方法 * 基于数组实现的List会直接返回一个底层数组的拷贝(使用了System.arraycopy方法),基于链表实现的List会新生成一个数组。 * * 讨论7:不可修改 通过使用Collections.unmodifiableList(List * list)来生成一个不可修改的List,试图修改返回的列表,不管是直接修改还是通过其迭代器进行修改,都将导致抛出UnsupportedOperationException。 * * 讨论8:遍历器 请尽量使用Iterator,Enumeration已不被鼓励使用。 */ arraylist vector 都是通过数组的方式存储数据,数组大小可变,允许所有的为null,但是arraylist 没有同步的方法,必须自己实现外部的同步方法,但是vector有同步的方法,所以不要自己实现同步的方法。而linkedlist使用的是双向链表的方式,按照序号索引元素,需要向前和向后遍历,但是插入只有遍历前后项就行了,所以插入数据快。 ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据块而插入数据慢.Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.而LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,但是插入数据时只需要记录前后项即可,所以插入的速度快. SSH里删除表所有数据然后执行添加 关于Eclpes的问题!!! jfreechart最新版本 1.0.12对中文乱码问题怎么解决 freemarker list生成静态网页 救急:系统集成问题 axis1.3下编写webservices的消息处理,很急 如何在一个TXT文件中去除掉重复数据 求助,处理日期 A在浏览受控网页,A如何将此网页内容传送给一个没有权限浏览该网页的用户B? 一个怪怪的问题,大家请帮我,急!!!!!!!!! 请问,如何用JAVA实现发送手机短信???? Jnative文档
*
* List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack
*
* 讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)
* ArrayList与Vector都是基于数组实现的,这就说明ArrayList与Vector适合做遍历而不适合做频繁的插入和删除。
* vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
* 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.
* 如过在集合中使用数据量比较大的数据,用vector有一定的优势
* LinkedList是基于链表实现的,所以它生来就是为了频繁插入与删除对象。
*
* 讨论2:特殊功能 Stack是一个后进先出(LIFO)对象堆栈,而LinkedList除可以被用作堆栈外,还可以被用作队列或双端队列。
* 不同的是Stack继承自Vector,也就是说它也是基于数组实现的。
*
* 讨论3:内存占用 基于数组实现的List,在动态扩展时会产生新的数组,然后把旧数组里的内容复制到新数组里,
* 这会产生大量的不再被使用的对象引用变量等待系统回收。而基于链表实现的List就不会有这种问题。
*
* 讨论4:同步问题 Vector与Stack生来就是同步的,
* 而ArrayList与LinkedList需要使用Collections.synchronizedList(List list)方法来转换成同步List。
* 从它们的对象上返回的迭代器是快速失败的,也就是说在使用迭代器进行迭代的时候,必须使用迭代器本身的remove、add、set
* 方法来添加或更改List元素,如果在迭代的同时,在其他线程中从结构上修改了List(结构上的修改是指任何添加或删除一个或多
* 个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改),快速失败迭代器会尽最大努力抛出ConcurrentModificationException。
*
* 讨论5:使用策略
* 如果数据被从数据源提取,数据量不确定,该数据一经被提取后就几乎不会再添加或删除,那么应该建立一个LinkedList来保存从数据源中取出的数据,然后将
* 该LinkedList转换成ArrayList来优化遍历操作。反过来,数据量确定的数据从数据源取出可以先建立一个ArrayList来保存,根据需要如需频繁增删,就转换为LinkedList,
* 如频繁遍历就不需转换。
* 转换的方法就是使用对应的List类来封装目标List对象。
* 如 ArrayList al = new ArrayList();
* LinkedList ll = new LinkedList(al);
* 同理反过来也可以 LinkedList ll = new LinkedList();
* ArrayList al = new ArrayList(ll);
*
* 讨论6:toArray()方法
* 基于数组实现的List会直接返回一个底层数组的拷贝(使用了System.arraycopy方法),基于链表实现的List会新生成一个数组。
*
* 讨论7:不可修改 通过使用Collections.unmodifiableList(List
* list)来生成一个不可修改的List,试图修改返回的列表,不管是直接修改还是通过其迭代器进行修改,都将导致抛出UnsupportedOperationException。
*
* 讨论8:遍历器 请尽量使用Iterator,Enumeration已不被鼓励使用。
*/
而linkedlist使用的是双向链表的方式,按照序号索引元素,需要向前和向后遍历,但是插入只有遍历前后项就行了,所以插入数据快。