JAVA 中静态数组与动态数组特点分析
其实在很多的时候,静态数组根本不能满足我们编程的实际需要,比方说我需要在程序
运行过程中动态的向数组中添加数 据,这时我们的静态数组大小是固定的,显然就不能
添加数据,要动态添加数据必须要用到动态数组,动态数组中的各个元素类型也是一致
—
的,不过这种类型已经是 用一个非常大的类型来揽括 Object 类型。
Object 类是 JAVA.LANG 包中的顶层超类。所有的类型都可以与 Object
类 型兼容,所
以我们可以将任何 Object 类型添加至属于 Object 类型的数组中,能添加 Object 类型的的
集合有 ArrayList、Vector
及 LinkedList,它们对数据的存放形式仿造于数组,属于集合类,
下面是他们的特点:
特点一、容量扩充性
从内部实现机制来讲 ArrayList 和 Vector 都是使用 Objec 的数组形式来
的。 当你
向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需
要扩展内部数组的长度,Vector
缺省情况下自动增长原来一倍的数 组长度,ArrayList 是
原来的 50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果
你要在集合中保存大量的数据那么使用 Vector 有一些优势,因为你可以通过设置集合的
初始化大小来避免不必要的资源开销。
特点二、同步性
ArrayList,LinkedList 是不同步的,而 Vestor 是的。所以如果要求线程
§的话,可以
使用 ArrayList 或 LinkedList,可以节省为同步而耗费开销。但在多线程的情况下,有时候
就不得不使用 Vector 了。当然,也可以通过一些办法包装 ArrayList,LinkedList,使他们也
达到同步,但效率可能会有所降低。
特点三、数据操作效率
ArrayList 和 Vector 中,从指定的位置(用 index)检索一个对象,或在集合的末尾插入、
删除一个对象的时间是一样的,可表示为 O(1)。但是,如果在集合的其他位置增加或移
除元素那么花费的时间会呈线形增长:O(n-i),其中 n 代表集合中元素的个数,i 代表元
素增加或移除元素 的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第 i
和第 i 个元素之后的所有元素都要执行(n-i)个对象的位移操作。
LinkedList
—
中,在插入、删除集合中任何位置的元素所花费的时间都是一样的
O(1),但它在索引一个元素的时候比较慢,为 O(i),其中 i 是索引的位置。
所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用
Vector 或 ArrayList 都可以。如果是对其它指定位置的插入、删除操作,最好选择 LinkedList
ArrayList 和 Vector 是采用数组方式存储数据,此数组元素数大于实际存储的数据以
便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等
操 作,所以索引数据快插入数据慢,Vector 由于使用了 synchronized 方法(线程安
全)所以性能上比 ArrayList
要 差,LinkedList 使用双向链表实现存储,按序号索引数据需
要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度
较快。