Java集合框架使用注意事项(一, List)

List的有用实现

1.ArrayList

2.LinkedList

3.Vector

4.Stack

讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)

ArrayList与Vector都是基于数组实现的,这就说明ArrayList与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已不被鼓励使用。

最后,请参考java.util.Collections类,该类提供了很多有用的操纵集合对象的方法。

时间: 2024-11-02 06:19:08

Java集合框架使用注意事项(一, List)的相关文章

Java集合框架使用注意事项(二,Map)

Map接口常用的实现类有: 1.HashMap 2.Hashtable 3.TreeMap 4.LinkedHashMap 讨论1:底层机制 HashMap与Hashtable基于数组实现,TreeMap基于树型结构,底层存储结构是典型的链表结构.LinkedHashMap继承自HashMap,所以也是基于数组实现的. 讨论2:继承关系 HashMap与TreeMap继承自AbstractMap,Hashtable继承自Dictionary,LinkedHashMap继承自HashMap. 讨论

java集合框架中List的定义及注意事项

大家知道,集合框架是为了表示和操作集合而规定的一种统一的标准的体系结构,学习集合知识有利于我们解决一系列例如保存数据与对象的问题. 常用的集合在系统中定义了两大接口,List和Set 这里我们就来讨论一下List 的定义以及一些常见的问题 List定义的是有序的并且数据可以重复的集合,我们先看一下下面这段代码: import java.util.ArrayList; import java.util.List; publicclass ListTest{ publicstaticvoid mai

Java集合源码剖析:Java集合框架

Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的整体框架如下: 从上图中可以看出,集合类主要分为两大类:Collection和Map. Collection是List.Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主

JAVA集合框架之List接口实现类

上一篇博客<JAVA集合框架之Set接口实现类>中介绍了Set接口的相关实现类,这一篇将介绍List接口的实现类. java.util.ArrayList< E > ArrayList有点类似于数组,相比较于数组而言,ArrayList可以动态的更改元素个数,相对于数组较为灵活. 每个 ArrayList 实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小.随着向 ArrayList 中不断添加元素,其容量也自动增长.并未指定增长策略的细节,因为这不

java | 集合框架

集合框架 集合代表了一组对象,Java中的集合框架定义了一套规范,用来表示.操作集合,使具体操作与实现细节解耦. 而这些操作无非就是增.删.改.查! 集合和数组的区别: 1.数组的长度固定,集合长度可变. 2.数组只能存储相同类型的数据(基本类型/引用类型),集合可存储各种类型的数据. Java集合框架接口 Java集合框架的顶层接口包括: 一.Collection接口: 1.实现Collection接口的集合有List.Set.Queue(Java队列实现). 2.List:排列有序,可以有重

[Java] 集合框架的层次结构和使用规则梳理

在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework). Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率. 概述 什么是框架?  类库的集合 什么是集合? 存放数据的容器 集合框架用来干什么? 用来表示和操作的统一的架构 集合框架包含了两部分:一

java基础-学到java集合框架中对那个复写equals的疑问,求解答

问题描述 学到java集合框架中对那个复写equals的疑问,求解答 import java.util.*; class Student implements Comparable { private String name; private int age; Student(String name,int age) { this.name = name; this.age = age; } public int compareTo(Student s) { int num = new Inte

Java集合框架学习总结

<Java集合框架学习总结> 以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介绍每个集合类的用途和特点,然后通过比较相关集合类的不同特点来让我们更深入的了解它们.   Collection接口 1.Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements). 2.所有实现Collection接口的类都必须提供两个标准的构造函数:1.无参数的构造函数用于创建一个空的Collection,2.Collection

数据结构-java集合框架里说的堆栈和内存存储里说的堆栈两个堆栈是一个概念么

问题描述 java集合框架里说的堆栈和内存存储里说的堆栈两个堆栈是一个概念么 最近在看java集合框架,有列表啊,散列,堆栈等概念.感觉这是以数组,java代码为基础的处理数据集合的容器.但是之前经常 看到说内存就是种堆和栈,而内存这块是jvm帮我们处理的,也就是说不是java代码关心的内容.而且还有篇博客说了内存的控制 是由汇编实现的,然后将一段C++代码编程成汇编,汇编指令实际是按堆栈模式工作的. 本人有点疑惑,感觉数据结构里的堆栈和内存中的堆栈的实现不是一回事啊,想问下两者是不同的层面上的