List,Vector,Hash集合浅谈

List集合浅谈
存放元素:有序
线程是否安全:不安全
数据结构:基于数组实现 类型object类型
get方法(index)
默认初始容量为10, 扩容是1.5倍
扩容源码分析:

   private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        // overflow-conscious code
        // 判断是否需要扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    扩容底层使用Arrays.copyOf方法

remove 方法:
arraylist集合删除 是否需要考虑缩容 问题 需要缩容的问题
基于元素内容删除时间复杂度就是为o(n)
源码分析:

     private void fastRemove(int index) {
        modCount++;
        16-10-1 =5
        //计算删除index 后面所有元素有多少个
        int numMoved = size - index - 1;
        if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,numMoved);
        elementData[--size] = null; // clear to let GC do its work
    }
      modCount++;  //多线程的情况下 A线程在遍历数据 B线程在继续存放数据

List集合时间复杂度
o(1):只需要通过查询一次就能找到元素 get(index) 基于下标查询
o(n) :需要从头查询到尾部 例如根据元素值查询链表
o(log n) 二叉树 红黑树
数组:时间复杂度o(1) 基于下标查询
链表:时间复杂度o(n)

Arraylist集合与Vector集合有那些区别
相同点:都是基于数组实现 、默认初始容量为10
不同点:Arraylist线程不安全 Vector线程是安全
扩容Arraylist 1.5倍 Vector2倍
capacityIncrement 可以自定义扩容容量

LinkedList集合原理
底层基于链表结构
数组与链表结构区别:
数组:保证元素有序性 可以基于下标查询时间复杂度:o(1)
链表:单向链表和双向链表 可以基于下标查询 时间复杂度:o(n)
数组适合于: 基于下标查询arrays[1] 增删有可能会对我们数组实现移动,效率非常低;
链表适合于: 增删 只需要该引用指针关系

HashMap集合:底层单链表
LinkedList集合: 底层双向链表
HashMap集合: 底层单链表 不能够key有序性
LinkedHashMap集合: 双向链表 保证key有序性

LinkedList集合为什么需要用一个变量记录下头结点 后期遍历数据知道从哪里开始
100 0-50 51-100
index=25
0-50 折半 0-24 25-50 折半算法 o(logn)

链表的index值是怎么知道的呢?
链表长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值