我有很多String对象,我应该以某种方式对它们进行排序。我决定找出更有效的方法 - 将对象放入TreeSet中,因此TreeSet自己对对象进行排序,或者将对象放在ArrayList中,然后对ArrayList进行排序。
我想方式:
对于ArrayList大小N的良好排序将具有N * log(N)的复杂性。
TreeSet使用红黑二叉树进行排序。此插入的插入的复杂性是A插入后的log(A)。因此,第一个元素的插入的复杂性将等于log(1),第二个元素的插入的复杂性将等于log(2),依此类推。因此完全复杂性将是log(1)+ log(2)+ log(N)。并且这个总和小于N * log(N)。
所以我期望TreeSet比ArrayList更有效。
我用代码测试它。就是这样:
public class SortTest {
static String getRandomString() {
Random random = new Random();
String result = "";
for (int i = 0; i < 10; i++) {
result += (char)(80 + random.nextInt(40));
}
return result;
}
static void testTreeSet() {
TreeSet<String> treeSet = new TreeSet<>();
for (int i = 0; i < 10000000; i++) {
treeSet.add(getRandomString());
}
}
static void testArrayList() {
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
arrayList.add(getRandomString());
}
Collections.sort(arrayList);
}
public static void main(String[] args) {
Date date1 = new Date();
testTreeSet();
Date date2 = new Date();
System.out.println(date2.getTime() - date1.getTime());
Date date3 = new Date();
testArrayList();
Date date4 = new Date();
System.out.println(date4.getTime() - date3.getTime());
}
}
我得到了这个结果:
23613
16217
所以ArrayList和sort比TreeSet更有效。 有人可以解释原因吗?