既然你知道开始的大小,为什么不直接使用数组呢?不幸的是,Java 泛型阻止数组元素本身成为具体的泛型类型,但您可以使用通配符:
LinkedList<?>[][] lists = new LinkedList<?>[n][n];
或者在内存中效率更高,只需一个数组:
LinkedList<?>[] lists = new LinkedList<?>[n * n];
// Then for access...
lists[y * n + x] = ...;
然后你需要对每个访问进行强制转换 -@SuppressWarnings
假设你知道它总是有效的(假设你适当地封装它)。我会把它放在一个地方:
@SuppressWarnings("unchecked")
private LinkedList<Foo> getList(int x, int y) {
if (lists[y][x] == null) {
lists[y][x] = new LinkedList<Foo>();
}
// Cast won't actually have any effect at execution time. It's
// just to tell the compiler we know what we're doing.
return (LinkedList<Foo>) lists[y][x];
}
当然,在这两种情况下,如果需要,您都需要使用空链表填充数组。(如果几个链表最终没有任何节点,您可能希望只考虑延迟填充它们。)
我当然不会生成一个包含数百个变量的类。这将使对列表的编程访问变得非常痛苦,并且在许多方面基本上都是一个坏主意。