首页 > 其他分享 >ArrayList、LinkedList和Vector

ArrayList、LinkedList和Vector

时间:2023-05-12 18:57:50浏览次数:39  
标签:return LinkedList ArrayList next Vector null

ArrayList、 LinkedList 和 Vector都实现了List接口,是List的三种实现。
ArrayList底层是用动态数组实现的。

默认大小10

private static final int DEFAULT_CAPACITY = 10;

当集合中的元素数量大于集合大小时会根据集合大小扩容50%,既:第一次扩容5到15,第二次扩容7到22,第三次扩容11到33,以此类推……

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);
    }

LinkedList底层是通过双向链表实现的。所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。
所以,LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。

同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。

public boolean offer(E e) {
        return add(e);
    }
public boolean offerFirst(E e) {
        addFirst(e);
        return true;
    }
public boolean offerLast(E e) {
        addLast(e);
        return true;
    }
public E peek() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
    }
public E poll() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }
private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; // help GC
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }

Vector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。
如果你的程序不涉及到线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用synchronized,必然会影响效率)。

二者之间还有一个区别,就是扩容策略不一样。在List被第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

标签:return,LinkedList,ArrayList,next,Vector,null
From: https://www.cnblogs.com/qingyuan65389/p/17396041.html

相关文章

  • 每日打卡一道用vector写的题
    编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。现给定所有队员的比赛成绩,请你编写程序找出冠军队。输入格式:输入第一行给出一个正整数 N(≤104),即所有参赛队员总数。随后 N 行,每行给出一位队员的成绩,格式为......
  • 一道硬用vector写的题,增强记忆
    输入格式:输入在第一行给出不超过 105 的正整数N,随后N行,每行给出一位校友的身份证号(18位由数字和大写字母X组成的字符串)。题目保证身份证号不重复。随后给出前来参加校庆的所有人士的信息:首先是一个不超过 105 的正整数M,随后M行,每行给出一位人士的身份证号。题目保......
  • vector容器(下)
    五、vector的插入和删除1、功能描述:对vector容器进行插入、删除操作;2、函数原型:(1)push_back(ele);//尾部插入元素ele(2)pop_back(ele); //删除最后一个元素(3)insert(const_iteratorops,ele);//迭代器指向位置pos插入元素ele(4)insert(const_iteratorpos,intcount,ele);//迭代器指向位置......
  • 每日打卡c++中vector容器使用
    首先头文件#include<vector>for_each一种算法需要头文件#include<algorithm>标准算法头文件vector<int>::iterator迭代器,可以当指针用。基本格式vector<数据类型>名称;数据类型可以是类。例子#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;cla......
  • 删除 vector 中引用指向的元素,会有什么结果?
    #include<iostream>#include<vector>intmain(){std::vector<int>arr={1,2,3};constint&a=arr[0];std::cout<<a<<'\n';arr.erase(arr.begin());std::cout<<a<<�......
  • LinkedList底层结构和源码
    LinkedList底层结构和源码LinkedList的全面说明LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复,包括null)线程不安全,没有实现同步LinkedList的底层操作机制LinkedList底层维护了一个双向链表LinkedList中维护了两个属性first和last分别......
  • ArrayList底层结构和源码分析
    ArrayList底层结构和源码分析ArrayList的底层操作机制源码分析ArrayList中维护了一个Object类型的数组elementDatatransientObiect[]elementData;//transient是瞬间短暂的,表示被它修饰的属性不被序列化当创建ArrayList对象是,如果使用的是无参构造器,那么初始elementD......
  • JAVA中ArrayList集合详解
    JAVA中ArrayList集合详解创建集合的对象:ArrayList<String>list=newArrayList<>();<>中的是泛型,用来限定集合中储存数据类型 方法名说明booleanadd(Ee)添加元素,返回值表示是否添加成功booleanremove(Ee)删除指定元素,返回值表示是否删除成功Eremo......
  • C++容器(vector、deque、list、map)
    (1)vector:将元素置于一个动态数组中,可以随机存储元素(也就是用索引直接存取)。数组尾部添加或删除元素非常迅速。但在中部或头部就比较费时。*代码演示:*取:at在下标越界时会抛出异常,我们能捕获异常进行处理;而[]下标越界会让程序直接终止;构造函数:cbegin,cend,crbegin,cren......
  • C++用return{}来返回空的Vector数组
    本人在刷Leecode题目的时候发现以下代码classSolution{public:std::unordered_map<int,int>map;for(inti=0;i<nums.size();i++){//遍历当前元素,并在map中寻找是否有匹配的keyautoiter=map.find(target-nums[i]......