Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系。其中包括:
1. Collection:包括Set、List和Queue;主要的实现类有HashSet、TreeSet、ArrayList、LinkedList和ArrayDeque
2. Map:主要的实现类为HashMap、TreeMap
3. Iterator: 用于遍历集合中的对象
Collection
Collection接口中定义了Set、List和Queue都会用到的方法,包括:
1. 增
boolean add(Object o)
boolean addAll(Collection c)
2. 删
boolean remove(Object o): 删除对象o,只删除第一个符合的对象,成功返回true
boolean removeAll(Collection c):删除集合c包含的所有元素,
boolean removeIf(Predicate<? super E> filter):Java8增强的条件查询,传入函数式Predicate对象filter进行条件删除
boolean retainAll(Collection c):删除c中不包含的元素,相当于取交集
void clear():清除所有元素,长度归0
3. 查
int size()
boolean isEmpty()
boolean contains(Object o):是否包含元素o
boolean containsAll(Collection c):是否包含集合c的所有元素
4. 改
Object toArray():集合变为数组
5. 其它
Iterator iterator():返回一个Iterator对象,用于遍历集合元素
Iterator
Iterator是Java集合的接口成员,提供遍历集合对象的方法。定义了如下4个方法:
1. boolean hasNext():判断是否遍历完成
2. Object next():返回下一个元素
3. void remove():删除上一次next返回的元素
4. void forEachRemaining(Consumer action):Java8新增的Lambda遍历方法
要注意的是:
1. Iterator对象通过集合调用Iterator方法生成。
2. Iterator遍历集合元素时(包括增强for循环),是通过值传递来获取元素的值,因此在迭代中修改元素的值将不起作用。
3. Iterator只能通过自身的remove方法删除对象,而不能调用集合自身的remove方法,否则会导致ConcurrentModificationException异常。
4. Iterator对象的遍历方法,无论是常规的while循环,还是Java8新增的forEachRemaining方法,只能在一个方法中遍历一次集合。(原因在于底层都是通过Next来返回集合元素,在第一轮中已经Next完集合所有元素了,所以再起一轮遍历,hasNext将为false;相反,集合的forEach方法,则可以多轮遍历)
public class IteratorTest { public static void main(String[] args) { Set<String> books = new HashSet<String>(); books.add("1844年经济学哲学手稿"); books.add("德谟克利特的自然哲学和伊壁鸠鲁的自然哲学的差别"); books.add("资本论"); books.add("自然辩证法"); books.add("1"); //Java8的增强条件删除,需要传入函数式条件 books.removeIf(ele -> ele.length() < 3); Iterator<String> it = books.iterator(); //使用Lambda表达式遍历集合(Iterator对象) //it.forEachRemaining(obj -> System.out.println("Iterator遍历对象:" + obj)); while(it.hasNext()) { String book = it.next(); System.out.println(book); if(book.equals("资本论")) { it.remove(); } book = "通往奴役之路";//Iterator不能改变集合元素,赋值失败 } System.out.println(books); //使用Lambda表达式遍历集合(集合对象) books.forEach(obj -> System.out.println("集合遍历对象:" + obj)); } }