String和HashSet之间最好的(性能+内存)用于检查重复项 - java

我想做一个简单的实现,以在bigCodeList包含重复项的不同代码(aCode)的基础上进行一些操作。
下面我提到了两种我想知道的方法,其中在性能方面+内存消耗方面,哪种方法更有效?

方法1:

    String tempStr = "";

    for(String aCode : bigCodeList){
        if(tempStr.indexOf(aCode) == -1) {
            // deal With the aCode related work
            tempStr += aCode+"-"
        }
    }

方法2:

        HashSet<String> tempHSet = new HashSet<String>();

        for(String aCode : bigCodeList){

            if(tempHSet.add(aCode)){

                // deal With the aCode related work

            }

        }

注意:aCode是一个类似于LON的三字母代码

参考方案

方法2到目前为止更好。您甚至不应该考虑方法1。

首先,方法1在搜索中具有线性时间。这意味着,当tempStr变为两倍长时,搜索它的时间也变为两倍长(当然,平均而言,如果总是找到第一个元素,它就会很短)。

下一步:每次添加tempStr时,您都要复制整个String(因为aCode对象是不可变的,这是从现有对象创建新对象的唯一方法)。因此,添加选项也会花费一些时间。

第三(与性能无关):像这样混合数据(-)和元数据(分隔符aCode)会导致各种不良后果。您可能会确定,现在HashSet绝不能包含破折号,但是如果在两周内发生变化怎么办?

第四:是为该用例而构建的!那是最好的方法:拿着一组不同的对象,检查它是否已经存在并添加一个新对象。

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…

为什么C++中的void方法可以返回void值,而在其他语言中却不能呢? - java

该程序可以用C ++编译并运行,但不能使用多种不同的语言,例如Java和C#。#include <iostream> using namespace std; void foo2() { cout << "foo 2.\n"; } void foo() { return foo2(); } int main() {…

性能:Java中的BufferedOutputStream与FileOutputStream - java

我已经读到BufferedOutputStream类可以提高效率,并且必须以这种方式与FileOutputStream一起使用-BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("myfile.txt")); 对于下面的语句写入同一文件也是有…

如何在JNIWrapper中将C++ Array <float,size>转换为jfloatArray? - java

我想将我的C ++数组输出映射到jniFloatArray。尝试遵循以下解决方案:“ Convert float* to jfloatArray using JNI”但我无法将float *指向数组对象。假设我在C ++数组输出对象中的输出是:输出= {1.0f,2.0f,3.0f};我真正想要的是将输出(数组)转换或映射到JniWrapper中的jfloa…