Java 储存及保养;查找双数组

Java 储存及保养;查找双数组,java,lookup,Java,Lookup,我有一个相当昂贵的数组计算(SpectralResponse),我喜欢将其保持在最小值。我认为最好的方法是存储它们,并在将来再次需要相同的阵列时将其恢复。该决定是使用基本参数做出的 现在,我使用对象的LinkedList作为SpectralResponse数组,使用另一个LinkedList作为BasicParameter。BasicParameters有一个isParamsEqualTo(BasicParameters)方法来比较参数集 LinkedList<SpectralRespon

我有一个相当昂贵的数组计算(SpectralResponse),我喜欢将其保持在最小值。我认为最好的方法是存储它们,并在将来再次需要相同的阵列时将其恢复。该决定是使用基本参数做出的

现在,我使用对象的LinkedList作为SpectralResponse数组,使用另一个LinkedList作为BasicParameter。BasicParameters有一个isParamsEqualTo(BasicParameters)方法来比较参数集

LinkedList<SpectralResponse> responses
LinkedList<BasicParameters> fitParams
LinkedList<Integer> responseNumbers
但不知何故,这样做不仅会占用大量内存,实际上比直接计算光谱响应要慢。慢多了


因此,是我的实现出错了,或者我错认为预计算和查找更快了?

您正在通过索引访问LinkedList,这是最糟糕的访问方式;)

您应该改用ArrayList,或者对所有列表使用迭代器

您可能应该将三个对象合并为一个对象,并将它们保留在一个以responseNum为键的映射中


希望这有帮助

您正在通过索引访问LinkedList,这是最糟糕的访问方式;)

您应该改用ArrayList,或者对所有列表使用迭代器

您可能应该将三个对象合并为一个对象,并将它们保留在一个以responseNum为键的映射中


希望这有帮助

您可能应该使用数组类型(实际数组,如Vector、ArrayList),而不是链表。链表最适合于堆栈或队列操作,而不是索引(因为您必须从一端遍历它)。Vector是一个自动调整大小的数组,它在访问INEX时的开销较小。

您可能应该使用数组类型(实际数组,如Vector、ArrayList),而不是链表。链表最适合于堆栈或队列操作,而不是索引(因为您必须从一端遍历它)。Vector是一个自动调整大小的数组,它在访问INEX时的开销较小。

LinkedList的get(i)方法要求,要获取每个项,它必须沿着列表越走越远。考虑使用ARARYLIST、迭代器()方法,或者只使用一个数组。

< P> Link表的get(i)方法需要获取每个项目必须沿着列表进一步前进。考虑使用一个ARARYLIST,迭代器()方法,或者只使用一个数组。

< P>第二行,'<代码> IF(应答器.GET(i)=响应子> <代码> >也将是效率低下的< <代码>应答器。GET(i)< /C>是整数,并且必须被解压到int中。(Java 5以后会自动执行此操作;如果ResponseEnum声明为int,则您的代码不会在Java 1.4或更早版本上编译)。有关装箱的更多信息,请参阅


若要删除此取消装箱开销,请使用apache primitives库中的。此库包含将基础对象(在您的示例中为int)存储为基元数组(例如int[])的集合而不是对象数组。这意味着不需要装箱,因为IntList的方法返回的是基元类型,而不是整数。

第二行,
if(responseNumbers.get(i)=responseNum)
”也将是无效的,因为
responseNumbers.get(i)
是一个整数,必须将其解为整数(Java 5以后会自动执行此操作;如果ResponseEnum声明为int,则您的代码不会在Java 1.4或更早版本上编译)。有关装箱的更多信息,请参阅


若要删除此取消装箱开销,请使用apache primitives库中的。此库包含将基础对象(在您的示例中为int)存储为基元数组(例如int[])的集合而不是对象数组。这意味着不需要装箱,因为IntList的方法返回的是基元类型,而不是整数。

我建议ArrayList over Vector,特别是当您有一个大数据集时。Vector是同步的,这会降低性能。我建议ArrayList over Vector,特别是当您有一个大数据集时。Vector是同步的如果循环不检查索引0,请将循环更改为:for(i=size-1;i>=0;i--){}如果循环不检查索引0,请将循环更改为:for(i=size-1;i>=0;i--){}接受您的建议并使用HashMap,将BasicParameter和ResponseEnumber放入单个对象ask map的键中,现在快了100倍。接受您的建议并使用HashMap,将BasicParameter和ResponseEnumber放入单个对象ask map的键中,现在快了100倍。
size: LinkedList size, limited to a reasonable value
responseNumber: just another variable to distinguish the SpectralResponse.

    for ( i = size-1; i > 0 ; i--) {
        if (responseNumbers.get(i) == responseNum)
        {
            tempFit = fitParams.get(i);
            if (tempFit.isParamsEqualTo(fit))
            {
                return responses.get(i);
            }
        }
    }