Vector:动态数组的使用和说明

摘自百度百科:


1. Vector 类在 java 中可以实现自动增长的对象数组;

创建了一个向量类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型也不需预先选定向量的容量,并可方便地进行查找。对于预先不知或不愿预先定义数组大小,并需频繁进行查找、插入和删除工作的情况,可以考虑使用向量类。向量类提供了三种构造方法:
public Vector()
public Vector(int initialcapacity,int capacityIncrement)
public Vector(int initialcapacity)
使用第一种方法,系统会自动对向量对象进行管理。若使用后两种方法,则系统将根据参数initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时,系统会扩充向量对象的存储容量。
参数capacityIncrement给定了每次扩充的扩充值。当capacityIncrement为0时,则每次扩充一倍。利用这个功能可以优化存储。
2. Java中,数组对象一旦创建后,其元素的个数 不能被修改。而Java.util包中的Vector类(向量)提供类似于数组的能力,且能够动态地调整自身的大小。Vector类似于一个数组,但与数组相比在使用上有两个优点:
① 使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加;
② Vector类提供额外的方法来增加、删除元素,比数组操作高效。[1]

插入功能

(1)public final synchronized void addElement(Object obj)
将obj插入向量的尾部。obj可以是任何类的对象。对同一个向量对象,可在其中插入不同类的对象。但插入的应是对象而不是数值,所以插入数值时要注意将数值转换成相应的对象。
例 要插入一个整数1时,不要直接调用v1.addElement(1),正确的方法为:
1
2
3
Vectorv1=new Vector();
Integerinteger1=new Integer(1);
v1.addElement(integer1);
(2)public final synchronized void setElementAt(object obj,int index)
将index处的对象设成obj,原来的对象将被覆盖。
(3)public final synchronized void insertElementAt(Object obj,int index)
在index指定的位置插入obj,原来对象以及此后的对象依次往后顺延。

删除功能

(1)public final synchronized void removeElement(Object obj)
从向量中删除obj。若有多个存在,则从向量头开始试,删除找到的第一个与obj相同的向量成员。
(2)public final synchronized void removeAllElement()
删除向量中所有的对象。
(3)public final synchronized void removeElementlAt(int index)
删除index所指的地方的对象。

查询搜索功能

(1)public final int indexOf(Object obj)
从向量头开始搜索obj,返回所遇到的第一个obj对应的下标,若不存在此obj,返回-1。
(2)public final synchronized int indexOf(Object obj,int index)
从index所表示的下标处开始搜索obj。
(3)public final int lastIndexOf(Object obj)
从向量尾部开始逆向搜索obj。
(4)public final synchronized int lastIndexOf(Object obj,int index)
从index所表示的下标处由尾至头逆向搜索obj。
(5)public final synchronized Object firstElement()
获取向量对象中的首个obj。
(6)public final synchronized Object lastElement()
获取向量对象中的最后一个obj。

实例

