Java集合是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如堆,栈.Java集合还可以用于保存具有映射关系的关联数组.
Java集合大致分为Set、List、Queue、Map四种体系:
- Set代表无序、不可重复的集合
- List代表有序、重复的集合
- Queue是一种队列集合实现
- Map代表具有映射关系的集合
Java概述
所有的Java集合类都位于java.util
包下,后来为了处理多线程环境下的并发问题。在java.util.concurrent
包下提供了一些多线程支持的集合类
集合和数组的区别
- 集合保存的数据的数量是可变的,而一旦在初始化数组时制定了长度,数组的长度就不可改变
- 集合可以保存具有映射关系的数据
- 集合只能保存对象(其实是对象的引用变量),而数组既可以保存基本类型的值,也可以保存对象(还是对象的引用变量)
Java主要由两个接口派生:Collection和Map,他们是java集合框架的根接口。
其中Set、List、Queue子接口是collection接口派生的子接口。
对于Set、List、Queue、Map四种集合,最常用的实现类有HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap和TreeMap七种。
Collection和Iterator接口
Collection接口里定义的方法可以操作List、Queue和Set.
Collection接口的方法
//向集合里添加一个对象,如果集合对象被改变了就返回true
boolean add(Object o)
//把集合c中的所有集合添加到指定集合,如果集合对象被改变了,返回true
boolean addAll(Collection c)
//清除集合,把长度变成0
void clear()
//判断集合中是否包含指定元素
boolean contains(Object o)
//判断集合中是否包含集合c中所有的元素
boolean contains All(Collection c)
//判断集合是否为空,长度为0返回true,其余放回false
boolean isEmpty()
//返回一个Iterator对象,用于遍历集合中的元素
Iterator iterator()
//删除集合中的指定元素o,当集合中包含多个o时,只删除第一个,返回true.
boolean remove(Object o)
//从集合中删去集合c中的所有元素,如果删去一个以上的元素,返回true
boolean removeAll(Collection c)
//得到集合里元素的个数
int size()
//把集合转换为数组
Object[] toArray()
使用Lambda表达式遍历集合
Java8为Iterable接口新增了一个forEach默认方法,因为Iterable接口是Collection接口的父接口,所以collection集合都能用.
Collection books = new HashSet()
books.add("朝花夕拾")
books.add("童年")
books.add("家")
//和groovy的闭包类似
books.forEach(obj -> System.out.println("--->"+obj))
使用Iterator遍历集合元素
Iterator接口也是java集合框架的成员,主要用于遍历集合,Iterator也被成为迭代器。
Iterator接口提供了遍历collection集合元素的统一编程接口。Iterator接口定义了四个方法:
//被迭代的集合还没有被遍历完,返回true
boolean hasNext()
//返回集合里的下一元素
Object next()
//删除集合里上一次next返回的元素
void remove()
//使用Lambda表达式来遍历集合中的元素
void forEachRemaining(Consumer action)
Iterator it = books.iterator();
while(it.hasNext()){
//it.next()返回的数据是Object类型,所以强转
String book = (String)it.next();
System.out.println(book);
if(book.equals("家")){
//从集合中删除next返回的元素
it.remove();
}
//对book赋值,不会改变集合元素本身
book='昆虫记';
}
//使用Lambda表达式来遍历元素集合
it.forEachRemaining(obj -> System.out.println(obj))
关于迭代器有几点需要注意:
- 在进行迭代时,迭代器只是把元素集合的值传给了迭代变量,而不是集合元素本省
- 在进行迭代时,集合中的元素不能被改变。remove()方法是例外。否则会引起
java.util.ConcurrentModificationException
异常
使用foreach循环遍历集合元素
for(Object obj : books){
//此时的book变量也是不是集合元素本身
String book = (String)obj;
System.out.println(book);
if(book.equals("家")){
//从集合中删除next返回的元素
it.remove();
}
}
使用Java8新增的Predicate操作集合
Java8为Collection集合新增了一个removeIf(Predicate filter)
方法,该方法会批量删除符合filter条件的所有集合元素,Predicate也是函数式接口,因此可以使用Lambda表达式作为参数。
//删去集合books中长度下雨10的元素
books.removeIf(ele -> ((String)ele).length()<10)
使用Java8新增的Stream操作集合
略