技术开发 频道

Java Collections API您不知道的5件事

  【IT168 文档

  简介: 您可以在任何地方使用 Java™ 集合,但是一定要小心。集合有很多秘密,如果不正确处理可能会带来麻烦。Ted 探索了 Java Collections API 复杂、多变的一面并为您提供了一些技巧,帮您充分利用 Iterable、HashMap 和 SortedSet,又不会带来 bug。

  java.util 中的 Collections 类旨在通过取代数组提高 Java 性能。如您在 第 1 部分 中了解到的,它们也是多变的,能够以各种方式定制和扩展,帮助实现优质、简洁的代码。

  Collections 非常强大,但是很多变:使用它们要小心,滥用它们会带来风险。

  1. List 不同于数组

  Java 开发人员常常错误地认为 ArrayList 就是 Java 数组的替代品。Collections 由数组支持,在集合内随机查找内容时性能较好。与数组一样,集合使用整序数获取特定项。但集合不是数组的简单替代。

  要明白数组与集合的区别需要弄清楚顺序 和位置 的不同。例如,List 是一个接口,它保存各个项被放入集合中的顺序,如清单 1 所示:

  清单 1. 可变键值

import java.util.*;

public class OrderAndPosition
{
    
public static <T> void dumpArray(T[] array)
    {
        System.out.println(
"=============");
        
for (int i=0; i<array.length; i++)
            System.out.println(
"Position " + i + ": " + array[i]);
    }
    
public static <T> void dumpList(List<T> list)
    {
        System.out.println(
"=============");
        
for (int i=0; i<list.size(); i++)
            System.out.println(
"Ordinal " + i + ": " + list.get(i));
    }
    
    
public static void main(String[] args)
    {
        List
<String> argList = new ArrayList<String>(Arrays.asList(args));

        dumpArray(args);
        args[
1] = null;
        dumpArray(args);
        
        dumpList(argList);
        argList.remove(
1);
        dumpList(argList);
    }
}

  当第三个元素从上面的 List 中被移除时,其 “后面” 的各项会上升填补空位。很显然,此集合行为与数组的行为不同(事实上,从数组中移除项与从 List 中移除它也不完全是一回事儿 — 从数组中 “移除” 项意味着要用新引用或 null 覆盖其索引槽)。

0
相关文章