【问题标题】:What is the most efficient way to add a string to this string array?将字符串添加到此字符串数组的最有效方法是什么?
【发布时间】:2013-11-01 15:12:09
【问题描述】:

我有一个名为 myStrings 的字符串 []。我不能将它转换为其他任何东西,它必须保持一个字符串数组。但是,我需要再添加一个字符串,所以我编写了这个方法。我确信有一种更好、更快、内存占用更少的方法可以做到这一点,但我看不到。谁能提供一个 java api 唯一的方法来比我更好地解决这个问题?我正在使用 Java 1.7

String[] myStrings;  // this gets set to real values later in program.

public void addToMyStrings(String addMe){
    List<String> list = Arrays.asList( myStrings );
    if( list != null )
    {
        list.add( addMe);
        myStrings = list.toArray( new String[0] );
    }
}

【问题讨论】:

  • 你为什么要使用这种扭曲的逻辑?
  • 你为什么不直接使用ArrayList?
  • 基于“我需要再添加一个字符串”,听起来您正在热修补您遇到的问题。请详细说明您决定这样做的原因。
  • 我知道 ArrayList 似乎可以解决所有问题,但其中一些不是我的代码,就像你说的那样,我正在修补这里。
  • 我猜你对正在发生的事情有了更好的理解。在这种情况下,我的规则是不要热补丁,因为它只会在以后产生问题。我实际上会研究您尝试对其进行热修复的逻辑,并找出为什么您的字符串数组具有 -1 必要元素。这可能是这里的问题,也可能是该逻辑中的问题。

标签: java arrays string memory-efficient


【解决方案1】:

您不能将项目添加到由Arrays.asList(..) 返回的List&lt;T&gt;:

返回一个由指定数组支持的固定大小列表。 (更改返回的列表“直写”到数组。)此方法与 Collection.toArray() 结合,充当基于数组和基于集合的 API 之间的桥梁。

您可以使用从数组中手动​​构建的单独的List,也可以直接使用Arrays:

String[] newStrings = Arrays.copyOf(myStrings, myStrings.length()+1);
newStrings[myStrings.length()] = addMe;

【讨论】:

    【解决方案2】:

    如果您绝对必须使用 Array,那么您可以模仿 ArrayList 所做的事情,并根据需要将其大小加倍。这样一来,大多数插入都是非常有效的(O(1))复杂度,但每隔一段时间你就必须做一个 O(n) 复杂度的完整数组复制。

    【讨论】:

      【解决方案3】:

      这是一个糟糕的设计决策。如果需要改变myStrings,则需要从头声明为动态List。

      如果您想将其保留为固定绑定数组,请尝试为其指定一个您知道在实例化时永远不会超过的大小。

      如果你不能这样做,你可以使用ArrayUtils.add(T[] array,T element)
      该方法复制您的数组并在最后添加一个项目。它应该比您的算法快,但不会快很多。

      出于所有实际目的,除非我看到瓶颈,否则我不会担心性能。例如,如果您希望您的数组包含 3-4 个项目,那么暂时不必担心这一点。过早的优化是邪恶的。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 2020-10-24
        • 2012-05-16
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        相关资源
        最近更新 更多