*
*
* 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已不被鼓励使用。
*/
分享到:
相关推荐
List接口有多个实现类,包括ArrayList、LinkedList、Vector和Stack。 1. ArrayList实现类: ArrayList是List接口的一个常见实现,其内部基于动态数组实现。它提供了快速的随机访问,因为数组索引可以直接定位元素。...
- **LinkedList类与List接口**:LinkedList类实现了List接口,可以通过`addFirst()`和`removeFirst()`方法实现栈操作。但相比于ArrayDeque,LinkedList在进行栈操作时效率较低。 ```java LinkedList<Integer> ...
在Java编程语言中,集合框架是处理对象组织和操作的...在多线程环境中,线程安全的实现如Vector和Hashtable是必要的,但在单线程或性能要求较高的情况下,非线程安全的实现如ArrayList、LinkedList和HashMap通常更优。
这部分内容主要聚焦于第11章的“Java集合框架和泛型机制”,特别关注List接口及其几种实现类,包括`ArrayList`、`LinkedList`、`Vector`以及`Stack`。 ### 11-4 List接口实现类 #### 11.4.1 实现类ArrayList - **...
让Stack 来做List 的事可以,不过语义上Stack 不应该做过多的List 的事情; 7.在排序中,ArrayList 具有最好的性能,TreeList 平均性能也不错,LinkedList 的排序效率受元素初始状态的影响很大。 8.各种List 间...
java8 源码 List相关实现类的源码解析(JDK1.8) ...通过modCount的值来判断是否多线程同时操作,modCount用来记录List修改的次数:每修改一次(添加/删除等操作),将modCount+1 LinkedList 继承关系: LinkedLis
4. Stack:实现了Stack接口,是List的一个子接口,提供了后进先出(LIFO)的数据结构,常用于堆栈操作。 5. CopyOnWriteArrayList:线程安全的ArrayList替代品,适用于读多写少的情况,写操作时会复制原数组,性能较...
4. **Stack**:继承自`Vector`,实现了一个后进先出(LIFO)的数据结构。 ### List的基本操作 #### 1. 创建List ```java // 创建ArrayList实例 List<String> list = new ArrayList(); // 创建LinkedList实例 ...
4. **Vector和Stack**:Vector线程安全,但效率较低,与ArrayList类似。Stack是Vector的一个子类,实现后进先出(LIFO)的数据结构,用于模拟栈操作。 5. **ArrayList与LinkedList的选择**:在需要快速访问元素或...
### Java中的集合总结一 #### 1....以上是关于 `ArrayList`、`LinkedList`、`Vector`、`Stack` 和 `HashMap` 的简要介绍和关键特性。理解这些集合类的特性和用法对于Java程序员来说是非常重要的。
5. List 接口的实现类主要有:ArrayList、LinkedList、Stack 等。 List、Set、Map 三者的区别 1. List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个 null 元素,元素都有...
3. **栈(Stack)**:栈是一种后进先出(LIFO)的数据结构,Java.util.Stack类继承自Vector类,提供了push、pop等方法进行操作。 4. **队列(Queue)**:队列是一种先进先出(FIFO)的数据结构。Java.util.Queue...
List的实现类有ArrayList、LinkedList、Vector等,它们提供了位置访问方法,可以通过索引快速访问元素。 4. Map接口:代表了一个键值对的映射关系,其中键是唯一的。Map的实现类有HashMap、TreeMap、Hashtable等,...
ArrayList、LinkedList、Vector和Stack是实现了List接口的四种常见类: 1. ArrayList:基于动态数组实现,访问速度快,插入和删除元素时效率较低,因为可能需要移动大量元素。 2. LinkedList:基于双向链表实现,...
除了ArrayList和LinkedList,还有一些其他的List实现,例如: - **LinkedList**:适用于需要频繁插入和删除元素的场景。 - **Vector**:线程安全的ArrayList替代品,但性能较差,现在很少使用。 - **Stack**:...
List 的实现类有 ArrayList、LinkedList、Stack 和 Vector。ArrayList 是基于动态数组实现的,适合随机访问,而 LinkedList 更适合于频繁的插入和删除操作;Stack 类实现了后进先出(LIFO)的堆栈操作;Vector 类与 ...