Java Hour 19 List

时间:2023-03-09 14:51:42
Java Hour 19 List

有句名言,叫做10000小时成为某一个领域的专家。姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧。

本文作者Java 现经验约为19 Hour,请各位不吝赐教。

List

ArrayList, 在随机取数据的时候有优势,但是在中间插入和移除数据的时候就慢了。

LinkedList,在中间插入和移除数据的时候有优势,但是随机获取数据的时候就慢了。同时LinkedList 有更多的特性可以使用。

这个显然是由其数据结构所决定的,但是我们关注.NET 的时候从来没有关注过这个区别。

.NET 中一般直接使用new List<T>, 这里究竟是ArrayList 还是LinkedList 呢?

当然Thinking In Java 的代码自然也是极好的:

List Feature

public class ListFeatures {
    public static void main(String[] args) {
        Random rand = new Random(47);
        List<Pet> pets = Pets.arrayList(7);
        Print.print("1: " + pets);
        Hamster h = new Hamster();
        pets.add(h); // Automatically resizes
        Print.print("2: " + pets);
        Print.print("3: " + pets.contains(h));
        pets.remove(h); // Remove by object
        Pet p = pets.get(2);
        Print.print("4: " + p + " " + pets.indexOf(p));
        Pet cymric = new Cymric();
        Print.print("5: " + pets.indexOf(cymric));
        Print.print("6: " + pets.remove(cymric));
        // Must be the exact object:
        Print.print("7: " + pets.remove(p));
        Print.print("8: " + pets);
        pets.add(3, new Mouse()); // Insert at an index
        Print.print("9: " + pets);
        List<Pet> sub = pets.subList(1, 4);
        Print.print("subList: " + sub);
        Print.print("10: " + pets.containsAll(sub));
        Collections.sort(sub); // In-place sort
        Print.print("sorted subList: " + sub);
        // Order is not important in containsAll():
        Print.print("11: " + pets.containsAll(sub));
        Collections.shuffle(sub, rand); // Mix it up
        Print.print("shuffled subList: " + sub);
        Print.print("12: " + pets.containsAll(sub));
        List<Pet> copy = new ArrayList<Pet>(pets);
        sub = Arrays.asList(pets.get(1), pets.get(4));
        Print.print("sub: " + sub);
        copy.retainAll(sub);
        Print.print("13: " + copy);
        copy = new ArrayList<Pet>(pets); // Get a fresh copy
        copy.remove(2); // Remove by index
        Print.print("14: " + copy);
        copy.removeAll(sub); // Only removes exact objects
        Print.print("15: " + copy);
        copy.set(1, new Mouse()); // Replace an element
        Print.print("16: " + copy);
        copy.addAll(2, sub); // Insert a list in the middle
        Print.print("17: " + copy);
        Print.print("18: " + pets.isEmpty());
        pets.clear(); // Remove all elements
        Print.print("19: " + pets);
        Print.print("20: " + pets.isEmpty());
        pets.addAll(Pets.arrayList(4));
        Print.print("21: " + pets);
        Object[] o = pets.toArray();
        Print.print("22: " + o[3]);
        Pet[] pa = pets.toArray(new Pet[0]);
        Print.print("23: " + pa[3].id());
    }
}

我们可以看到好多List 的feature,当然就我使用.NET 的经验来说,很多都是用不上的。