JDK源码-Vector

1,Vector:

-1,实现可增长的对象数组。与对象数组相同,他包含整数索引来进行组件访问。但是,Vector的大小可以根据需要增大或缩小。

-2,每个Vector通过维护capacity和capacityIncrement来优化存储管理。capacity始终至少与Vector的大小相等。通常该值大于Vector的容量,是因为Vector将按capacityIncrement来增加存储块。应用程序在增加大量数据前可以手动增加Vector的容量,减少增加分配的量。

2,继承结构图:

3,成员变量:

-1,elementData:数组对象用来存储Vector中的元素。Capacity的长度就是该数组的长度。


protected Object[] elementData;

-2,elementCount:数组中元素量。


protected int elementCount;

-3,capacityIncrement:数组增长基数。


protected int capacityIncrement;

4,构造方法

-1,Vector(int , int)


   public Vector(int initialCapacity, int capacityIncrement) {

	super();

        if (initialCapacity < 0)

            throw new IllegalArgumentException("Illegal Capacity: "+

                                               initialCapacity);

	   this.elementData = new Object[initialCapacity];//初始化数组

	   this.capacityIncrement = capacityIncrement;//初始化默认增长值

    }

-2,Vector():空构造方法,默认初始化数组长度为10,默认增长参数为0


   public Vector() {

	this(10);

    }

-3,Vector(int):


  public Vector(int initialCapacity) {

	this(initialCapacity, 0);

    }

5,主要方法,Vector中的方法操作均为同步操作。

-1,addElement


   public synchronized void addElement(E obj) {

	    modCount++;//结构化修改参数加1

	    ensureCapacityHelper(elementCount + 1);//确保capacity大小满足增加元素要求

	    elementData[elementCount++] = obj;//存储元素,数组元素索引加1

    }

    private void ensureCapacityHelper(int minCapacity) {

	  int oldCapacity = elementData.length;//获取数组长度

	  if (minCapacity > oldCapacity) {//如果当前存放元素索引大于数组长度

	      Object[] oldData = elementData;

	       int newCapacity = (capacityIncrement > 0) ?

		   (oldCapacity + capacityIncrement) : (oldCapacity * 2);//每次数组长度增加默认正常长度,默认增长长度为0时,扩充数组长度为原来的两倍

    	    if (newCapacity < minCapacity) {

		       newCapacity = minCapacity;

	        }

            elementData = Arrays.copyOf(elementData, newCapacity);//数组复制

	   }

    }

-2,removeObject(Object object):移除元素,如果存在多个元素,则移除首次出现的元素


 public synchronized boolean removeElement(Object obj) {

	modCount++;//结构化修改计数加1

	int i = indexOf(obj);//获取元素位置

	if (i >= 0) {

	    removeElementAt(i);//移除对应位置的元素

	    return true;

	}

	return false;

    }

  public int indexOf(Object o) {

	      return indexOf(o, 0);

    }

    public synchronized int indexOf(Object o, int index) {

	if (o == null) {//如果元素为null则使用==比较元素相等

	    for (int i = index ; i < elementCount ; i++)

		if (elementData[i]==null)

		    return i;

	} else {

	    for (int i = index ; i < elementCount ; i++)

		if (o.equals(elementData[i]))//元素不为null,调用equals方法来判断是否相等

		    return i;

	}

	return -1;

    }

-3,add(E)


    public synchronized boolean add(E e) {

	modCount++;

	ensureCapacityHelper(elementCount + 1);

	elementData[elementCount++] = e;

        return true;

    }

-4,capacity:获取内部数组长度


   public synchronized int capacity() {

	return elementData.length;

    }

-5,size:获取对应数组存储元素长度


  public synchronized int size() {

	return elementCount;

    }
时间: 2024-10-15 01:30:20

JDK源码-Vector的相关文章

JDK源码学习系列07----Stack

                                                               JDK源码学习系列07----Stack 1.Stack源码非常简单 package java.util; public class Stack<E> extends Vector<E> { // 版本ID.这个用于版本升级控制,这里不须理会! private static final long serialVersionUID = 122446316454

JDK源码学习系列06----Vector

                                            JDK源码学习系列06----Vector 1.Vector简介 Vector的内部是数组实现的,它和ArrayList非常相似,最大的不同就是 Vector 是线程安全(同步)的. public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.S

jdk源码阅读笔记之java集合框架(一)(基础篇)

结合<jdk源码>与<thinking in java>,对java集合框架做一些简要分析(本着实用主义,精简主义,遂只会挑出个人认为是高潮的部分). 先上一张java集合框架的简图: 会从以下几个方面来进行分析: java 数组; ArrayList,LinkedList与Vector; HashMap; HashSet 关于数组array: 数组的解释是:存储固定大小的同类型元素.由于是"固定大小",所以对于未知数目的元素存储就显得力不从心,遂有了集合.

jdk源码分析总览

今天看到了一个源码分析按照重要性排序的例子, 这里拿过来用了,之后按照这个顺序不断的完善源码的内容. 引用的出处忘记了(对作者说声抱歉) 很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Object 12) String 13) AbstractStringBuilder 14) StringBuffer 15) StringBuilder 16) Boo

设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的1

最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u92-windows-x64),JDK安装路径里有个"src.zip"就是JDK的源码文件压缩包: 设置好环境变量的JAVA_HOME变量和PATH变量(JAVA_HOME变量值也是D:\Java\jdk-8u92-windows-x64). 然后打开Eclipse设置可以Debug模式调试

使用Eclipse跟踪JDK源码

首先我们要学会的是将JDK源码加载Eclipse中. 1.点"窗口"-->"首选项",选择左边的"Java"-->"已安装的JRE",然后选择我们安装的JRE,并单击它,然后选择右边的"编辑". 点"编辑"将出现如下的界面: 2.跟踪阅读源码 如上图,在我自己写的代码中包含了StringTokenizer类,我们要看它的具体定义,就只要按住"Ctrl"键,

eclipse中导入jdk源码、SpringMVC注解@RequestParam、SpringMVC文件上传源码解析、ajax上传excel文件

eclipse中导入jdk源码:http://blog.csdn.net/evolly/article/details/18403321, http://www.codingwhy.com/view/799.html. ------------------------------- SpringMVC注解@RequestParam:http://825635381.iteye.com/blog/2196911. --------------------------- SpringMVC文件上传源

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

JDK源码分析之concurrent包(三) -- Future方式的实现

上一篇我们基于JDK的源码对线程池ThreadPoolExecutor的实现做了分析,本篇来对Executor框架中另一种典型用法Future方式做源码解读.我们知道Future方式实现了带有返回值的程序的异步调用,关于异步调用的场景大家可以自行脑补Ajax的应用(获取返回结果的方式不同,Future是主动询问获取,Ajax是回调函数),这里不做过多说明. 在进入源码前,首先来看下Future方式相关的API: 接口Callable:有返回结果并且可能抛出异常的任务: 接口Future:表示异步