了解了向量的最基本的方法后,我们来看一下例子VectorApp.java。
例 VectorApp.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
importjava.util.Vector;
importjava.lang.*;
//这一句不应该要,但原文如此
importjava.util.Enumeration;
public class VectorApp
{
    public static void main(String[]args)
    {
        Vector<Integer> v1=new Vector<Integer>();//jdk1.5以后增加了对的支持!
        Integer integer1=new Integer(1);
        /**
        *因为Vector<Integer>已经指定为Integer类型
        *当v1.addElement("one")时会报错,类型不符
        *ThemethodaddElement(Integer)inthetypeVector<Integer>isnotapplicablefor
        *thearguments(String)
        */
        //加入的为字符串对象
        v1.addElement("one");
        v1.addElement("two");
        //加入的为Integer的对象
        v1.addElement(integer1);
        v1.addElement(newInteger(2));
        System.out.println("Thevectorv1is:\n\t"+v1);
        //此处的输出结果为:Thevectorv1is:[1,2]
        /**
        *ThemethodinsertElementAt(Integer,int)inthetypeVector<Integer>isnotapplicablefor
        *thearguments(String,int)
        *insertElementAt()是指:Insertsthespecifiedobjectasacomponentinthisvectorat
        *thespecifiedindex.
        */
        //将v1转换成字符串并打印
        v1.insertElementAt("three",2);
        v1.insertElementAt(newFloat(3.9),3);
        System.out.println("Thevectorv1(usedmethodinsertElementAt())is:\n\t"+v1);
        //以上运行,请改Vector<Integer>为Vector<Float>
        /**
        *setElementAt(Eobj,intindex)的用法
        *Setsthecomponentatthespecifiedindexofthisvectortobethespecifiedobject.
        *Thepreviouscomponentatthatpositionisdiscarded.              
        *Theindexmustbeavaluegreaterthanorequalto0andlessthanthecurrentsizeofthevector.
        */
        //将指定位置的对象设置为新的对象
        v1.setElementAt(2,1);
        System.out.println("Thevectorv1(usedmethodsetElementAt())is:\n\t"+v1);
        //从向量对象v1中删除对象integer1由于存在多个integer1所以从头开始找,删除找到的第一个integer1
        v1.removeElement(integer1);
        //使用枚举类(Enumeration)的方法来获取向量对象的每个元素
        Enumerationenum=v1.elements();
        System.out.print("Thevectorv1(usedmethodremoveElement())is:");
        while(enum.hasMoreElements())
        System.out.print(enum.nextElement()+"");
        System.out.println();
        System.out.println("Thepositionofobject1(top-to-bottom):"
+v1.indexOf(integer1));
        System.out.println("Thepositionofobject1(tottom-to-top):"
+v1.lastIndexOf(integer1));
        //按不同的方向查找对象integer1所处的位置
        v1.setSize(4);
        System.out.println("Thenewvector(resizedthevector)is:"+v1);
        //重新设置v1的大小,多余的元素被行弃
    }
}
运行结果:
E:\java01>java VectorApp
The vector v1 is:
[one,1,1,two,2,1,1]
The vector v1(used method insertElementAt())is:
[one,1,three,3.9,1,two,2,1,1]
The vector v1(used method setElementAt()) is:
[one,1,four,3.9,1,two,2,1,1]
The vector v1(used method removeElement())is:
one four 3.9 1 two 2 1 1
The position of object 1(top-to-bottom):3
The position of object 1(tottom-to-top):7
The new vector(resized the vector)is:
[one,four,3.9,1]
E:\java01>
从例1中运行的结果中可以清楚地了解上面各种方法的作用,另外还有几点需解释。
(1)类Vector定义了方法
public final int size()
此方法用于获取向量元素的个数。它的返回值是向量中实际存在的元素个数,而非向量容量。可以调用方法capactly()来获取容量值。
方法:
public final synchronized void setsize(int newsize)
此方法用来定义向量大小。若向量对象现有成员个数已超过了newsize的值,则超过部分的多余元素会丢失。
(2)程序中定义了Enumeration类的一个对象
Enumeration是java.util中的一个接口类,在Enumeration中封装了有关枚举数据集合的方法。
在Enumeration中提供了方法hasMoreElement()来判断集合中是否还有其它元素和方法nextElement()来获取下一个元素。利用这两个方法可以依次获得集合中元素。
Vector中提供方法:
public final synchronized Enumeration elements()
此方法将向量对象对应到一个枚举类型。java.util包中的其它类中也大都有这类方法,以便于用户获取对应的枚举类型。Java中,数组对象一旦创建后,其元素的个数 不能被修改。而Java.util包中的Vector类(向量)提供类似于数组的能力,且能够动态地调整自身的大小。Vector类似于一个数组,但与数组相比在使用上有两个优点:
① 使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加;
② Vector类提供额外的方法来增加、删除元素,比数组操作高效。[1]

插入功能

(1)public final synchronized void addElement(Object obj)
将obj插入向量的尾部。obj可以是任何类的对象。对同一个向量对象,可在其中插入不同类的对象。但插入的应是对象而不是数值,所以插入数值时要注意将数值转换成相应的对象。
例 要插入一个整数1时,不要直接调用v1.addElement(1),正确的方法为:
1
2
3
Vectorv1=new Vector();
Integerinteger1=new Integer(1);
v1.addElement(integer1);
(2)public final synchronized void setElementAt(object obj,int index)
将index处的对象设成obj,原来的对象将被覆盖。
(3)public final synchronized void insertElementAt(Object obj,int index)
在index指定的位置插入obj,原来对象以及此后的对象依次往后顺延。

