有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我也可以

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

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    既然您知道要开始的大小,为什么不使用数组呢?不幸的是,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];
    }
    

    当然,在这两种情况下,如果需要,您都需要用空链表填充数组。(如果链接列表中的几个不会有任何节点,那么你可能只想懒散地填充它们。)p>

    我肯定不会生成一个包含数百个变量的类。这将使通过程序访问列表变得非常痛苦,从很多方面来说,这基本上都是一个坏主意