数组的缺点和缺点是什么?

时间:2010-10-03 20:29:41

标签: java

我想知道数组的缺点是什么。我认为,了解数组是否是在特定情况下存储数据的最佳方式或预测执行时间非常有用。

编辑1:根据我理解的数组澄清:

  1. 有限,但固定大小的存储空间,用作顺序数据容器可变 。一个或多个索引用于引用特定数据容器。
    1. 如果类型为原始,则包含的数据必须为相同类型
    2. 如果type为object(这是 polymorphism ),则包含的数据必须是相同数据类型后代,这种类型类型转换的类型更窄到更宽也称为协变转换。
    3. Java中的
    4. 所有数组 1维数组
    5. 交换元素或查找元素及其索引 快速操作
    6. 添加/删除元素是操作,因为重新创建了数组
    7. 元素类型在运行时强制执行,这称为数组具体化
    8. Java数组方法在java.util.Arrays中,您甚至不包含基本数组操作方法,如 union 交集。令人遗憾的是,guava库并不是标准Java的一部分。
    9. 对象数组中填充了引用到实际存在数据的存储位置。
  2. 数组数组称为 2维数组
    1. 2d数组第一个数组用引用填充到其他数组。
    2. 其他数组不会按顺序存储。
    3. 其他数组的元素大小可能会有所不同,这称为参差不齐 - 和锯齿状数组
    4. Java数组具有行主要顺序
    5. 数组尺寸通常限制为255 ,但与实施情况不同。
  3. 例外情况和重要说明。

    1. 如果是托管内存环境,数据元素绝对位置可以是顺序,但很可能不是。
    2. 直接使用的阵列不能线程安全不可变具有交易完整性,因此,没有直接的方法可以去的平行即可。
    3. 如果您需要查找排序数组中是否包含特定数据,您可以使用二进制搜索,这比 hashset.contains < strong>我假设使用 VMMemoryManager.getIdentityHashCode ,这基本上只是旧学校调制演算,并且可能发生碰撞
    4. Java 泛型只是编译器魔力,但如果您想将 Java泛型与数组一起使用,则无法使用原始类型
    5. 在Java 6中, Collections.sort()的作用类似于 - 在数组中转储数据...... - 此时差异在内存中是x2倍。
    6. 垃圾收集器真的不喜欢数组,而且你通常会在老一代中结束,并且不会很快被释放。
    7. 在数组中输入数据元素是一个坏主意,但我不记得原因。
    8. 在我看来,数组是存储数据的最佳方式之一,而不是直接存储。有时候,我的脑袋似乎就像一个垃圾桶,知识不正确。这就是我提出这个问题的一个原因 - 确认我所知道的。

4 个答案:

答案 0 :(得分:5)

从Java5开始,数组很少是存储数据的最佳方式 - 泛型集合几乎总是优越的:

  • 泛型元素(特别是通配符)带来类型安全性和灵活性 - 您不仅可以使用List<T>,还可以使用List<? extends T>List<? super T>,而不是T[](相应的三个变体中的第二个,而不是第一个)
  • 泛型的子类型是不变的,这简单地表示例如List<String> a List<Object> - 这可以避免许多运行时异常,因为编译器可以检测到它们并提供错误消息
  • 数组是固定大小的,集合可以根据需要动态调整大小
  • 集合有许多不同的风格,具有不同的功能,适用于不同的场景 - 例如链表,队列,地图,集。数组通常可以直接替换为ArrayList,但是如果你需要关联,有序,优先级,唯一值,线程安全,不可变等存储,你将难以使用数组
  • 集合有几种有用的方法,例如contains
  • 您只能创建可恢复类型的数组 - 即您无法创建List<String>[]

答案 1 :(得分:4)

您还应该了解数组的优势,并且还有一些。

  • 原始类型的数组通常每个元素占用的空间明显少于相应包装类型的集合。这部分是由于包装器对象的开销(取决于它们的创建方式),部分原因是JVM通常将布尔值,字节,字符和短路2,4或8存储到数组中的机器字中

  • 所有类型的数组的每个数组空间开销都小于集合类型。例如,ArrayList实际上是一个包含在具有2个字段的另一个对象中的对象数组。

  • 数组访问和更新比同等集合getset操作快一点。

现在,这些空间/性能差异通常不值得担心。 (集合的灵活性和便利性超过了它们。)但是,在一些数据密集型应用程序中,这些差异可能很大。

答案 2 :(得分:3)

可能最容易将它们与替代品的优势进行比较:

<强> VS。 ArrayList<T>
添加和删​​除元素更方便。除了最后添加,大多数操作与数组一样慢(和快)。

<强> VS。 LinkedList<T>
添加和删​​除元素要快得多,通过索引获取元素的速度非常慢。

vs HashSet<T>
更快containsaddremove次操作。丢失元素排序。

vs HashMap<TKey, TValue>
允许您通过索引以外的方式快速访问元素。丢失元素排序。

答案 3 :(得分:1)

总体缺点:

  • 固定长度。数组的长度在初始化时声明,之后不能更改。
  • 数组使用int作为索引。没有数组可以包含超过2^31 - 1个元素
  • 您无法创建不可变数组
  • 您无法创建通用数组