ArrayList,Vector,LinkedList的区别及其优缺点?

ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但是它们具有各自不同的特征,主要如下: 一,同步 ArrayList,LinkedList未同步,并且Vestor已同步。 因此,如果您不需要线程安全,则可以使用ArrayList或LinkedList,可以节省同步开销。 但是在多线程的情况下,有时您必须使用Vector。 当然,有一些方法可以包装ArrayList,LinkedList,以便它们也可以实现同步,但是效率可能会降低。 二,增长数据 从内部实现机制来讲,ArrayList和Vector都使用Objec数组存储。 当您将元素添加到这两种类型时,如果元素数量超过内部数组的当前长度,它们都需要扩展内部数组的长度。 默认情况下,Vector会自动增长原始ArrayList大小的两倍。 在50%的空间中,最终您得到的这个收藏总是占据比实际需要更多的空间。 因此,如果要在集合中保存大量数据,使用Vector会有一些好处,因为可以通过设置集合的初始大小来避免不必要的资源开销。 三,搜索,插入,删除对象的效率 ArrayList和Vector,从指定位置(索引)检索对象,或在集合末尾插入,删除对象的同时,可以表示为O(1)。 但是,如果您在集合中其他位置添加或删除元素,则花费的时间将线性增加:O(ni),其中n是集合中元素的数量,而i是添加或删除元素的索引位置。 为什么会这样呢? 假设在执行上述操作时,集合中第ith个元素和第ith个元素之后的所有元素都将对对象执行(ni)个位移操作。 在LinkedList中,在集合中的任何位置插入和删除元素都需要花费相同的时间-O(1),但是索引元素O(i)的速度较慢,其中i是索引的位置。…

识别,调试和防止因多尺度隐式约束而引起的软件问题

识别: 如果您将某个软件看作是一组任意的系统,它们相互影响以在多个级别上创建更大的系统,那么您将看到如何查看任何给定级别上的行为必须包括其之上的所有级别。 因此,例如: 对一组连续方法的调用涉及许多不同的类,它们是在较大的程序系统中实例化的各个系统。 这些方法中的许多方法受到各种编程规则的约束,这些规则可以在方法级别,类级别,过程级别,模块级别,整个系统级别进行定义,或者可能具有来自整个系统本身环境的其他约束。正在运行。 各个方法可能同时受不同级别的规则以多种方式约束。 在给定的测试中,更改到程序的另一个区域后,当该测试作为整个系统的一部分运行时,单个方法会失败,但是仍然作为单元测试通过,并且仍然通过各种“簇”的子集集成测试。 直接的直觉是认为该方法中的错误已被其他地方的更改所暴露,但是对该方法的分析并未发现任何问题。 可能发生的情况是,其他地方的更改引入了隐式约束,以副作用的方式,如果该约束生效,则会阻止该方法起作用。 不同的“聚集”测试可能会也可能不会执行该约束,因为它们可能涉及约束起源于或未约束的系统级别。 不同系统组件的集成程度越高,这种类型的交互作用就越常见,预测隐式约束的难度就越大。 这是开发人员遇到的最令人沮丧的错误模式之一。 它们导致如此多的挫败感的原因之一,是我们通常用于解决问题的方法与这些情况下所需要的方法直接相反。 解决方法: 通常,当在“整个系统”级别看到问题时,“根本原因”分析的方法包括将系统分解为更易于管理的部分,以便定位问题。 这个问题与将动物分开以寻找引起不适的原因没有什么不同-您可能会发现,但在仍然活着的动物中却不是。 “根本原因”这个名称本身定义了初始错误-原因根本不在“根本”级别上,而是在整个系统或环境级别上,对于后者,进一步的问题涉及在外部重现它。特定客户的环境。 假设您确实设法在整个系统级别重现该问题,那么,只要您有经验的人都有很多开发经验,就可以在您尝试分解问题区域时立即告诉您这些问题,而这些问题只是“消失”了。…