![](/img/trans.png)
[英]Difference between LinkedList<T> clear and new LinkedList<T> in a multithreaded environment
[英]difference new LinkedList<>(new LinkedList<>()) and new LinkedList…, add
更新:感谢您提供所有答案。 我找到的最干净的解决方案是:
if ( k<=0 ) return new LinkedList<>(Arrays.asList(new LinkedList<>()));
我有一个递归方法,可从列表中生成所有“ n选择k”组合。 在实现中,我发现创建新的LinkedList实例的两种方法之间存在奇怪的区别。
public static <T> List<List<T>> extract2(int k, List<T> list) {
if ( k<=0 ) {
// this way fails the test
return new LinkedList<>(new LinkedList<>());
// and this way works fine.
//var v = new LinkedList<List<T>>();
//v.add(new LinkedList<>());
//return v;
}
if ( list.isEmpty())
return new LinkedList<>();
T h = list.get(0);
List<T> tl = new LinkedList<>(list.subList(1, list.size()));
List<List<T>> with_h = extract2(k - 1, tl).stream()
.peek(l -> l.add(0, h)).collect(Collectors.toList());
List<List<T>> without_h = extract2(k, tl);
with_h.addAll(without_h);
return with_h;
}
该代码可以在注释完的LinkedList初始化中正常工作,但是对于new LinkedList(new LinkedList())
它将失败。
我是否正在进行某种编译器优化?
这是一个小的Junit5测试
var res = App.extract2(2, Arrays.asList("a", "b", "c", "d"));
assertThat(res, is(Arrays.asList(
Arrays.asList("a", "b"),
Arrays.asList("a", "c"),
Arrays.asList("a", "d"),
Arrays.asList("b", "c"),
Arrays.asList("b", "d"),
Arrays.asList("c", "d")
)));
这里
new LinkedList<>(new LinkedList<>());
您正在使用LinkedList
构造函数,该构造函数从参数集合中获取元素并将其添加到此LinkedList中。 它与使用add()
方法创建LinkedList
并向其中添加新的LinkedList
作为元素完全不同。
new LinkedList<>(new LinkedList<>())
创建一个新的LinkedList ,并将列表中的所有项目添加到传递给构造函数的项目中。 递交的清单为空,因此您返回的清单也为空。
var v = new LinkedList<List<T>>();
v.add(new LinkedList<>());
创建一个空列表,然后向其中添加一个空列表作为项目。 因此,第一个列表现在有一个条目。
不同之处在于,在第一个示例中,您仅创建了一个空列表,第二个示例中创建了具有(空)列表项的列表。 这导致您的算法有所不同。
感谢所有人,尤其是@Simulant的明确答案! JShell应该让我醒了:
jshell> new LinkedList(new LinkedList());
$5 ==> []
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.