删除功能

(1)public final synchronized void removeElement(Object obj)
从向量中删除obj。若有多个存在,则从向量头开始试,删除找到的第一个与obj相同的向量成员。
(2)public final synchronized void removeAllElement()
删除向量中所有的对象。
(3)public final synchronized void removeElementlAt(int index)
删除index所指的地方的对象。

查询搜索功能

(1)public final int indexOf(Object obj)
从向量头开始搜索obj,返回所遇到的第一个obj对应的下标,若不存在此obj,返回-1。
(2)public final synchronized int indexOf(Object obj,int index)
从index所表示的下标处开始搜索obj。
(3)public final int lastIndexOf(Object obj)
从向量尾部开始逆向搜索obj。
(4)public final synchronized int lastIndexOf(Object obj,int index)
从index所表示的下标处由尾至头逆向搜索obj。
(5)public final synchronized Object firstElement()
获取向量对象中的首个obj。
(6)public final synchronized Object lastElement()
获取向量对象中的最后一个obj。

实例

了解了向量的最基本的方法后,我们来看一下例子VectorApp.java。
例 VectorApp.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
importjava.util.Vector;
importjava.lang.*;
//这一句不应该要,但原文如此
importjava.util.Enumeration;
public class VectorApp
{
    public static void main(String[]args)
    {
        Vector<Integer> v1=new Vector<Integer>();//jdk1.5以后增加了对的支持!
        Integer integer1=new Integer(1);
        /**
        *因为Vector<Integer>已经指定为Integer类型
        *当v1.addElement("one")时会报错,类型不符
        *ThemethodaddElement(Integer)inthetypeVector<Integer>isnotapplicablefor
        *thearguments(String)
        */
        //加入的为字符串对象
        v1.addElement("one");
        v1.addElement("two");
        //加入的为Integer的对象
        v1.addElement(integer1);
        v1.addElement(newInteger(2));
        System.out.println("Thevectorv1is:\n\t"+v1);
        //此处的输出结果为:Thevectorv1is:[1,2]
        /**
        *ThemethodinsertElementAt(Integer,int)inthetypeVector<Integer>isnotapplicablefor
        *thearguments(String,int)
        *insertElementAt()是指:Insertsthespecifiedobjectasacomponentinthisvectorat
        *thespecifiedindex.
        */
        //将v1转换成字符串并打印
        v1.insertElementAt("three",2);
        v1.insertElementAt(newFloat(3.9),3);
        System.out.println("Thevectorv1(usedmethodinsertElementAt())is:\n\t"+v1);
        //以上运行,请改Vector<Integer>为Vector<Float>
        /**
        *setElementAt(Eobj,intindex)的用法
        *Setsthecomponentatthespecifiedindexofthisvectortobethespecifiedobject.
        *Thepreviouscomponentatthatpositionisdiscarded.              
        *Theindexmustbeavaluegreaterthanorequalto0andlessthanthecurrentsizeofthevector.
        */
        //将指定位置的对象设置为新的对象
        v1.setElementAt(2,1);
        System.out.println("Thevectorv1(usedmethodsetElementAt())is:\n\t"+v1);
        //从向量对象v1中删除对象integer1由于存在多个integer1所以从头开始找,删除找到的第一个integer1
        v1.removeElement(integer1);
        //使用枚举类(Enumeration)的方法来获取向量对象的每个元素
        Enumerationenum=v1.elements();
        System.out.print("Thevectorv1(usedmethodremoveElement())is:");
        while(enum.hasMoreElements())
        System.out.print(enum.nextElement()+"");
        System.out.println();
        System.out.println("Thepositionofobject1(top-to-bottom):"
+v1.indexOf(integer1));
        System.out.println("Thepositionofobject1(tottom-to-top):"
+v1.lastIndexOf(integer1));
        //按不同的方向查找对象integer1所处的位置
        v1.setSize(4);
        System.out.println("Thenewvector(resizedthevector)is:"+v1);
        //重新设置v1的大小,多余的元素被行弃
    }
}
运行结果:
E:\java01>java VectorApp
The vector v1 is:
[one,1,1,two,2,1,1]
The vector v1(used method insertElementAt())is:
[one,1,three,3.9,1,two,2,1,1]
The vector v1(used method setElementAt()) is:
[one,1,four,3.9,1,two,2,1,1]
The vector v1(used method removeElement())is:
one four 3.9 1 two 2 1 1
The position of object 1(top-to-bottom):3
The position of object 1(tottom-to-top):7
The new vector(resized the vector)is:
[one,four,3.9,1]
E:\java01>
从例1中运行的结果中可以清楚地了解上面各种方法的作用,另外还有几点需解释。
(1)类Vector定义了方法
public final int size()
此方法用于获取向量元素的个数。它的返回值是向量中实际存在的元素个数,而非向量容量。可以调用方法capactly()来获取容量值。
方法:
public final synchronized void setsize(int newsize)
此方法用来定义向量大小。若向量对象现有成员个数已超过了newsize的值,则超过部分的多余元素会丢失。
(2)程序中定义了Enumeration类的一个对象
Enumeration是java.util中的一个接口类,在Enumeration中封装了有关枚举数据集合的方法。
在Enumeration中提供了方法hasMoreElement()来判断集合中是否还有其它元素和方法nextElement()来获取下一个元素。利用这两个方法可以依次获得集合中元素。
Vector中提供方法:
public final synchronized Enumeration elements()
此方法将向量对象对应到一个枚举类型。java.util包中的其它类中也大都有这类方法,以便于用户获取对应的枚举类型。
3. vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值[2] 
和 string 对象一样,标准库将负责管理与存储元素相关的内存。我们把 vector称为容器,是因为它可以包含其他对象,能够存放任意类型的动态数组,增加和压缩数据。一个容器中的所有对象都必须是同一种类型的[2]
vector 是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存 string 对象的 vector,或保存 int 值的 vector,又或是保存自定义的类类型对象(如Sales_items 对象)的 vector。vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring AOP 代理模式

