ArrayList和Vector

ArrayList

ArrayList的注意实现

1.ArrayList可以加入null,并且多个

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

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

ArryList的底层操作机制源码分析

1.arrayList中维护了一个Object类型的数组elementData。【debug看源码】transient Object[] elementData;//transient 表示瞬间,短暂的,表示该属性不会被序列化

2.当创建ArrayList对象时,如果使用无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如果需要再次扩容,则扩容elementData为1.5倍

3.如果使用的是指定大小的构造器,则初始elementData容量指定大小,如果需要扩容,则直接扩容elementData为1.5倍。

debug调试以下代码,查看源码

import java.util.ArrayList;

@SuppressWarnings({"all"})
public class ArrayListSource {
public static void main(String[] args) {
//解读源码
//注意,注意,注意,Idea 默认情况下,Debug 显示的数据是简化后的,如果希望看到完整的数据
//需要做设置. //使用无参构造器创建 ArrayList 对象
//ArrayList list = new ArrayList();
ArrayList list = new ArrayList(8);
//使用 for 给 list 集合添加 1-10 数据
for (int i = 1; i <= 10; i++) {
list.add(i);
}
//使用 for 给 list 集合添加 11-15 数据
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
}

Vector

Vector介绍

1.Vector类的定义说明:

public class Vector<E> extens AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable

2.Vector 底层也是一个对象数组

3.Vector是线程同步的,即线程安全,Vector类的操作方法带有 synchronized

4.在开发中,需要线程同步安全时,考虑使用Vector

package List_.Vector_;

import java.util.Vector;
@SuppressWarnings({"all"})
public class Vector_ {
public static void main(String[] args) {
//无参构造器
//有参数的构造
Vector vector = new Vector(8);
for (int i = 0; i < 10; i++) {
vector.add(i);
}
vector.add(100);
System.out.println("vector=" + vector);
//解读源码
//1. new Vector() 底层
/*
public Vector() {
this(10);
}
补充:如果是 Vector vector = new Vector(8);
走的方法:
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
2. vector.add(i)
2.1 //下面这个方法就添加数据到 vector 集合
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
2.2 //确定是否需要扩容 条件 : minCapacity - elementData.length>0
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0
grow(minCapacity);
}
2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法
//newCapacity = oldCapacity + ((capacityIncrement > 0) ?
// capacityIncrement : oldCapacity);
//就是扩容两倍.
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的比较

ArrayList和Vector的比较

ArrayList Vector
底层结构 可变数组 可变数组
版本 jdk1.2 jdk1.0
线程安全(同步效率) 不安全,效率高 安全,效率不高
扩容倍数 如果有参构造1.5倍。如果是无参 :1.第一次10;2.从第二次开始按1.5扩 如果是无参,默认10,满后,就按2倍扩容。 如果指定大小,则每次直接按2倍扩容

最新文章

  1. ExtJS 4.2 业务开发(三)数据添加和修改
  2. Add Office 365 Azure Directory into Windows Azure
  3. windows下安装python和依赖包的利器——Anaconda
  4. 软工实践练习一——使用Git进行代码管理心得
  5. FLASH CC 2015 CANVAS (三) flash中写JS调用html中JS的函数,变量
  6. POJ2251Dungeon Master
  7. mysql 中创建存储过程
  8. FoxOne---一个快速高效的BS框架--(2)
  9. Mac OS使用技巧之十五:快捷方便的Mini Dock
  10. [SOJ] 导游
  11. RESTful 的总结
  12. Ubuntu16.04中php如何切换版本
  13. python基础(17)继承类和面向对象初识
  14. 第32课 Linux内核链表剖析
  15. day42
  16. java关键字,保留字
  17. 【最大流之Dinic算法】POJ1273 【 &amp; 当前弧优化 &amp; 】
  18. 【slenium专题】Webdriver同步设置
  19. 如何找出长时间未提交的事务session ID
  20. [转]Configure Network Drive Visible for SQL Server During Backup and Restore Using SSMS

热门文章

  1. 关于Quartus构建nios软核以及eclipse建立c语言工程以及成功下载到FPGA芯片过程遇到的各种问题以及解决方法详解
  2. 一、部署sqlserver
  3. (1)RabbitMQ在Docker上安装
  4. 板子题 Sol
  5. ☕【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)
  6. Vue+element基本增删改查
  7. 依赖注入Bean属性——手动装配Bean
  8. windows下配置VSCode免密SSH连接Linux机器
  9. Jupyter Notebook 修改字体和大小
  10. C语言使用getch()读取方向键