Java 集合及底层源码分析,nginx教程阮一峰

本文详细分析了Java集合中的ArrayList、Vector和LinkedList的底层实现和性能差异。ArrayList基于可变数组,适合查询操作,而LinkedList采用双向链表,适合增删操作。Vector与ArrayList相似,但在线程安全方面进行了同步处理。同时,文章还介绍了HashSet的添加原理,以及HashMap和Hashtable的区别。
摘要由CSDN通过智能技术生成
    • **List集合**
    • ArrayList
  • Vector

  • LinkedList

  • Set集合

    • HashSet
  • LinkedHashSet

  • **Map集合**

    • Map 接口的遍历方式
  • HashMap

  • Hashtable

  • Properties

  • TreeSet

  • TreeMap

  • 开发中如何选择集合实现类

  • Iterator遍历

  • Collection工具类

List集合


  1. 集合类中元素有序(即添加顺序和取出顺序一致)、且可重复

  2. List集合中的每个元素都有其对应的顺序索引,即支持索引索引是从0开始的

ArrayList

ArrayList是由数组来实现数据存储的

ArrayList 基本等同于Vector,除了ArrayList是线程不安全的(执行效率高),在多线程的情况不建议使用ArrayList

源码分析结论

  1. ArrayList中底层一直维护一个Object类型的数组 elementData(transient Object[] elementData 表示瞬间,短暂的,表示该属性不会被序列化)

  2. ArrayList如果使用无参构造,则初始elementData 容量为0,第一次扩容容量为10,如需要再次扩容,则扩容为原来的1.5倍,即 newCapacity = oldCapacity + oldCapacity>>1

  3. 如果使用的是有参构造,则初始elementData容量为指定大小,如果需要扩容,则扩容为原来的1.5倍

//源代码是jdk1.8版本

private void grow(int minCapacity) {

// overflow-conscious code

int oldCapacity = elementData.length;//无参构造下初始值为0,如果是有参构造,值为指定的值

int newCapacity = oldCapacity + (oldCapacity >> 1);//>>表示右移一位 相当于除以2

if (newCapacity - minCapacity < 0) //此处无参构造下第一次扩容,newCapacity为0,而minCapacity为10,故做一下处理

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); //使用Copyof的话,使得在原先的数组值不变的情况下进行扩容

}

Vector

Vector 底层也是一个对象数组,protect Object [] element Data;

Vector 是线程同步的,即线程安全,Vector类的操作方式带有Synchronied

在开发中,如果需要线程同步安全,则应该考虑Vector

源码分析结论

  1. Vector 如果使用无参构造的,默认容量为10,如需要再次扩容,就按2倍扩容

  2. 如果使用有参构造,或有参时只指定初始容量,未指定需要增加的容量,则初始容量为指定的容量,如需再次扩容,则扩容后的容量为原来的两倍

  3. 如果使用有参构造,构造时既指定初始容量,又指定需要增加的容量,则初始容量为指定的容量,如需再次扩容,则扩容后的容量为原来的加上增加容量,详细如下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值