Java 从现有阵列创建一个阵列,并添加其他元素

Java 从现有阵列创建一个阵列,并添加其他元素,java,arrays,variadic-functions,Java,Arrays,Variadic Functions,我有一个方法,它接受字符串的vararg数组 void count(long delta, String... tags); 对于大多数情况,我有一个预定义的标记数组 String[] tags = { "foo_tag:Foo", "bar_tag:Bar", "baz_tag:Baz" }; 并且在每次调用“项目id:12345” 所以count的调用应该如下所示: count(del

我有一个方法,它接受字符串的vararg数组

void count(long delta, String... tags);
对于大多数情况,我有一个预定义的标记数组

String[] tags = { "foo_tag:Foo",
                  "bar_tag:Bar",
                  "baz_tag:Baz"
                };
并且在每次调用“项目id:12345”

所以count的调用应该如下所示:

count(delta, "foo_tag:Foo", "bar_tag:Bar", "baz_tag:Baz", "project_id:12345");
我如何简单地创建一个新数组,其中包含现有的一个元素和附加元素,以代替调用该方法

类似于以下假设的
数组。append
方法:

count(delta, Arrays.append(tags, "project_id:12345"));
这是一个存储统计信息的操作,而不是一个业务逻辑,所以我希望这个操作尽可能快。
目前,我有helper方法appendTag,但对我来说它看起来并不优雅

private String[] appendTag(String[] tags, String s)
{
    String[] result = new String[tags.length + 1];
    System.arraycopy(tags, 0, result, 0, tags.length);
    result[result.length-1] = s;
    return result;
}

通过一个元素来扩展数组并添加新的内容是不容易的。但如果您使用的是列表,则可以轻松添加新元素,然后在调用该方法时将其转换为数组:

String[] tags = { "foo_tag:Foo",
                  "bar_tag:Bar",
                  "baz_tag:Baz"
                };
List<String> tagList = new ArrayList<String>(Arrays.asList(tags));
tagList.add("project_id:12345");

count(delta, tagList.toArray(new String[0]));
String[]tags={“foo_tag:foo”,
“酒吧标签:酒吧”,
“baz_标签:baz”
};
List tagList=newarraylist(Arrays.asList(tags));
标记列表。添加(“项目编号:12345”);
计数(增量,标记列表.toArray(新字符串[0]);

如果你认为你有长期的需要,那么也许考虑改变<代码> CONTUTE()/CONT>来使用一个列表而不是一个数组。您还可以重载此方法并公开一个接受列表而不是数组的版本。

在java中,数组具有固定大小,因此不可能通过向数组添加新元素来扩展数组

您需要创建一个较大的新数组,并将前一个元素复制到其中,然后向其中添加新元素,但它还不是动态的


我的建议是使用也许你会从它的内置方法中获益,比如

,我认为你最好先将数组加载到ArrayList中,然后再做一个add(item\u to\u add)。然后,如果需要数组,可以调用ArrayList的ToArray()方法有没有不使用ArrayList之类的列表的原因?如果有什么不同的话,我会建议你已经有了相同的解决方案。我考虑过这一点,但这对于统计来说太昂贵了logging@DenisKurochkin然后考虑重构<代码> CONTUTE()/Cux>对集合进行操作,而不是对数组进行操作。<代码> COUNTHER()/<代码>不是我的,这是第三方library@DenisKurochkin您是否可以从一个带有一些空插槽的较大阵列开始?
count()
方法是否忽略
null
条目?数组中预定义的空插槽是一种反模式,我不会使用它是的,看起来这是硬编码静态标记的唯一方法values@DenisKurochkin是的,这是最干净、最安全的方法。