`
greemranqq
  • 浏览: 977089 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

JAVA深入集合--Vector

阅读更多

一.介绍

Vector 本质是一个数组,当然他具有数组的通过下标访问等特性,同时这玩意儿继承了 AbstractList 。当然他具有了集合的通用功能,同时他实现了 List,RandomAccess,Cloneable ,Sertializable 接口。

这里大概提一下RandomAccess 和 Cloneable 

1.1 RandomAccess 可以让其拥有随机访问的能力,可以用迭代器进行迭代,某些情况 下 会有更好性能。没有就无法使用Iterator迭代器。

 

1.2 Cloneable 会提供Object clone 功能,没有就无法clone

 

 

 

 

关于这里的研究我们以后再谈,还是先来说Vector 。

 

 

二.代码分析

 

2.1 Vector 的属性 :
     protected Object[] elementData; 这是用来存放元素的。
     protected int elementCount; 这是记录这个对象存放了好多个元素
     protected int capacityIncrement; 这是增长因子,就是你数组放不下了,增加容量。

2.2 构造方法:
     public Vector() {
	  this(10);
  }
  
    public Vector(int initialCapacity, int capacityIncrement) {
	     this.elementData = new Object[initialCapacity];
	     this.capacityIncrement = capacityIncrement;
   }
  
     public Vector(int initialCapacity) {
	    this(initialCapacity, 0);
   }
  
     这里我取了主要部分,从构造不难看出,我们默认 new Vector(),实际上是通过public Vector(int initialCapacity, int capacityIncrement) 方法,创建了长度为10 ,增长因子为0 的Object 数组。这里如果大概知道数组长度,请指定长度,必然复制数组带来的开销。



public Vector(Collection<? extends E> c) {
	elementData = c.toArray();
	elementCount = elementData.length;
	// c.toArray might (incorrectly) not return Object[] (see 6260652)
	if (elementData.getClass() != Object[].class)
	    elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
    }

这个构造 是把集合元素存放到Vector对象里面。

 

3.3 方法介绍:这里只介绍几个主要的,其余可以查询API


public synchronized boolean add(E e) {
	modCount++;
	ensureCapacityHelper(elementCount + 1);
	elementData[elementCount++] = e;
        return true;
  }
  
 private void ensureCapacityHelper(int minCapacity) {
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object[] oldData = elementData;
	    int newCapacity = (capacityIncrement > 0) ?
		(oldCapacity + capacityIncrement) : (oldCapacity * 2);
    	    if (newCapacity < minCapacity) {
		newCapacity = minCapacity;
	    }
            elementData = Arrays.copyOf(elementData, newCapacity);
	}
    }

 方法:add(E e)

      就是添加一个元素,这里通过ensureCapacityHelper 方法进行判断添加的个数,从ensureCapacityHelper(elementCount + 1);知道,默认是添加一个,这里添加的个数如果超出了原来数组的长度,就用Arrays.copyOf 进行扩容,底层用的System.arraycopy 方法,默认元素加载末尾。关于 modCount 字段是集合用来快速判断迭代过程中失败的标志,也就是说 如果集合在地带过程中,进行了删除等操作 就会报错。

 

同理:
  方法:add(int index,E element) 向指定位置添加元素,实际上访问的是:
   
public synchronized void insertElementAt(E obj, int index) {
	modCount++;
	if (index > elementCount) {
	    throw new ArrayIndexOutOfBoundsException(index
						     + " > " + elementCount);
	}
	ensureCapacityHelper(elementCount + 1);
	System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
	elementData[index] = obj;
	elementCount++;
      }
但是你发现 最终都是 调用 ensureCapacityHelper 等方法。

还有: public synchronized void addElement(E obj) 方法,和add方法相比,只是返回值不一样,一个是boolean,一个是 void 内部完全一样。


方法: public boolean contains(Object o) 判断元素是否存在,实际访问的是:
 public synchronized int indexOf(Object o, int index) {
	if (o == 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]))
		    return i;
	}
	return -1;
  }
  
  简单来说就是一个素组的循环。

 

 

方法:public Enumeration<E> elements()
这里是创建了一个枚举类型,里面实现还是通过元素是否存在,通过下标遍历数组

public Enumeration<E> elements() {
	return new Enumeration<E>() {
	    int count = 0;

	    public boolean hasMoreElements() {
		return count < elementCount;
	    }

	    public E nextElement() {
		synchronized (Vector.this) {
		    if (count < elementCount) {
			return (E)elementData[count++];
		    }
		}
		throw new NoSuchElementException("Vector Enumeration");
	    }
	};
      }
  
  
  当然还有其他方法,就不多做介绍了,就是数组元素的操作而已。

 

小结:

1.Vector 本质是一个数组,其实所有集合都是数组,从JAVA 来说搞成了对象,符合我  们的OO,可以参考学习。

2.Vector 源码看出很多方法都是synchronized 的,线程安全,但是效率就不得不  损耗点了,多线程开发可以使用。

允许的情况,我们可以参考这种模式,设计自己的vector 类,或者其他类,以便于更适应我们的项目。不要把这些看得很圣神,其实都是你和JDK开发人员,差距没那么大,相信自己。

0
0
分享到:
评论

相关推荐

    精通java集合框架--List,Set..

    本文将深入探讨Java集合框架的核心概念,包括`List`、`Set`、`Map`以及它们之间的区别和联系。 #### Java集合框架简介 Java集合框架是Java平台的一部分,它由一系列接口组成,这些接口描述了不同类型的容器,比如...

    (超赞)JAVA精华之--深入JAVA API

    ### 深入Java API #### 一、Java SE **1.1 深入 Java API** **1.1.1 Lang包** - **String类与 StringBuffer类** - `String` 类不可变,一旦创建后其内容无法更改;而 `StringBuffer` 类则允许在原有基础上修改...

    JAVA基础-集合

    本文旨在深入解析JAVA集合的基础概念、核心类以及它们的使用场景,帮助读者更好地理解和掌握JAVA集合。 #### 字符串与String类 字符串在JAVA中被视为一个不可变的对象,由`java.lang.String`类表示。这意味着一旦...

    java-version--VSM.rar_VSM JAVA_java VSM_java-version--VSM_vsm_文件

    1. **集合框架**:为了处理多个文件和存储词汇信息,Java的ArrayList或HashSet等集合类可能会被用到。 2. **IO操作**:Java的FileInputStream和BufferedReader等类用于读取文件内容。 3. **文本预处理**:在计算...

    java-collections-framework1016

    Java早期版本中存在一些集合类,如`Vector`、`Stack`等,它们在Java 1.2之后逐渐被新引入的集合框架取代。这些历史集合类通常保留了向后兼容性,但在新的项目中推荐使用Java Collections Framework提供的类。 #### ...

    java---核心编程

    本文将深入探讨Java集合框架中的Collection接口及其子接口List。 Collection是所有单值集合的顶级接口,它定义了集合的基本操作。Collection接口有两个主要的子接口:List和Set。List接口代表一个有序的、允许重复...

    vector集合

    在Java编程语言中,`Vector`集合是一个非常重要的数据结构,尤其在早期版本的Java中广泛使用。`Vector`类是Java集合框架的一部分,位于`java.util`包中,它继承自`AbstractList`并实现了`List`接口,因此具备列表的...

    java---数据结构

    Java集合框架包括List、Set和Queue接口,以及ArrayList、LinkedList、HashSet、 TreeSet、HashMap、TreeMap等实现类。集合用于存储一组不重复的对象,而Map则关联键值对,提供高效的查找和访问。例如,HashMap以散列...

    ArrayList-LinkedList--Vector-Map.zip_vector

    在Java编程语言中,`ArrayList`、`LinkedList`、`Vector`和`Map`是四种常用的集合类,它们各自有着不同的特性和用途。本篇文章将深入探讨这些数据结构及其使用场景。 首先,我们来了解`ArrayList`。`ArrayList`是`...

    完整版Java全套入门培训课件 Java基础 06-集合(共24页).rar

    本套入门培训课件聚焦于Java基础中的集合部分,共包含24页内容,旨在帮助初学者深入理解并熟练运用Java集合。 1. 集合接口概述:集合是存储一组不重复对象的容器。Java集合框架包含两个主要接口:List和Set。List...

    java JDK 1.8-8u202/ 16.0.1

    1. **Lambda表达式**:Java 8引入了lambda表达式,这是一种简洁的匿名函数表示方式,使得代码更简洁,尤其是在处理集合和并发时。 2. **方法引用来替代匿名内部类**:与lambda表达式一起,Java 8允许使用方法引用,...

    完整版Java全套入门培训课件 Java基础 06-集合(共24页).pptx

    在本课程中,我们将深入探讨String类、StringBuffer、基本数据类型对象包装类以及集合类的相关知识点。 首先,我们关注String类。字符串在Java中被视为特殊的对象,一旦创建后其内容不可更改。例如,`String str = ...

    Java 各种集合的区别ArrayList Vector LinkedList map区别

    今天,我们将深入了解 Java 中的集合类别,包括 ArrayList、Vector、LinkedList 和 Map 等。 ArrayList ArrayList 是一种基于数组的集合类别,它可以存储大量的数据。ArrayList 的特点是:它可以动态地增加或减少...

    java 集合----Map、Collection

    Java集合框架是编程中不可或缺的一部分,它提供了多种数据结构,如列表(List)、集(Set)以及映射(Map),便于我们高效地存储、管理和操作数据。本文将深入探讨Map和Collection接口,以及它们的实现类,特别是HashSet和...

    java中vector的定义以及用法

    ### Java中的Vector定义与用法详解 #### 一、Vector简介 `Vector`是Java集合框架中的一个类,它提供了一种线程安全的动态数组实现。...理解`Vector`的特性和用法对于深入学习Java集合框架是非常有益的。

    Java集合框架总结

    本文档将深入探讨Java集合框架的关键组成部分、它们之间的关系以及如何有效地使用它们。 #### 二、Java集合框架结构 Java集合框架的核心部分包括以下几类: - **集合接口**:主要包括`Collection`、`Set`、`List`...

    java面试汇总--提高成功率的宝典

    Java面试汇总——提升面试成功率的关键知识点 在Java面试中,掌握关键知识点是成功的关键。以下是一些常见的面试问题和解答,这些内容可以帮助你更...同时,不断实践和深入理解这些知识点,才能在实际开发中游刃有余。

    Java集合详解,详细讲解java的集合类

    本文将深入讲解Java集合类,特别是Collection接口和其下的List、Set,以及Map接口中的几个重要实现类。 首先,我们来看Collection接口。Collection是最基本的集合接口,它代表一组Object,即它的元素。Collection...

    Java-JUC-多线程 进阶

    为了解决这个问题,Java 提供了多种线程安全的集合类,例如 Vector、CopyOnWriteArrayList、ConcurrentHashMap 等。 Callable Callable 是 Java 中的一种函数式接口,用于描述可被线程池执行的任务。Callable 接口...

Global site tag (gtag.js) - Google Analytics