Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查两个列表是否包含相同对象的最快方法_Java_Multithreading_List_Performance_Comparison - Fatal编程技术网

Java 检查两个列表是否包含相同对象的最快方法

Java 检查两个列表是否包含相同对象的最快方法,java,multithreading,list,performance,comparison,Java,Multithreading,List,Performance,Comparison,我最近一直在处理一个问题,我必须等几个小时才能得到正确的答案。 问题是: 我有两个不同的列表,有数千个元素。 我想检查两个列表是否包含相同的元素,如果我想将该元素添加到一个单独的列表中。 当我尝试使用列表中的少量元素时,程序运行得非常好,但是当我尝试使用更多元素时,我必须等待数小时才能得到正确的答案 List<Point> res1 = new LinkedList<>(); for (Point value : w1) {

我最近一直在处理一个问题,我必须等几个小时才能得到正确的答案。 问题是: 我有两个不同的列表,有数千个元素。 我想检查两个列表是否包含相同的元素,如果我想将该元素添加到一个单独的列表中。 当我尝试使用列表中的少量元素时,程序运行得非常好,但是当我尝试使用更多元素时,我必须等待数小时才能得到正确的答案

        List<Point> res1 = new LinkedList<>();
        for (Point value : w1) {
            System.out.println("Thread 1");
            Point a = value;
            for (Point point : w2) {
                if (a.equals(point)) {
                    System.out.println(Math.abs(a.x) + Math.abs(a.y));
                    res1.add(a);
                }

            }
        }
List res1=newlinkedlist();
用于(点值:w1){
System.out.println(“线程1”);
a点=数值;
用于(点:w2){
如果(a等于(点)){
System.out.println(Math.abs(a.x)+Math.abs(a.y));
决议1.加入(a);
}
}
}
做这种比较最快的方法是什么


提前感谢

如果您使用HashSet,您将免费获得一个非常高效的contains方法:

        HashSet hsw1 = new HashSet(w1); // turn first into a hashset
        List<Point> res1 = new LinkedList<>(w2); // load the second into new list
        res1.retainall(hsw1); // retain only values that are in the first as well
HashSet hsw1=新的HashSet(w1);//将第一个转换为哈希集
List res1=新链接列表(w2);//将第二个加载到新列表中
res1.保留(hsw1);//也只保留第一个中的值

如果使用HashSet,您可以免费获得一种非常高效的contains方法:

        HashSet hsw1 = new HashSet(w1); // turn first into a hashset
        List<Point> res1 = new LinkedList<>(w2); // load the second into new list
        res1.retainall(hsw1); // retain only values that are in the first as well
HashSet hsw1=新的HashSet(w1);//将第一个转换为哈希集
List res1=新链接列表(w2);//将第二个加载到新列表中
res1.保留(hsw1);//也只保留第一个中的值

您可以测试不同的方法,看看哪一种效果更好。这只适用于少量元素。谢谢问题是,找到相同的元素也需要很多时间。对相关问题的公认答案肯定会有所帮助。检查列表中是否存在复杂度
O(n)
,对集合的相同操作是
O(1)
。请忘了
LinkedList
,它从来都不是正确的选择。我看不到一个被接受的答案,而且投票最多的答案在这里不会有好的表现,因为正如您在这里指出的那样,使用的是
LinkedList
,而不是哈希集。就性能而言,线程唯一可以接受的答案是apachecommons答案。在这里,性能不是问题,而是问题。所以我不认为这是一个纯粹的重复。你可以测试不同的方法,看看哪一个更好。这只适用于少量的元素。谢谢问题是,找到相同的元素也需要很多时间。对相关问题的公认答案肯定会有所帮助。检查列表中是否存在复杂度
O(n)
,对集合的相同操作是
O(1)
。请忘了
LinkedList
,它从来都不是正确的选择。我看不到一个被接受的答案,而且投票最多的答案在这里不会有好的表现,因为正如您在这里指出的那样,使用的是
LinkedList
,而不是哈希集。就性能而言,线程唯一可以接受的答案是apachecommons答案。在这里,性能不是问题,而是问题。所以我不认为这是一个纯粹的复制品。非常感谢。这很有效。它将我的程序加速了数千倍如果你可以在w1中使用
哈希集
,那么你就可以摆脱第一次转换,在那里速度会快一点,但可能需要通过插入性能来支付。我不知道你的情况下什么会比其他更重要。非常感谢。这很有效。它将我的程序加速了数千倍如果你可以在w1中使用
哈希集
,那么你就可以摆脱第一次转换,在那里速度会快一点,但可能需要通过插入性能来支付。不确定你的情况下什么会比其他更重要。