Java 集合框架

集合是一组对象,Java 集合框架由接口和类组成,这些接口和类可以处理不同类型的集合,例如列表 list、无序列表 set、键值对 map、堆栈 stack 和队列 queue 等。

这些现成的集合类解决了许多非常常见的问题,它们内部已经实现了一些常见操作诸如添加、删除、更新、排序、搜索和更复杂的算法。

Java 集合层次结构

Java 集合中主要提供了如下接口与实现类:

集合 Collection

集合接口位于层次结构的根部。Collection 接口提供所有集合类必须支持(或抛出异常 UnsupportedOperationException)的所有通用方法。它扩展了 Iterable 接口,增加了对使用 “for-each loop” 语句迭代集合元素的支持。

所有其他集合接口和类(Map 除外)都扩展或实现了此接口。

例如,List (已索引、已排序)和 Set (已排序)接口实现了此集合。

列表 List

列表表示元素的有序集合。使用列表,我们可以通过它们的整数索引(列表中的位置)访问元素,并在列表中搜索元素。索引以 开头0,就像数组一样。

一些实现List接口的类有 – ArrayList、CopyOnWriteArrayList、LinkedList、Stack和Vector。

无序列表 Set

Set 表示已排序元素的集合。集合不允许重复的元素。Set 接口不保证以任何可预测的顺序返回元素;尽管某些 Set 实现以自然顺序存储元素并保证此顺序。

一些实现Set接口的类有 – ConcurrentSkipListSet、CopyOnWriteArraySet、EnumSet、HashSet、LinkedHashSet和TreeSet。

键值对 Map

Map 使我们能够存储数据的键值对,键应该是一成不变的。Map 不能包含重复的键;每个键最多可以映射到一个值。

Map 接口提供了三个集合视图,允许将数据解析为一组键、一组值或一组键值对。

实现Map接口的一些类有 – ConcurrentHashMap、ConcurrentSkipListMap、EnumMap、HashMap、Hashtable、IdentityHashMap、LinkedHashMap、Properties、TreeMap和WeakHashMap。

堆 Stack

Java Stack 接口表示经典的堆栈数据结构,其中元素可以被推送到后进先出 (LIFO) 对象堆栈。在 Stack 中,我们将一个元素压入栈顶,稍后再次从栈顶弹出。

队列 Queue

队列通常但不一定以先进先出 (FIFO)方式对元素进行排序。一个这样的例外是优先级队列,它根据提供的Comparator或元素的自然顺序对元素进行排序。

一般来说,队列不支持阻塞插入或检索操作。阻塞队列实现类实现BlockingQueue接口。

实现类有 – ArrayBlockingQueue、ArrayDeque、ConcurrentLinkedDeque、ConcurrentLinkedQueue、DelayQueue、LinkedBlockingDeque、LinkedBlockingQueue、LinkedList、LinkedTransferQueue、PriorityBlockingQueue、PriorityQueue 和 SynchronousQueue。

双向队列 Deque

一个双端队列,支持两端元素的插入和移除。当双端队列用作队列时,会产生FIFO(先进先出)行为。当双端队列用作堆栈时,会产生 LIFO(后进先出)行为。

应优先使用此接口而不是遗留类Stack。当双端队列用作堆栈时,元素从双端队列的开头被压入和弹出。

实现此接口的一些常见类是 ArrayDeque、ConcurrentLinkedDeque、LinkedBlockingDeque 和 LinkedList。

集合与泛型

泛型提供类型安全检查,它检测不兼容的类型并在运行时防止ClassCastException。在 Java 集合中,我们也可以定义一个集合类来仅存储某种类型的对象,通过泛型来禁止其他类型。

在给定的示例中,前两个 add() 方法是允许的。第三个将无法编译并给出错误——“类型中的 put(Integer, String) 方法HashMap<Integer,String>不适用于参数 (String, String)”。它有助于及早检测不兼容的类型,以防止运行时出现不可预测的行为。

HashMap<Integer, String> map = new HashMap<>();

map.put(1, "A");    //正常
map.put(2, "B");    //正常

map.put("3", "C");  //编译失败

集合与 Java 8

Java 8 中对集合做出更大改进,包括 stream 流,用 lambda 表达式来简化集合操作等。

List<Integer> list = new ArrayList<>();

list.add(1);
list.add(2);
list.add(3);

// 传统方式
for(Integer id : list){
    System.out.println(id);
}
// Java8 简化方式
list.forEach(System.out::print);

Java 集合的好处

  • 一致且可重用的 API —— 这是任何框架都可以做到的。它提供了一组一致的类方法,可用于一遍又一遍地解决一组类似的问题,而不会得到不可预测的结果。Java 集合框架还有助于以一致的方式解决与一组对象相关的常见问题。所有集合类都有一致的实现,并提供了一些常用的方法,如 add、get、put、remove 等。无论你处理哪种数据结构,这些方法都根据底层实现工作并透明地执行操作。
  • 更少的开发时间 —— 一个通用且可预测的框架总是会减少开发时间并有助于快速编写应用程序。Java 集合还有助于使用对象和集合执行一些最重复的常见任务,从而提高时间因素。
  • 性能 —— Java 集合 API 是由一些最聪明的行业头脑编写的,它们的性能在大多数情况下都是一流的。Oracle 和非常热情的 Java 开发人员社区正在进行的开发工作有助于使其变得更好。
  • 简洁的代码 —— 这些 API 是用所有良好的编码实践编写的,并且有很好的文档记录。它们在整个 Java 集合框架中遵循一定的标准。它使程序员的代码看起来干净整洁,由于一致的类和方法名称,代码也更易于阅读。
转载请注明出处:码谱记录 » Java 集合框架
标签: