java ArrayList

让我们来看看ArrayList实现的接口,

实现了Serializable, Cloneable, Iterable, Collection, List, RandomAccess, 下面来讲解一下这5个接口的特点吧,

  • Serializable
    • Serializable 是一个标记接口,它用于标记接口类,接口必须由其对象需要持久化的类来实现,序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。
  • Cloneable接口的作用
    • cloneable其实就是一个标记接口,只有实现这个接口后,然后再类中重写Object的clone方法,然后通过类调用clone方法才能成功,如果不实现该接口,则会抛出CloneNoSupportedException(异常不被支持异常)。
  • Iterable
    • 实现此接口允许对象成为进行迭代。 请参阅 For-each 循环。
  • Collection
    • 集合层级的根接口,它定义了一组可以重复的对象。
  • List
    • 有序集合(也称为序列)。可以精确控制每个元素在列表中的插入位置。 用户可以通过它们的整数索引(在列表中的位置)访问元素,并在列表中搜索元素。
  • RandomAccess
    • List 实现使用的标记接口来指示它们支持快速随机访问。 此接口的主要目的是允许通用算法改变其行为,以在应用于随机或顺序访问列表时提供良好的性能。

ArrayList的特点:

  • ArrayList底层使用的是动态数组,长度固定,默认容量是10。
  • ArrayList可以包含重复元素。
  • 不能直接更改 ArrayList 的大小,可以使用各种添加、插入和删除方法来间接完成此操作。
  • 添加更多元素时,动态数组会扩展。 所以不需要提前确定大小。
  • 可以快速查找。 就像数组一样,检索给定索引处的元素需要。
  • ArrayList的缺点:
    • 在动态数组添加新的元素需要时间,但是如果动态数组没有任何空间容纳新的条目,它就需要扩展,这也需要 O(n)O(n) 时间。
    • ArrayList 线程不安全。
    • 昂贵的插入和删除。 就像数组一样,元素彼此相邻存储。 因此,在数组中间添加或删除项目需要“跳过”其他元素,这需要时间。

细节:

  • 当分配动态数组时,动态数组实现会生成一个底层固定大小的数组。 起始大小取决于实现——假设我们的实现使用 10 个索引。 现在假设我们将 4 个条目附加到我们的动态数组中。 此时,我们的动态数组的长度为 4。但底层数组的长度为 10。
  • 如果我们尝试追加一项条目,但我们的数组容量已经满了怎么办?
    • 为了腾出空间,动态数组会自动创建一个新的、更大的底层数组。 通常大一倍。
    • 为什么不直接扩展现有数组? 因为那个内存可能已经被另一个程序占用了。
    • 每个条目都必须单独复制到新数组中。
posted @ 2021-08-08 12:11  yongjar  阅读(41)  评论(0编辑  收藏  举报