Java—集合概述(Collection/Map)
集合简介
在集合类之前,我们使用数组存储,数组既可以存储基本数据类型的值,也可以存储对象(对象的引用变量),但是集合只能存储对象。
Java集合类似于一种容器,将同类型的对象(实际为对象引用)存储在一起,就形成一个集合。之前的文章中,我们有介绍到,Java 5后增加了泛型,Java集合可以指定特定的对象类型。
Java集合类的基本接口是Collection接口和Map接口。该接口有两个基本方法:add()
和iterator()
方法。
public interface Collection<E> {
boolean add(E element);
Iterator<E> iterator();
...
}
其中,add()
方法用于向集合添加元素,若添加元素时改变了集合,则返回true;反之,返回false。如该集合中已存在需要添加的元素,再次添加时,返回false。iterator()
方法用于返回实现Iterator接口的对象,使用该迭代器对象依次访问集合的元素。
集合体系
Collection集合体系继承树
Collection体系中,Set代表无序集合;List代表有序集合;Queue代表队列集合。
Map集合体系继承树
Map体系中,存储的是具有映射关系(key-value)的数据,Map中的key不可重复。
集合分类
- Set:无序、不可重复的集合;
- List:有序、重复的集合;
- Queue:队列集合;
- Map:有映射关系的集合;
Collection常用方法
boolean add(E e)
:向集合中添加一个元素,若集合改变了,则返回true;反之,返回false。boolean addAll(Collection<? extends E> c)
:将集合c内的所有元素添加到指定集合中,若集合改变,则返回true;反之,返回false。void clear()
:清楚集合内的所有元素,集合长度为0。boolean remove(Object o)
:删除集合中指定元素o,当集合中包含一个或多个元素o时,只删除第一个符合的元素,并返回true。boolean removeAll(Collection<?> c);
:从本集合中删除集合c内的所有元素,等于求差集,若删除一个及以上的元素,就返回true。boolean contains(Object o)
:判断集合内是否存在指定元素o,若存在,则返回true;反之,返回false。boolean containsAll(Collection<?> c)
:判断集合内是否包含集合c里面的所有元素,若包含,则返回true;反之,返回false。boolean isEmpty()
:判断集合是否为空,若为空,则返回true;反之,返回false。集合的长度为0,即为空。Iterator iterator()
:返回一个Iterator对象,遍历集合元素。int size()
:返回集合内的元素个数;Object[] toArray()
:将集合转换为一个数组,所有的集合元素变为对应的数组元素。
Lambda表达式遍历集合
Java 8在Iterator接口中引入了Lambda表达式:forEach(Consumer<? super T> action)
,调用该方法去遍历集合元素时,集合元素传递给Consumer接口
的accept(T t)
方法,而Consumer是函数式接口
,所以这是一种函数式编程
。
源码如下:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
其中retuireNonNull(T obj)
是Object的方法,源码如下:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
实战示例
public class DemoApplication {
public static void main(String[] args) {
Collection collection = new ArrayList();
// 添加元素
collection.add("add()方法");
collection.add(1);
collection.add(2.7);
collection.add("value1");
collection.add("value2");
System.out.println("collection 集合元素为:" + collection);
//lambda表达式遍历
collection.forEach(c -> System.out.println("forEach: " + c.toString()));
// 删除指定元素
System.out.println("删除指定元素1:" + collection.remove(1));
System.out.println("删除指定元素2:" + collection.remove(2));
//判断是否包含指定元素
System.out.println("是否包含2.7:" + collection.contains(2.7));
System.out.println("是否包含2:" + collection.contains(2));
//判断是否包含某个集合
Collection valueSet = new HashSet();
valueSet.add("value1");
valueSet.add("value2");
System.out.println("是否包含集合: " + collection.containsAll(valueSet));
//求差集:去除另一个集合的所有元素
collection.removeAll(valueSet);
System.out.println("求差集后:" + collection);
//清空集合元素
collection.clear();
System.out.println("清空集合后: " + collection);
//集合长度
System.out.println("集合长度: " + collection.size());
//求交集:只保留另一个集合的元素
valueSet.retainAll(collection);
System.out.println("求交集: " + valueSet);
}
}
运行结果:
collection 集合元素为:[add()方法, 1, 2.7, value1, value2]
forEach: add()方法
forEach: 1
forEach: 2.7
forEach: value1
forEach: value2
删除指定元素1:true
删除指定元素2:false
是否包含2.7:true
是否包含2:false
是否包含集合: true
求差集后:[add()方法, 2.7]
清空集合后: []
集合长度: 0
求交集: []
参考书籍
《疯狂Java》
《Java核心技术卷一》
烧不死的鸟就是凤凰