У меня есть следующий код, где я использую superList и subList, я хочу проверить, что subList на самом деле является подсписком superList.
Мои объекты не реализуют методы hashCode или equals.Я создал похожую ситуацию в тесте.Когда я запускаю тест, результат показывает очень большую разницу в производительности между результатами из коллекции JDK и общих коллекций. После запуска теста я получаю следующий вывод.
Время истекло с API сбора Java 8953 MilliSeconds & Result trueВремя, прошедшее с API коллекции Commons 78 MilliSeconds & Result true
У меня вопрос, почему сборка java так медленная в обработке операции containsAll.Я что-то там не так делаю?Я не контролирую типы коллекций, которые я получаю из старого кода.Я знаю, что если я использую HashSet для superList, то получу большой прирост производительности, используя операцию JDK containsAll, но, к сожалению, это невозможно для меня.
package com.mycompany.tests;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import org.apache.commons.collections.CollectionUtils;
import org.junit.Before;
import org.junit.Test;
public class CollectionComparison_UnitTest {
private Collection<MyClass> superList = new ArrayList<MyClass>();
private Collection<MyClass> subList = new HashSet<MyClass>(50000);
@Before
public void setUp() throws Exception {
for (int i = 0; i < 50000; i++) {
MyClass myClass = new MyClass(i + "A String");
superList.add(myClass);
subList.add(myClass);
}
}
@Test
public void testIt() {
long startTime = System.currentTimeMillis();
boolean isSubList = superList.containsAll(subList);
System.out.println("Time Lapsed with Java Collection API "
+ (System.currentTimeMillis() - startTime)
+ " MilliSeconds & Result is " + isSubList);
startTime = System.currentTimeMillis();
isSubList = CollectionUtils.isSubCollection(subList, superList);
System.out.println("Time Lapsed with Commons Collection API "
+ (System.currentTimeMillis() - startTime)
+ " MilliSeconds & Result is " + isSubList);
}
}
class MyClass {String myString;
MyClass(String myString) {
this.myString = myString;
}
String getMyString() {
return myString;
}
}