List类的使用
来源:互联网 发布:淘宝迟迟不发货怎么办 编辑:程序博客网 时间:2024/06/06 06:46
我们常用的List分为以下三种:ArrayList、LinkedList、Vector。今天,我们就来从源码角度分析以下这三种List:
一、ArrayList、LinkedList、Vector的异同与使用场景
一般来说,ArrayList与Vector都是使用数组来存储,LinkedList是使用双向链表进行存储,所以,ArrayList和Vector查找元素比较快,因为数组可以直接根据位置进行定位,而双向链表还需要根据链表头或者链表尾进行遍历查询。而在插入元素时,一般来说LinkedList比较快,因为双向链表只需要找到插入位置的前一个元素,然后进行插入即可(当然需要更改后一个元素的前驱),而因为数组是确定大小的,在尾部添加元素时,ArrayList与Vector都需要确认一下数组是否充足,如果不充足,还需要将数组进行扩大,再将原先的元素重新copy进去,而在中间插入元素时,ArrayList与Vector,ArrayList与Vector也需要确认一下数组是否充足,然后将插入位置的元素整体后移,所以一般来说,在插入元素时,LinkedList更快一些。
二、ArrayList、Vector源码分析与比较
比如add方法:
ArrayList:
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true;}
Vector:
public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true;}
可以看到,ArrayList与Vector差别不大,不过Vector的add方法是线程安全的。
另外,在增加数组大小的grow()方法中
ArrayList:
private void grow(int minCapacity) {// overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity);}
Vector:
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity);}
可以看到 ArrayList 一般是增加自己的一半,而Vector是增加自己的一倍。
阅读全文
0 0
- List类的使用
- java集合类List的使用
- List集合类方法的使用
- C++List模板类的使用
- List box的使用
- list的使用
- 有关List的使用
- list control的使用
- STL list的使用
- stl list的使用
- std::list的使用
- List<T>的使用
- List的简单使用
- List的简单使用
- List的使用示例
- List排序的使用
- List排序的使用
- java List的使用
- 消砖块(一) JAVA 算法伪代码(草稿):
- js获取table下的tr和td,并且设置某个td里的文字样式
- eclipse junit 问题:"method initializationerror not found"
- CSS成功使用中文注释的方法
- Centos配置国内yum源
- List类的使用
- 单例
- 直播技术知识结构图
- 中国移动苏州研发中心前端笔试(1)
- java仿写ArrayList
- KMP模板题汇总(更新中。。。)
- Python 常见错误(雷区)
- Android中shape的使用
- 【linux 学习】创建快捷方式(linux mint)