`

Vector 学习笔记

阅读更多

下一篇:Stack学习笔记 

 

OverView

 

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。 并且Vector类是同步的。

 

Stack 类表示后进先出(LIFO)的对象堆栈。Stack类继承自Vector。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。

 

 

 

 

 

Java Collections framework继承关系如图:

 

 

 

一、Vector

 

Vector对象可以存储任何对象。

 

Creating Vectors-创建Vector对象

 

Vector有四个构造函数,如下:

 

1.1public Vector()

 

构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。如果容量不够用,默认为双倍扩容。例如:

 

 

Demo1

Vector v = new Vector();//默认容量为10

for(int i=0;i<12;i++){//i最后大于10,将会自动扩容

       v.add(i);

}

System.out.println(“扩容后容量为:”+v.capacity());

 

结果为:扩容后容量为:20

 

 

Demo2

Vector v = new Vector();//默认容量为10

for(int i=0;i<22;i++){//i最后大于10,将会自动扩容

       v.add(i);

}

System.out.println(“扩容后容量为:”+v.capacity());

结果为:扩容后容量为:40

扩容步骤为:i=10时,vector对象容量不够,扩容为20;当i=20时,vector再次双倍扩容,变为40

 

1.2public Vector(int initialCapacity)

 

构造一个向量,设置其内部数据数组的大小为initialCapacity

 

1.3public Vector(int initialCapacity, int capacityIncrement)

 

使用指定的初始容量和容量增量构造一个空的向量

 

Demo1

Vector v = new Vector(10,5);//默认容量为10,扩容增量为5

for(int i=0;i<12;i++){//i=10时,容量不够,容量加5

       v.add(i);

}

System.out.println(“扩容后容量为:”+v.capacity());

结果为:扩容后容量为:15

 

1.4public Vector(Collection<? extends E> c)

构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列

 

Demo1

 

String[] arr={"avatar","lady gaga","kaka"};

Vector v = new Vector(Arrays.asList(arr));

System.out.println(v.toString());//输出[avatar, lady gaga, kaka]

 

1.5Note:如果初始容量被设置为负数,则会抛出IllegalArgumentException异常。

 

Adding Elements-添加元素

 

2.1Adding at the End

 

Vector类提供了一下集中方法添加元素:

public boolean add(Object element) //将指定元素添加到此向量的末尾。

public void addElement(Object element) //将指定的组件添加到此向量的末尾,将其大小增加 1

上面这这两种添加元素方法本质上是一样的,都是把元素添加到Vector对象的末尾,不同之处为add()方法总是返回true,addElement()方法没有返回值。

 

TipVector对象允许添加null和重复值

 

Demo1

Vector v = new Vector();

v.add(null);

v.add("avatar");

v.add("avatar");

System.out.println(v.toString());

输出结果:[null, avatar, avatar]

 

2.2Adding in the Middle-添加到Vector中指定位置

 

public void add(int index, Object element)// 将指定元素添加到此向量的末尾

public void insertElementAt(Object element, int index)// 将指定对象作为此向量中的组件插入到指定的 index

       以上这两种方法可以将元素插入到Vector的中间,其中index0开始,但是这些操作比较费性能,如果你经常需要这样操作,也许Vector并不是最适合你的结构,你可以使用LinkedList代替Vector

       下图直观表达出元素插入到Vector对象中时的数组移动方式,后两个元素的index将会加1

 

 

 

 

 

 

 

 

 

2.8Removing a Range of Elements-删除指定范围元素

 

protected void removeRange(int fromIndex, int toIndex) 从此 List 中移除其索引位于 fromIndex(包括)与 toIndex(不包括)之间的所有元素。

 

2.9Replacing Elements-替换元素

 

public Object set(int index, Object element) 用指定的元素替换此向量中指定位置处的元素。

public void setElementAt(Object obj, int index) 将此向量指定 index 处的组件设置为指定的对象。

 

Demo1

Vector v = new Vector();

for(int i=0;i<12;i++){

       v.add(i);

}

Integer del=(Integer)v.set(1, 123);

System.out.println("替换对象为:"+del);

System.out.println("所有对象:"+v);

输出结果为:

替换对象为:1

所有对象:[0, 123, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

 

2.10Storage Size-存储元素数量

 

public int size()返回此向量中的元素数。

public void setSize(int newSize) 设置此向量的大小。

如果你设置的大小小于现在Vector元素的数量,Vector会从新的长度处开始截断。如果增加大小,则会在现有对象末尾添加null元素。setSize0)将会删除所有元素,如果这样,你调用isEmpty()方法将会返回true

public boolean isEmpty()测试此向量是否不包含元素。

 

Demo1

Vector v = new Vector();

for(int i=0;i<12;i++){

       v.add(i);

}

System.out.println("设置前所有对象:"+v);

v.setSize(5);

System.out.println("设置后所有对象:"+v);

输出结果:

设置前所有对象:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

设置后所有对象:[0, 1, 2, 3, 4]

 

Demo2

Vector v = new Vector();

for(int i=0;i<12;i++){

       v.add(i);

}

System.out.println("设置前所有对象:"+v);

v.setSize(15);

System.out.println("设置后所有对象:"+v);

输出结果:

设置前所有对象:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

设置后所有对象:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, null, null, null]

 

Demo3

Vector v = new Vector();

for(int i=0;i<12;i++){

       v.add(i);

}

System.out.println("设置前所有对象:"+v);

v.setSize(0);

System.out.println("设置后所有对象:"+v);

输出结果:

设置前所有对象:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

设置后所有对象:[]

 

 

2.11Storage Capacity-存储容量

 

Vector容量:在Vector没有重新调整任何内部数据结构的大小之前,能够装入Vector的元素的数量。最好减少调整内部数据结构大小的次数。如果容量设置过大,内存将会浪费。获取当前Vector容量,可以调用capacity()方法。

       每添加一个元素,最好条用方法tirmSize().这个方法会删除多余的容量。

public void trimToSize()对此向量的容量进行微调,使其等于向量的当前大小

 

Demo1

Vector v = new Vector();

for(int i=0;i<12;i++){

       v.add(i);

}

System.out.println("设置前容量:"+v.capacity());

v.trimToSize();

System.out.println("设置后容量:"+v.capacity());

输出结果:

设置前容量:20

设置后容量:12

 

2.12Vector Immutability-固定vector

 

如果vector内容不再改变,你可能希望vector只读,这将使vector得元素不会被修改。collections类提供了方法unmodifyableList,既然VectorList子类,我们就可以调用此方法获取一个只读集合。如果vector变为只读,则访问vector就不需要同步了。

Vector v = new Vector();

// fill vector

List l = Collections.unmodifiableList(v);

 

2.13Getting by Index-通过索引获取元素

public Object get(int index) 返回向量中指定位置的元素。

public Object elementAt(int index) 返回指定索引处的组件。

 

Demo1

Vector v = new Vector();

v.add("Hello");

String s = (String)v.get(0);

System.out.println(s);

输出结果:Hello

 

2.14Getting by Position-获取指定位置元素

 

public Object firstElement()返回此向量的第一个组件(位于索引 0) 处的项)。

public Object lastElement()返回此向量的最后一个组件。

 

2.15Enumerating through the Elements-枚举元素

 

Vector v = . . .

Enumeration e = v.elements();

while (e.hasMoreElements()) {

  process(e.nextElement());

}

 

2.16Inherited Methods from AbstractList-继承自AbstractList类的方法

 

public Iterator iterator()

public ListIterator listIterator()

public ListIterator listIterator(int index)

 

Demo1

Vector v = . . .

Iterator i = v.iterator();

while (i.hasNext()) {

  process(e.next());

}

 

2.17Checking for Existence-检查元素是否存在

 

public boolean contains(Object element) 如果此向量包含指定的元素,则返回 true

 

 

2.18Checking for Position-检查元素位置

 

public int indexOf(Object element) 返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回 -1

public int indexOf(Object element, int index)  返回此向量中第一次出现的指定元素的索引,从 index 处正向搜索,如果未找到该元素,则返回 -1

 

2.19Checking for Position from End-从末尾检查位置

 

public int lastIndexOf(Object element) 返回此向量中最后一次出现的指定元素的索引;如果此向量不包含该元素,则返回 -1

public int lastIndexOf(Object element, int index)  返回此向量中最后一次出现的指定元素的索引,从 index 处逆向搜索,如果未找到该元素,则返回 -1

 

2.20Checking for Collection Containment-检查一个结合是否存在

 

public boolean containsAll(Collection c)  如果此向量包含指定 Collection 中的所有元素,则返回 true

 

2.21Cloning Vectors-克隆

 

public Object clone()返回向量的一个副本。

 

Demo1

Vector v1 = new Vector();

v1.add("gaga");

v1.add("avatar");

 

Vector v2 = (Vector)v1.clone();

Collections.sort(v2);

 

System.out.println(v1.toString());

System.out.println(v2.toString());

输出结果:

[gaga, avatar]

[avatar, gaga]

 

2.22Copying Vectors-拷贝

 

public Object[] toArray()返回一个数组,包含此向量中以恰当顺序存放的所有元素。

public Object[] toArray(Object[] a) 返回一个数组,包含此向量中以恰当顺序存放的所有元素;返回数组的运行时类型为指定数组的类型。

public void copyInto(Object[] anArray) 将此向量的组件复制到指定的数组中。

 

2.23Working with Subsets –获取子集

 

public List subList(int fromIndex, int toIndex) 返回此 List 的部分视图,元素范围为从 fromIndex(包括)到 toIndex(不包括)。

 

subList方法不是克隆vector对象,而是源vector对象和新的子集引用指向同一个内部数据结构。这就意味着两者的改动都会直接互相改动。请看下图:

 

 

 

 

 

 

 

 

 

 

2.24Checking Vectors for Equality-检查是否相等

 

public boolean equals(Object o) 比较指定对象与此向量的相等性。

如果两个vector对象元素数量相等并且所有对应位置的元素都相等,则这两个vector对象相等。

 

2.25Serializing Vector-序列化

 

Vector类实现了类Serializable接口,但这并不意味着所有的Vector对象能够自动序列化。如果Vector对象内部的元素都是可序列化得,那么Vector对象也就可以被序列化;如果Vector对象中有一个元素不能被序列化,则会抛出NotSerializableException错误。

 

Demo1

import java.io.*;

import java.util.*;

public class SaveVector {

  public static void main (String args[]) throws Exception {

    Vector v = new Vector(Arrays.asList(args));

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    ObjectOutputStream oos = new ObjectOutputStream(baos);

    oos.writeObject(v);

    oos.close();

    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

    ObjectInputStream ois = new ObjectInputStream(bais);

    Vector v2 = (Vector)ois.readObject();

    Enumeration e = v.elements();

    while (e.hasMoreElements()) {

      System.out.println(e.nextElement());

    }

  }

}

 

 

分享到:
评论

相关推荐

    P197~203C++vector学习笔记.docx

    C++中的vector容器 C++中的vector容器是一个动态数组,可以存储各种类型的数据,包括基本数据类型和自定义数据类型。vector容器提供了多种方式来访问和遍历容器中的数据。 vector容器的语法与使用 vector容器的...

    C++ 学习笔记 整理

    这份"C++学习笔记"涵盖了C++的基础到高级概念,旨在帮助初学者和有一定经验的程序员深入理解并掌握C++。 在C++的学习过程中,以下几个关键知识点是不可或缺的: 1. **基础语法**:C++起源于C语言,因此它保留了...

    【C++学习笔记】一份详细的学习笔记,让你轻松掌握C++编程!

    【C++学习笔记】这份详尽的资源是为那些希望深入了解C++编程语言的人们精心准备的。C++是一种强大的、通用的编程语言,它的设计理念是面向对象,同时支持过程化编程,使得它在系统软件、应用软件、游戏开发、设备...

    Java学习笔记整理

    这些学习笔记将带你深入了解Java的核心概念,特别是面向对象编程和集合框架。以下是对每个文件内容的详细阐述: 1. **Day0804_HashMap的基本使用.docx**:HashMap是Java集合框架中的一个重要组件,它提供了键值对的...

    C++学习笔记.doc

    【C++ 学习笔记】深入理解编程与C++基础 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统以及许多高性能应用。学习C++不仅仅是掌握语法,更重要的是理解编程的核心概念,以便更好...

    新手C++学习笔记(仅供菜鸟成长参考).rar

    《新手C++学习笔记》是一份专为编程初学者打造的资源,旨在帮助那些刚刚踏入C++编程领域的“菜鸟”快速成长。这份笔记包含了前辈们的实践经验总结,具有很高的学习价值。文档以.doc格式存储,方便读者使用常见的文字...

    机器学习学习笔记.rar

    《机器学习学习笔记》是由Jim Liang编写的700多页的PPT教程,它为初学者提供了全面而深入的机器学习入门指导。这份资料涵盖了广泛的机器学习主题,包括基础概念、算法以及实践应用。以下是对每个主要知识点的详细...

    良葛格java学习笔记

    《良葛格java学习笔记》是一份集合了Java学习精华的资源,主要针对初学者和对Java编程感兴趣的读者。这份笔记是由用户从良葛格的网站上精心整理并转化为CHM格式,便于阅读和查阅。CHM(Compiled Help Manual)是微软...

    黑马python机器学习入门笔记

    《黑马Python机器学习入门笔记》是一份针对初学者编写的指南,旨在帮助读者掌握Python语言在机器学习领域的基本应用。这份笔记将带你踏入这个充满无限可能的领域,通过Python这门易学且强大的编程语言,开启你的数据...

    C++语言 STL学习笔记.pdf

    本次学习笔记将围绕STL中的一些容器和函数进行详细探讨,包括vector、set、string和map等常用容器的定义、操作方法和它们的常见用途。 首先,vector是一个可以动态增长的数组。在C++中,它支持随机访问,可以通过...

    SVG学习笔记(Scalable Vector Graphics)

    ### SVG学习笔记(Scalable Vector Graphics) #### SVG概述 SVG,全称为可缩放矢量图形(Scalable Vector Graphics),是一种基于XML的语言,用于描述二维矢量图形及其行为。SVG不仅支持静态图形,还支持动画以及...

    c++primer 学习笔记

    这篇学习笔记主要涉及了C++编程的一些核心概念,包括程序结构、变量、基本类型、初始化与赋值、可读性、常量与引用、typedef、枚举以及标准库中的字符串和向量类型。 1. **程序结构**: - 每个C++程序都必须包含`...

    JAVA学习笔记.pdf

    JAVA学习笔记.pdf JAVA学习笔记.pdf 中讲解了JAVA语言的基础知识,包括类的基本知识、成员变量、成员方法、类的实例、内部类、匿名类、接口、包等。 类的基本知识 在JAVA中,类是对象的蓝图,类的声明语法为:...

    java学习笔记(一个初学者的java学习笔记)

    ### Java学习笔记——基础知识详解 #### 一、Java基本数据类型及内存占用 Java作为一种广泛使用的编程语言,其基础数据类型对于理解程序的行为至关重要。Java提供了八种基本数据类型,分为数值型、字符型和布尔型...

    VC++深入详解学习笔记

    **VC++深入详解学习笔记** 在编程领域,Visual C++(简称VC++)是Microsoft公司开发的一款集成开发环境,主要用于编写使用C++语言的应用程序。它不仅提供了编译器,还包括了调试器、资源编辑器等工具,为开发者提供...

    STL学习笔记

    为了更好地掌握STL,除了阅读学习笔记,还可以参考经典的《C++ Primer Plus》、《C++ Standard Library》等书籍,以及网上的教程和实例。 10. **提升与优化** 熟练使用STL后,可以进一步了解其内部实现,如容器的...

    c++ -- stl 学习笔记

    这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...

    c++学习笔记

    这份"C++学习笔记"涵盖了C++的基础概念、语法结构、面向对象编程以及可能的高级主题,旨在帮助初学者或者有经验的程序员巩固C++知识。 首先,C++是从C语言发展而来,它保留了C语言的效率,同时引入了类和对象的概念...

    算法学习笔记.pdf

    在本篇算法学习笔记中,对一系列重要且常用的算法进行了整理和总结,以下是对文档内容中提及的知识点的详细解读。 一、快速排序算法 快速排序是一种高效的排序算法,采用分治法策略,它的时间复杂度平均为O(nlogn)...

Global site tag (gtag.js) - Google Analytics