记录几篇关于AOP & 代理模式 的博客&#xff0c;写的非常好&#xff0c;感谢作者分享&#xff01; Java中的代理模式——静态代理以及分析静态代理的缺点 Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别 Spring中的AOP以及切入点表达式和各种通知 Spring…

mongodb 多表查询

今天有一个业务涉及到mongodb的多表查询&#xff0c;大体记录下语句结构 db.table_a.aggregate([ {$lookup:{from:"table_b",localField:"userid",foreignField:"userid",as:"organization_doc"}}, //联表B{ $project:{ _id:1, card…

跨平台多线程编程

多线程介绍POSIX 1003.1-2001 定义了多线程编程的标准API。这个API就是广为人知的pthreads。它的目的在于为跨平台编写多线程程序提供便利。多线程程序的编写本文介绍了Linux 和 WIN32 平台下的多线程程序的编写方法Linux 系统对 pthreads 提供了良好的支持。一般地安装完Linux…

方法重载和方法重写

方法重载 &#xff08;1&#xff09; 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在&#xff0c;具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。 &#xff08;2&#xff09; Java的方法重载&#xff0c;就是在类中可以…

shell获取/etc/passwd中的用户名和id

核心思想&#xff1a;cut 关键词&#xff1a;head tail cut #!/bin/bash # get the information about /etc/passwd PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHfile"/etc/passwd" linewc -l $file | cut -d" "…

进度条控制(Windows 公共进度栏控件的功能)

MSDN&#xff1a;https://msdn.microsoft.com/zh-cn/library/sys15k39.aspx 构造 CProgressCtrl 对象&#xff1a;  CProgressCtrl(); 创建进度栏控件&#xff1a;  virtual BOOL Create( DWORD dwStyle(风格), const RECT& rect(位置大小), CWnd* pParentWnd(父窗体),…

本地浏览器缓存sessionStorage(临时存储) localStorage(长期存储)的使用

对浏览器来说&#xff0c;使用 Web Storage 存储键值对比存储 Cookie 方式更直观&#xff0c;而且容量更大&#xff0c;它包含两种&#xff1a;localStorage 和 sessionStorage sessionStorage&#xff08;临时存储&#xff09; &#xff1a;为每一个数据源维持一个存储区域&am…

HTML5的历史

HTML5和WHATWG[1] 2004年Opera的IanHickson&#xff08;现在Google工作&#xff09;发起的HTML新标签扩展以适应新的web应用&#xff0c;该发起遭到W3C的拒绝&#xff0c;而W3C凭空杜撰的作风引起了部分人的不满&#xff0c;来自Opera,Apple&#xff0c;以及Mozilla的代表开始…

B-TREE、B+TREE、数据库索引

推荐文章&#xff1a; B-Tree详解 SQL夯实基础&#xff08;五&#xff09;&#xff1a;索引的数据结构 MySQL B树索引和哈希索引的区别 感谢作者分享&#xff01;

《重构-改善既有代码的设计》-第1例:租赁影片(1)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 买了《重构 - 改善既有代码的设计 》一书&#xff0c;一直没有好好看&#xff0c;大致过了下也觉得只是有点点印象而已&#xff0c;最后…

java类加public和不加public

加public表示全局类&#xff0c;该类可以import到任何类内。不加public默认为保留类&#xff0c;只能被同一个包内的其他类引用。

STL数据结构

STL数据结构 1.priority_queue #include<queue> pritority<int>q;(大根堆) priority_queue<int,vector<int>,greater<int> >q;(小根堆) struct no{ int x,v; bool operator <(const no &T)const{return v>T.v;} // v值xiao的优先 }; q…

《netty实战》阅读笔记(2)——Netty 的数据容器ByteBuf

ByteBuffer 当我们进行数据传输的时候&#xff0c;往往需要使用到缓冲区&#xff0c;常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer。 实际上&#xff0c;7种基础类型&#xff08;Boolean除外&#xff09;都有自己的缓冲区实现&#xff0c;对于NIO编程而言&#xff0c;我们…

JAVA HASHMAP 用法

import java.util.HashMap;public class Student { String name; String sex; public Student(String n,String s) { namen; sexs; } public String toString(){ return ("姓名:"name"\n""性别:"sex"\n…

有了二叉查找树、平衡树为啥还需要红黑树?

参考文章&#xff1a; 有了二叉查找树、平衡树为啥还需要红黑树&#xff1f; 漫画AVL树 谢谢作者分享&#xff01;

32位Windows7上8G内存使用感受+xp 32位下使用8G内存

我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽...速度超快...基本没有等待的概念...深有体会... 为什么要使用8G内存&#xff1f;在国内外各大论坛上&#xff0c;这都是一个有争议的问题。问题的反方论据非常充分&#xff1a; 除了少数专业领域&#xff0c;大多数应用程…

《重构-改善既有代码的设计》-第1例:租赁影片(2)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 上接 重构-改善既有代码的设计-第1例&#xff1a;租赁影片&#xff08;1&#xff09; 2 运用多态取代与价格相关的条件逻辑 2.1 最好不…

elasticsearch 的查询 /_nodes/stats 各字段意思

/_nodes/stats 字段意思 “” 1 { 2 "_nodes": {3 "total": 1,4 "successful": 1,5 "failed": 06 },7 "cluster_name": "ELKTEST",8 "nodes": {9 "lnlHC8yERCKXCuAc…

看完Java的动态代理技术——Pythoner笑了

Java的动态代理常用来包装原始方法调用&#xff0c;用于增强或改写现有方法的逻辑&#xff0c;它在Java技术领域被广为使用&#xff0c;在阿里的Sofa RPC框架序列化中你能看到它的身影&#xff0c;Hibernate的实体类功能增强也是以动态代理的方式解决的&#xff0c;还有Spring吹…

shell实现从1加到100

#!/bin/bash # test"while do done"PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHsum0 for i in $(seq 1 100); do let sumi done echo "The sum is > $sum "