8-Java集合框架

Java集合大致可分为 Set、List、Queue 和 Map 四种体系。所有的集合类都位于 java.util 包下,为了处理多线程下环境下的并发安全问题,从Java5开始还在 java.util.concurrent 包下提供了一些多线程支持的集合类。
Java的集合类主要由两个接口派生:Collection 和 Map,是Java集合框架的根接口。

Collection 和 Iterator 接口

Collection 接口是 List、Set 和 Queue 接口的父接口,定义了如下操作集合元素的方法:

  • boolean add(Object o):向集合里添加一个元素。
  • boolean addAll(Collection c):把集合 c 里所有的元素添加到指定集合里。
  • void clear():清除集合里的所有元素,将集合长度重置为0。
  • boolean contains(Object o):返回集合里是否包含指定元素。
  • boolean containsAll(Collection c):返回集合里是否包含集合 c 里的所有元素。
  • boolean isEmpty():返回集合是否为空。
  • Iterator iterator():返回一个 Iterator 对象,用于遍历集合里的元素。
  • boolean remove(Object o):删除集合中的指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素。
  • boolean removeAll(Collection c):从集合中删除集合 c 里的所有元素。
  • boolean retainAll(Collection c):把调用该方法的集合变成该集合和集合 c 的交集。
  • int size():该方法返回集合里元素的个数。
  • Object[] toArray():该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素。

使用 Lambda 表达式遍历集合和迭代器

Java8为 Iterator 接口新增了一个 forEach(Consumer action) 默认方法,该方法所需参数是一个函数式接口,而 Iterator 接口是 Collection 接口的父接口,因此 Collection 集合也可以直接调用该方法。

1
books.forEach(obj->System.out.println("迭代元素:" + obj ));

使用 Java8 增强的 Iterator 遍历元素

Iterator 主要用于遍历 Collection 集合中的元素,接口里定义了4个方法:

  • boolean hasNext():如果被迭代的集合元素还没有被迭代完,返回true。
  • Object next():返回集合里的下一个元素。
  • void remove():删除集合里上一次 next() 方法返回的元素。
  • void forEachRemaining(Cosumer action):使用 Lambda 表达式来遍历集合元素。

使用 Lambda表达式遍历 Iterator

使用 Iterator 新增的方法 forEachRemaining(Consumer action) 方法来遍历迭代器:

1
2
Iterator it=books.iterator();
it.forEachRemaining(obj -> System.out.println("迭代集合元素:" + obj));

Java8 新增的 Predicate 操作集合

Java8为 Collection 集合新增了一个 removeIf(Predicate filter) 方法,该方法将会批量删除符合 filter 条件的所有元素。Predicate 也是函数式接口:

1
books.removeIf(ele->((String)ele).length()<10);

操作集合的工具类:Collections

Java 提供了一个操作 Set、List 和 Map 等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变类、对集合对象实现同步控制等方法。

排序操作

Collections 提供了如下类方法用于对 List 集合元素进行排序:

  • void reverse(List list):反转指定 List 集合中元素的顺序。
  • void shuffle(List list):对 List 集合元素进行随机排序( shuffle 方法模拟了 “洗牌” 动作)。
  • void sort(List list):根据元素的自然顺序对指定 List 集合的元素按升序进行排序。
  • void sort(List list,Comparator c):根据指定 Comparator 产生的顺序对 List 集合元素进行排序。
  • void swap(List list,int i,int j):将指定 List 集合中的 i 处元素和 j 处元素进行交换。
  • void rotate(List list,int distance):当 distance 为正数时,将 list 集合的后 distance 个元素 “整体” 移到后面;当 distance 为负数时,将 list 集合的前 distance 个元素 “整体” 移到后面。

查找、替换操作

同步控制

Collections 类中提供了多个 synchronizedXxx() 方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。

Java中常用的集合框架中的实现类 HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap 和 TreeMap 都是线程不安全的。如果有多个线程访问并试图修改它们,则存在线程安全问题。Collections 提供了多个类方法可以把它们包装成线程同步的集合。

1
2
3
4
Collection c=Collections.synchonizedCollection(new ArrayList());
List list=Collections.synchronizedList(new ArrayList());
Set s=Collection.synchronizedSet(new HashSet());
Map m=Collections.synchronizedMap(new HashMap());

设置不可变集合

Collections 提供了如下三个类方法来返回一个不可变集合:

  • emptyXxx():返回一个空的、不可变的集合对象,此处的集合既可以是 List,也可以是 SortedSet、Set,还可以是 Map、SortedMap 等。
  • singletonXxx():返回一个只包含指定对象(只有一个元素或一项元素)的、不可变的集合对象,此处的集合既可以是 List、也可以是 Map。
  • unmodifiableXxx():返回指定集合对象的不可变试图,此处的集合既可以是 List,也可以是 Set、Sorted Set,还可以是 Map、SortedMap 等。

上面的方法的参数是原有的集合对象,返回值是该集合的 “只读” 版本。通过 Collections 提供的方法,可以生成 “只读” 的 Collection 或 Map。

操作集合的工具类:Collections

工具类 Collections 提供了大量方法对集合元素进行排序、查询和修改,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。

排序操作

Collections 提供了如下静态方法用于对 List 集合进行排序:

  • void reverse(List list):反转指定 List 集合中元素的顺序。
  • void shuffle(List list):对 List 集合元素进行随机排序(shuffle 方法模拟了 “洗牌” 动作)。
  • void sort(List list):根据元素的自然顺序对指定 List 集合的元素按升序进行排序。
  • void sort(List list,Comparator c):根据指定 Comparator 产生的顺序对 List 集合元素进行排序。
  • void swap(List list,int i,int j):将指定 List 集合中的 i 位置的元素和 j 位置的元素进行交换。
  • void rotate(List list,int distance):当 distance 为正数时,将 list 集合的后 distance 个元素 “整体” 移到前面;当 distance 为负数时,将 list 集合的前 distance 个元素 “整体” 移到到后面。该方法不会改变集合长度。

查找、替换操作

Collections 提供了用于查找、替换集合元素的类方法: