• 阐述 ArrayList、Vector、LinkedList 的存储性能和特性?


    ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的

    数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉

    及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 中的方法由

    于添加了 synchronized 修饰,因此 Vector 是线程安全的容器,但性能上较

    ArrayList 差,因此已经是 Java 中的遗留容器。LinkedList 使用双向链表实现存

    储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索

    引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更

    高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本

    项的前后项即可,所以插入速度较快。Vector 属于遗留容器(Java 早期的版本中

    提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties

    都是遗留容器),已经不推荐使用,但是由于 ArrayList 和 LinkedListed 都是非

    线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类

    Collections 中的 synchronizedList 方法将其转换成线程安全的容器后再使用(这

    是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强

    实现)。

    补充:遗留容器中的 Properties 类和 Stack 类在设计上有严重的问题,Properties

    是一个键和值都是字符串的特殊的键值对映射,在设计上应该是关联一个

    Hashtable 并将其两个泛型参数设置为 String 类型,但是 Java API 中的

    Properties 直接继承了 Hashtable,这很明显是对继承的滥用。这里复用代码的

    方式应该是 Has-A 关系而不是 Is-A 关系,另一方面容器都属于工具类,继承工具

    类本身就是一个错误的做法,使用工具类最好的方式是 Has-A 关系(关联)或

    Use-A 关系(依赖)。同理,Stack 类继承 Vector 也是不正确的。Sun 公司的工

    程师们也会犯这种低级错误,让人唏嘘不已。

  • 相关阅读:
    【转】CentOS8新特性
    【转】Python 库打包分发(setup.py 编写)简易指南
    【转】Python3的venv虚拟环境操作(Linux)
    【转】Qt绘图之QGraphicsScene QGraphicsView QGraphicsItem详解
    【转】Qt 积累
    webapi 参数传递详解
    WPF 字体图标样式
    asp net core mvc 跨域ajax解决方案
    NPOI导出Excel封装
    XML序列化CDATA
  • 原文地址:https://www.cnblogs.com/programb/p/13021364.html
Copyright © 2020-2023  润新知