【问题标题】:Opertion performance between ArrayList or single StringArrayList 或单个 String 之间的运算性能
【发布时间】:2019-01-24 14:07:18
【问题描述】:

性能方面,是使用ArrayLists 存储值列表还是使用String(使用concat/+)更好?直觉上,我认为Strings 的性能会更好,因为它可能会比 ArrayLists 使用更少的开销,但我无法在网上找到任何东西。

此外,条目不会太大(~10)。

【问题讨论】:

  • 取决于您对“商店”的含义。商店在哪里?
  • 一个数组列表有一系列的桶,每个桶都可以在固定时间内查找。另一方面,需要拆分 10 个术语的字符串,或者撒上正则表达式药水,才能访问单个项目。长话短说,你会用字符串方法做很多跳舞,而数组列表相对较少。
  • 也取决于值。一个 pojo 列表(在程序中)比一大串 csv 数据更容易浏览
  • 对于 10 个条目,它不会有任何区别 -> 使用最简单和更易读的 -> ArrayList。
  • 使用合适的数据结构以便于维护。稍后,如果性能成为问题,则分析代码以查看可以优化的内容。

标签: java string performance arraylist


【解决方案1】:

ArrayList 操作

您可以在 O(1) 中从ArrayList获取一个值,并在 O(1) 中添加一个值。 此外,ArrayList 已经内置了可以帮助您检索和添加元素的操作。

字符串操作

串联:使用 concat 和 slice 操作,情况会更糟。字符串粗略地说是字符数组。例如,“Hello”+“Stack”可以表示为数组['H', 'e', 'l', 'l', 'o']和数组['S', 't', 'a', 'c', 'k']。 现在,如果你想连接这两个String,你必须合并两个数组的所有元素。它会给你一个长度为 10 的数组。因此,连接 - 或创建新的 char 数组 - 是在 O(n + m) 中操作。

最糟糕的是,如果您连接 n String,您将拥有 O(n^2) 的复杂度。

拆分:拆分一个String的复杂度通常是O(N)或者更多。这取决于您将为拆分操作提供的正则表达式。

String 的操作通常不那么可读,而且调试起来很棘手。

长话短说

ArrayList 通常比使用String 更好。但这一切都取决于您的用例。

【讨论】:

  • 谢谢! Big O 更有意义:)
【解决方案2】:

ArrayList 是更好的选择,因为 String 位于字符数组的下方。因此,每个连接只是将整个旧字符串复制到一个新位置,并添加了新值 - 每个操作的时间 O(n)。

当您使用 ArrayList 时,它有一个初始容量 - 直到它被填满 - 每个添加操作都在 O(1) 时间内完成。仅当数组已满时,将新字符串添加到 ArrayList 会更慢,然后需要将其复制到具有更大容量的新位置。但是只需要移动引用,而不是整个字符串 - 这比移动整个字符串要快。

当你知道你有多少元素时,你甚至可以通过设置初始容量来提高 ArrayList 的性能:

List<String> list = new ArrayList<String>(elementsCount);

【讨论】:

    【解决方案3】:

    Java 性能并非来自“聪明”的 Java 源代码。

    它源于 JIT 在运行时做得很好。

    您知道 JIT 需要什么才能做好工作吗?

    • 看起来像其他人正在编写的代码的代码(经过优化以针对其他人编写的那种代码产生最佳结果)
    • 成千上万的方法调用。

    含义:JIT 决定重新编译代码是否有意义。当 JIT 决定这样做时,只有到那时,您才需要确保它可以这样做。

    “自定义”巧妙的 java 源代码想法,例如您在此处提出的内容可能会适得其反。

    因此:不要发明一种巧妙的策略来将值分解为字符串。编写使用列表的简单、人类可理解的代码。因为列表是 Java 在这里提供的概念。

    唯一的例外是:如果您遇到真正的性能瓶颈,并且您进行了良好的分析,然后您认为:列表不够好,那么您将开始使用其他方法。但我想这还没有发生。您假设您有性能问题,并且您假设您应该以这种方式解决它。完全错误,浪费时间和精力。

    【讨论】:

    • 谢谢!这非常有帮助。作为一个开发者,我从没想过编译器会因为我使用奇怪的代码而惩罚我。如果你早点回答,我会接受这个:)
    • 一个人可以接受其他答案,但这对另一个人来说感觉很糟糕。而且这周我的名声很好,所以我真的不介意。
    【解决方案4】:

    只要使用ArrayList,它就存储了对你的对象值的引用,而且引用一点也不大,这就是使用引用的重点。我一直想知道你为什么要将值存储在字符串中......这很奇怪。 ArrayList 存储值和获取它们的速度足够快,而且 String 实现,内部也使用数组......所以......使用 ArrayList。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2018-03-17
      • 2015-02-21
      • 2012-05-26
      相关资源
      最近更新 更多