Java

Java 知识量:11 - 45 - 220

8.1 集合API简介><

什么是Java集合- 8.1.1 -

Java集合是Java编程语言中一类重要的工具类,它可以用于存储数量不等的多个对象,实现常用的数据结构,如栈、队列等,同时也可以保存具有映射关系的关系数组。

Java集合主要包括三大体系:Set、List和Map。

  • Set代表无序、不可重复的集合;

  • List代表有序、可以重复的集合;

  • Map则代表具有映射关系的集合。

除此之外,Java集合类还有很多实用的方法,例如add()方法可以添加一个元素到集合中,remove()方法可以删除一个元素,isEmpty()方法可以检查集合是否为空等等。

总的来说,Java集合是Java编程中非常常用和重要的一类工具类,它可以帮助程序员更方便地处理和操作多个对象。

Collection接口- 8.1.2 -

Collection接口是Java集合框架中的基础接口之一,它表示一种保存单值的数据集合。这个接口定义在java.util包中,它本身并没有提供直接实现,而是通过子接口List和Set来具体实现。

Collection接口定义了15个方法,包括添加、删除、修改、查询等操作,其中一些方法比较常用,可以在Collection 对象上执行的主要操作如下:

  • 添加元素:可以使用add()方法向Collection 中添加一个元素。

  • 删除元素:可以使用remove()方法从Collection 中删除一个元素。

  • 获取元素:可以使用get()方法获取Collection 中指定位置的元素。

  • 检查元素是否存在:可以使用contains()方法检查Collection 中是否包含某个元素。

  • 获取Collection 的大小:可以使用size()方法获取Collection 中元素的个数。

  • 迭代遍历:可以使用Iterator 接口提供的hasNext()和next()方法遍历Collection 中的所有元素。

  • 对Collection 进行排序:可以使用Collections 类提供的sort()方法对List类型的Collection进行排序。

除此之外,Collection 对象还支持其他的操作,具体取决于它的实现类。例如,List 实现类还提供了add()、indexOf()、lastIndexOf()、remove()等操作方法。

Collection接口的最大特点是它只允许存储单一类型的对象,而且不支持重复元素的存储。这意味着在一个Collection中,每个元素必须是唯一的,并且只能存储一种类型的对象。

Set接口- 8.1.3 -

Set接口是Java集合框架中的一种数据结构,它继承自Collection接口,用于存储一组唯一的对象,即不允许重复的元素。Set接口中的元素不按特定的方式排序,但它提供了基于对象的相等性来确定元素是否重复的方法。即如果集合中已经存在一个等于新加入元素的对象,则新元素不会被添加到集合中。

Set接口在Java集合框架中有多种实现,其中最常用的是HashSet和TreeSet。HashSet实现是基于哈希表的,具有高效的添加、删除、查找操作;而TreeSet实现是基于红黑树的,具有按照元素自然顺序或者自定义顺序排序的能力,但是效率相对较低。

Set接口中常用的方法有:添加元素、移除元素、判断集合是否为空、获取集合大小、清空集合、判断集合是否包含指定元素等。

Set接口特点:

  • 不保证顺序:Set不会保持元素的顺序,元素的顺序可能会随着时间和操作的不同而改变。

  • 唯一性:Set中的元素必须是唯一的,不允许重复。

  • 不可修改:Set中的元素是不可修改的,一旦添加到Set中,就不能修改其值。

  • 遍历:Set可以通过Iterator接口进行遍历,但不允许通过索引访问元素。

  • 运算:Set可以进行并集、交集、差集等运算。

常用的Set实现类有HashSet、TreeSet、LinkedHashSet等。在选择使用Set时,应该根据具体需求选择不同的实现类,以满足性能和功能需求。

List接口- 8.1.4 -

Java的List接口是Java集合框架中的一个重要接口,表示一个有序的集合。它继承自Collection接口,因此也继承了Collection接口中定义的方法,如add()、remove()、get()、size()等。

List接口的主要特点包括:

  • 有序性:List中的元素按照它们的添加顺序进行排列。可以使用索引来访问和修改元素,例如get(int index)方法返回指定位置的元素,add(int index, E element)方法在指定位置插入元素。

  • 可重复性:List允许存储重复的元素。

  • 可修改性:List中的元素是可以修改的。可以通过set(int index, E element)方法修改指定位置的元素。

  • 异步性:对于大部分List实现类来说,修改操作(如add、set和remove)不是原子的,而迭代操作是原子的。这意味着在迭代过程中修改List可能会导致不可预知的结果。

