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
2Iterator 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
4Collection 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 提供了用于查找、替换集合元素的类方法: