`
lukew
  • 浏览: 51627 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Vector 总结

阅读更多
Vector是在java编程中比较常用的动态数组。一直以为它是个数组的链表,当内存不够用了,就新申请一个capacityIncrement大小的数组,连到原来的链表上。
在仔细阅读源代码后发现,Vector并没有任何链表的性质。它是一个纯粹的数组。当内存不够用时,就重新初始化一个容量较大新数组,然后使用System.arraycopy()函数将原有的数组copy到新的数组当中。

System.arraycopy()是一个由系统平台来实现的函数,这样的系统调用性能是比较高的。
即使如此,我们在写程序时,注意initialCapacity(初始容量)和capacityIncrement(增量)的设置,将会有效的减少重新定义数组并且拷贝数组的次数。

例如:
<!---->Vector v = new Vector(1010);//初始容量为10,增量10
Integer[] ints = new Integer11;
for (int i = 0; i < ints.length; i++) {
ints 
= new Integer(i);
v.addElement(ints);
}

在这里,当v添加第11个Integer的时候,v就会自动创建一个长度为20的数组(当前容量+增量),以后每次装满数组,都会重新按增量追加数组长度。
所以,设置一个合适的初始容量和增量,将会提高Vector的效率。千万别像我一样,把它当做链表。因为链表在增长空间时是不会影响到以前使用的空间和数据的。

我想指出一点,因为Vector中存储的,实际上都是Object变量,大家可以把它理解为指针。重新初始化Vector内置的数组并且拷贝,相当于对一个指针数组进行操作,并不等同于对输入类型的重新分配内存。
就是说Vector的重新分配,不论进行多少次都不涉及到Integer对象的创建,拷贝等工作。它只是重新创建并拷贝“指针”数组,也就是Object数组。
此外,java中有一个容易被忽视的基本概念。当某个对象再没有指向该对象的引用时,垃圾回收器才会自动将其自动释放。不小心使用,很容易给程序造成内存问题。
例如:

<!---->Vector v = new Vector(1010);//初始容量为10,增量10
Integer[] ints = new Integer11;
for (int i = 0; i < ints.length; i++) {
ints 
= new Integer(i);
v.addElement(ints);
}
ints 
= null;//对它的释放将造成数组元素的释放。但是由于v中还保存有元素的引用,所以这些Integer对象并不会被回收。
我强调这个问题,是因为曾经写过一段代码:
Image img = Image.createImage(”/xxx.png”);
Image img2 = img;
这张图片非常大,在使用完img之后,我释放掉它,然后重新申请另一个图片。于是,内存爆了。因为img2仍然持有xxx.png的引用,所以无法释放。
Vectro中存储的也是引用,所以在使用时应该更加注意编程规范,以免发生类似的问题。其实应该尽量避免使用多个引用。

上面说了这些题外话,正是想警告各位程序员,Vector是一个可变的Object数组,一个引用数组。所以请大家使用时要小心,别想当然的以为它是一个容器,它里面存储的可不是对象,而是引用。
而且,在释放曾经加入到vector的对象时,对象本身并不会被真正释放,得到回收。只是原有的引用无法再使用罢了。

最后还有一点技巧。
应该尽量使用索引获取对象,避免使用IndexOf()方法。把它当做堆栈来使用时更应该注意,要避免使用insertElementAt()方法。
此外,j2me中的Stack类是基于Vector实现的,使用时也要留心。
分享到:
评论

相关推荐

    (Vector Cast)UT 工程的总结问题

    这篇总结将深入探讨在Vector Cast环境下进行UT工程时可能遇到的问题以及解决方案。 1. **Vector Cast介绍**:Vector Cast 是一套全面的静态和动态测试工具,包括单元测试、覆盖率分析、静态分析等功能。它提供了一...

    Vector Cast使用手册

    总结来说,Vector Cast是一款强大的测试工具,它简化了单元测试和集成测试的过程,通过自动生成测试用例,提高了测试效率和覆盖率。在实际开发中,充分利用Vector Cast的功能,可以帮助我们构建更可靠、更稳定的软件...

    最全Vector用法总结.pdf

    《最全Vector用法总结》 C++标准库中的`std::vector`是一个非常重要的容器,它提供了动态数组的功能,支持高效地进行插入和删除操作。`vector`的存储空间是连续的,这使得随机访问其元素变得非常快速。本文将全面...

    最全Vector用法总结.docx

    《最全Vector用法总结》 在C++标准库中,`std::vector`是一个非常重要的容器,它提供了动态数组的功能,允许我们在运行时改变其大小。`std::vector`是容器模板类,提供了许多便利的操作,使得在处理序列数据时更加...

    vector详细用法

    ### 总结 Vector是一个非常强大且灵活的容器,在C++编程中有着广泛的应用。理解Vector的基本操作以及如何高效地使用它是掌握C++的重要一步。通过本文介绍的各种方法和示例,相信你已经对Vector有了更深入的理解。

    vector flash

    ### 总结 Vector Flash Bootloader是一款强大的工具,专为简化嵌入式系统的固件更新流程而设计。通过其丰富的功能和用户友好的界面,开发人员可以轻松管理整个更新过程,同时确保安全性与可靠性。无论是对于初学者...

    用vector写的学生管理系统

    总结来说,"用vector写的学生管理系统"是一个结合了C++的vector容器、面向对象编程和基本文件操作的实例。通过这个项目,我们可以深入理解vector的使用,掌握如何用C++实现简单的数据管理,同时也能提升对C++标准...

    java vector 使用实例

    总结起来,`Vector`在Java中提供了一种线程安全的动态数组实现,但其性能开销使其在大多数情况下不如非同步的`ArrayList`。理解和掌握`Vector`的特性对于了解Java集合框架的历史和理解多线程编程中的数据容器选择至...

    vector的详细用法.txt

    ### 总结 `Vector`作为一种线程安全的集合,在多线程环境中非常有用,尤其是在需要确保数据一致性的情况下。然而,它的性能通常不如非线程安全的集合如`ArrayList`,因为后者避免了不必要的同步开销。因此,在选择...

    vector实现矩阵运算

    ### 总结 本篇文章介绍了如何使用 C++ 中的 `vector` 类来实现矩阵运算。通过嵌套 `vector` 的方式创建矩阵,不仅可以方便地初始化矩阵,还可以高效地进行矩阵的填充、相加等操作。此外,还讨论了 `vector` 的性能...

    java.util.vector中vector小结

    这篇文章将对`Vector`类进行详细的总结,包括其特点、用法以及与`ArrayList`的区别。 1. **Vector类的特性** - **线程安全**:`Vector`类的所有操作都是线程安全的,这意味着在多线程环境中,你不需要额外的同步...

    Vector3-data Json-ParsingPlayerPrefs

    总结起来,通过JSON解析,我们可以克服`PlayerPrefs`不支持`Vector3`的限制,实现`Vector3`数据的存储。这种方法既简单又实用,适用于大多数需要保存和恢复`Vector3`值的场景。然而,开发者也应关注数据安全性和性能...

    C++ vector基础

    C++ vector 基础知识点总结 vector 是 C++ 标准模板库中的一个多功能的模板类和函数库,能够操作多种数据结构和算法。它是一个容器,能够存放各种类型的对象,简单地说,vector 是一个能够存放任意类型的动态数组,...

    java vector

    ### 六、总结 通过上述内容我们可以看到,`Vector`提供了丰富的API来处理动态数组的需求。虽然在单线程环境中`ArrayList`可能因为非同步而拥有更好的性能,但在多线程环境下,为了保证数据的一致性和安全性,选择`...

    vector操作vector操作vector操作

    ### 总结 总的来说,`vector`、`list`和`deque`各有特点,在选择使用时应考虑具体的应用场景和性能需求。`vector`适合需要频繁访问元素且对空间连续性有一定要求的情况;`list`则适用于需要频繁在两端进行插入删除...

    c++中的vector的使用方法

    ### 总结 通过本文,我们详细介绍了C++中`vector`的基本使用方法,包括声明、初始化、数据的插入和输出等操作。同时,我们也探讨了如何处理二维`vector`的问题,这对于解决实际编程问题具有重要的意义。理解和熟练...

    vector的用法.doc

    总结,`std::vector`是C++中非常实用的容器,其动态增长和缩小的能力,以及丰富的接口和与STL的集成,使其成为处理动态数据集合的首选工具。理解并熟练运用`std::vector`能显著提高C++编程的效率和代码质量。

Global site tag (gtag.js) - Google Analytics