List接口的一些常用实现类包括ArrayList、LinkedList、Vector等。这些实现类根据不同的需求提供了不同的性能和功能。例如,ArrayList基于动态数组实现,可以进行快速的随机访问,但插入和删除操作可能较慢;LinkedList基于双向链表实现,插入和删除操作较快,但随机访问可能较慢。

在使用List时,需要注意一些常见的性能问题。例如,在知道索引的情况下访问元素时应该使用get(int index)方法而不是iterator()方法,因为前者比后者更快。另外,尽可能避免在循环中进行List的修改操作,例如add、set和remove方法,因为这可能导致并发修改异常(ConcurrentModificationException)。如果需要在循环中修改List,可以使用迭代器的remove()方法或者使用并发集合类(如CopyOnWriteArrayList)来避免异常的发生。

Map接口- 8.1.5 -

Map接口用于表示一个键值对的集合。它允许将一个键映射到一个值,并使用键来存储和检索值。

Map接口的特点包括:

  • 无序性:Map中的键值对是无序的,即它们在集合中的顺序不是固定的。

  • 唯一性:Map中的键必须是唯一的,而值可以是重复的。每个键只能映射到一个值。

  • 可存储任意类型:Map中的键和值可以是Java中的任意对象类型。

  • 可存储null:Map中的键和值都可以是null,但键不能是null,因为无法通过null键来获取值。

  • 可修改性:Map中的键值对是可以修改的,可以通过put(K key, V value)方法添加一个键值对,通过get(Object key)方法获取指定键的值,通过remove(Object key)方法删除指定键及其对应的键值对等。

  • 迭代器:Map可以通过迭代器来遍历其所有键值对。

Map接口的一些常用实现类包括HashMap、TreeMap、LinkedHashMap等。这些实现类根据不同的需求提供了不同的性能和功能。例如,HashMap基于哈希表实现,查询指定元素效率高,但储存和获取操作可能会受到哈希冲突的影响;TreeMap基于红黑树实现,按照键的自然顺序或者自定义顺序进行排序,查询指定元素效率较高;LinkedHashMap按照添加顺序进行排序,查询指定元素效率较低。

在使用Map时,需要注意一些常见的性能问题。例如,在遍历Map时,应该使用迭代器而不是使用索引访问元素,因为使用迭代器访问元素时不会影响其他线程对Map的操作。另外,尽可能避免在循环中对Map进行修改操作,例如put、remove方法等,因为这可能导致并发修改异常(ConcurrentModificationException)。如果需要在循环中修改Map,可以使用迭代器的remove方法或者使用并发集合类(如CopyOnWriteArrayList)来避免异常的发生。

集合的包装方法- 8.1.6 -

java.util.Collections 类在 Java 集合框架中起着非常重要的作用,这个类提供了一系列静态方法来操作或处理集合。其中一种被称作 "wrapper" 的方法,即集合的包装(wrapper)方法。

"Wrapper" 方法主要是指那些能够将其他类型的对象转换为对应的集合的方法。比如,可能有一个普通的列表,但如果希望能够以一种更方便的方式来操作这个列表,例如,以并行流的方式。这种情况下,就需要使用 Collections 类的 "wrapper" 方法。

以下是一些常见的 Collections 的 "wrapper" 方法:

  • Collections.unmodifiableList(List<T> list): 这个方法返回一个不可修改的列表视图。如果试图修改这个返回的列表,将会抛出 UnsupportedOperationException。

  • Collections.unmodifiableCollection(Collection<?> c): 这个方法返回一个不可修改的集合视图。如果试图修改这个返回的集合,将会抛出 UnsupportedOperationException。

  • Collections.checkedCollection(Collection<? super E> c, Class<E> type): 这个方法返回一个类型检查的集合。当试图向这个集合添加一个不是 type 类的对象时,会抛出 ClassCastException。

  • Collections.singleton(E e): 这个方法返回一个只有一个元素的集合。这个集合不是可修改的,如果试图添加或删除元素,将会抛出 UnsupportedOperationException。

  • Collections.emptyList(): 这个方法返回一个空的列表。这个列表是线程安全的,并且不会响应任何修改操作。

  • Collections.emptySet(): 这个方法返回一个空的集合。这个集合是线程安全的,并且不会响应任何修改操作。

  • Collections.emptyMap(): 这个方法返回一个空的映射。这个映射是线程安全的,并且不会响应任何修改操作。

这些 "wrapper" 方法在需要以特定方式处理集合时非常有用。例如,可能希望防止客户端代码修改集合,或者可能希望将集合以流的形式进行处理时,这些 "wrapper" 方法可以帮助实现这些目标。