容器:综述

基本概念

Java容器类库的用途是:保存对象。

从概念上分为两类:

  • Collection 一个独立元素的序列,这些元素都服从一条或多条规则:List必须按照插入的顺序保存元素,Set不能有重复元素,Queue按照排队规则来确定对象产生的顺序。它定义了一种存放一组对象的方式。 即Collection保存单一的元素。

  • Map 一组成对的“键值对”对象,允许你使用键来查找值。 即Map保存相关联的键值对。

其他

  • 它们都是泛型和类型安全的容器:通过Collection<E>Map<K,V>这种泛型方式,确保向容器中插入正确的类型。当插入不正确的类型时,就会有编译期错误,而不是运行时错误。

  • 容器类不能持有基本类型,比如List<int> list = new ArrayList<int>()会报错,但是可以持有其包装类。

  • 数组将数字与对象联系起来,它保存类型明确的对象。查询对象时,不需要对结果做类型转换,它可以是多维的,可以保存基本类型的数据,但是数组一旦生成,其容量就不能改变。

  • 迭代器Iterator能够将遍历序列的操作与序列底层的结构分离,它统一了对容器的访问方式。

  • 新程序中不应该使用过时的Vector、Hashtable和Stack。

list,set,map的选择

  • 如果你经常会使用索引来对容器中的元素进行访问,那么List是你的正确的选择。如果你已经知道索引了的话,那么List的实现类比如ArrayList可以提供更快速的访问,如果经常添加/删除元素,那么肯定要选择LinkedList。

  • 如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是List,因为List是一个有序容器,它按照插入顺序进行存储。

  • 如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个Set的实现类,比如 HashSet、LinkedHashSet或者TreeSet。所有Set的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性:比如TreeSet还是一个SortedSet,所有存储于TreeSet中的元素可以使用Java里的Comparator或者Comparable进行排序。LinkedHashSet也按照元素的插入顺序对它们进行存储。

  • 如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。

Last updated