Java 什么';它更高效、更紧凑:是一组庞大的linkedlist变量,还是一个包含这些变量的二维arraylist?

Java 什么';它更高效、更紧凑:是一组庞大的linkedlist变量,还是一个包含这些变量的二维arraylist?,java,Java,我想创建一个大矩阵(n乘n),其中每个元素对应(某些对象的)LinkedList 我也可以 创建n*n个单独的链表,并在循环中使用eval()对其进行命名,循环将遍历两个维度(或类似的维度),以便最终得到LinkedList_1_1、LinkedList_1_2等。每个都有一个唯一的变量名。基本上,完全跳过矩阵 创建一个ArrayList的ArrayList,然后将一个链表推送到每个元素中 如果我想在以后的代码中引用单个LinkedList时节省时间和空间,并便于访问,请向我推荐一种方法。方法1

我想创建一个大矩阵(n乘n),其中每个元素对应(某些对象的)LinkedList

我也可以

  • 创建n*n个单独的链表,并在循环中使用eval()对其进行命名,循环将遍历两个维度(或类似的维度),以便最终得到LinkedList_1_1、LinkedList_1_2等。每个都有一个唯一的变量名。基本上,完全跳过矩阵

  • 创建一个ArrayList的ArrayList,然后将一个链表推送到每个元素中

  • 如果我想在以后的代码中引用单个LinkedList时节省时间和空间,并便于访问,请向我推荐一种方法。方法1的易访问性很差,因为每当我想要访问特定的链表时,我都必须使用eval


    我的直觉告诉我,方法2是最好的方法,但我究竟如何形成我的初始化?

    正如您所知道的,为什么不使用数组呢?不幸的是,Java泛型阻止数组元素本身成为具体的泛型类型,但您可以使用通配符:

    LinkedList<?>[][] lists = new LinkedList<?>[n][n];
    
    当然,在这两种情况下,如果需要的话,都需要用空链表填充数组。(如果链接列表中的几个不会有任何节点,你可能只想懒散地填充它们。)
    我当然不会生成一个包含数百个变量的类。这将使对列表的编程访问变得非常痛苦,而且在许多方面基本上都不是一个好主意。

    我不知道你可以使用通用数组来存储LinkedList,thanks@WuschelbeutelKartoffelhuhn:划伤这一点-它确实会导致一些问题。正在编辑。@Wuschelbeutelkartofelhuhn:请参阅编辑。它有点难看,但基本上得到了你想要的结果。谢谢你的编辑。我预先知道我将用什么类型的对象填充n*n LinkedList。在这种情况下,我还需要使用通配符类型说明符吗?我将使用您的第一个(2D)语句,因为它看起来更容易使用。@Wuschelbeutelkartofelhuhn:是的,我相信您仍然需要一个通配符-仅使用
    List[]
    的简单测试对我来说失败了,但
    List[]
    有效。尽量将所有未检查的操作保留在尽可能少的位置。
    LinkedList<?>[] lists = new LinkedList<?>[n * n];
    
    // Then for access...
    lists[y * n + x] = ...;
    
    @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];
    }