在Java中使用List

Chr*_*way 5 java collections list guava

说我有一个java.util.List list,我想创建一个新List加入的元素e,以年初list(即,我想缺点 elist).例如,如果list

[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

e5,再cons(e,list)

[5,1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

它的元素listcons(e,list)共享是可以的,但list不应该被修改.

实施最简单和/或最有效的方法是cons什么?结果不可修改是可以的.允许使用Google Collections Library.

如果listcom.google.common.collect.ImmutableList

Car*_*ter 8

public static<T> List<T> cons(List<T> list, T t) {
    ArrayList<T> result = new ArrayList<T>(list);
    result.add(0, t);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

编辑回应评论:由于问题是"最简单和/或最有效的方式来实施利弊",我选择了"最简单".我不会惊讶地发现有更有效的方法.将元素放在列表之前是另一种有效的方法,并且最初分配正确的大小可能会提高性能.过早优化是万恶之源.

  • 这将遍历列表TWICE的元素; 一次将所有内容从列表复制到结果,再次将元素移位添加.使用LinkedList和addFirst消除了第二个数组遍历. (7认同)
  • 创建具有require容量的ArrayList可能更有效,添加第一个元素然后addAll列表.但我认为最初的问题是希望将元素添加到列表的末尾,而这并不重要. (3认同)

MBC*_*ook 7

Clojure提供了那种Lisp-y的东西.虽然大多数人都认为使用Clojure语言(就像我一样),但Clojure库都是真正的Java代码,如果你愿意,你可以使用Java中的数据结构作为一个特殊的库.通过这种方式,您可以获得利弊等等,并获得Clojure使用的不变性.Clojure数据strcutres也实现了等效的Java类型.

只是从不同的方向思考.

  • 一个时间肯定会到来的想法.事实上,STM可能是Clojure对JVM生态圈的更持久的贡献. (3认同)

Ale*_*x B 2

您可以使用CompositeCollection吗?

public Collection cons(Collection c1, Collection c2)
{
    CompositeCollection cons = new CompositeCollection();
    cons.addComposited(c1);
    cons.addComposited(c2);
    return cons;
}
Run Code Online (Sandbox Code Playgroud)

这不会受到参数之一是否不可变的影响,并且仍然由原始集合 c1 和 c2 支持。

如果您需要,List我可能会执行以下操作:

public List cons(Collection c1, Collection c2)
{
    ArrayList cons = new ArrayList(c1.size() + c2.size());
    cons.addAll(c1);
    cons.addAll(c2);
    return cons;
}
Run Code Online (Sandbox Code Playgroud)

  • 生成的集合是列表吗? (3认同)