java集合 之 Collection和Iterator接口
Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合。Collection接口里定义了如下操作元素的方法。
boolean add(object o):该方法用于向一个集合中里添加一个元素。如果集合对象被添加操作改变了,则返回true。
boolean addAll(Collection c):将集合c中的所有元素添加到指定的集合中。如果集合对象被添加操作改变了,则返回true。
void clear():清除集合里的所有元素,将集合长度变为0。
boolean contatins(Objeect o):返回集合中是否包含指定元素o。如果包含,返回true。
boolean containsAll(Collection c):返回集合中是否包含集合c中的所有元素。如果包含,返回true。
boolean isEmpty():返回集合是否为空。当集合长度为零时,返回true;否则返回false。
Iterator iterator():返回一个Iterator对象,用于遍历集合中的元素。
boolean remove(Object o):删除集合中的指定元素o,当集合中包含多个o元素时,只删除第一个符合条件的o元素,该方法返回true。
boolean removeAll(Collection c):删除集合中所有集合c包含的元素(相当于当前集合减去集合c),如果该方法改变了调用该方法的集合,则该方法返回true。
boolean retainAll(Collection c):删除集合中所有集合c不包含的元素(相当于求当前集合于集合c的交集),如果该方法改变了调用了该方法的集合,则该方法返回true。
int size():返回集合的长度。
Object[] toArray():将集合转换为一个数组,所有集合元素变成相应的数组元素。
public class CollectionTest {
public static void main(String[] args){
Collection c = new ArrayList();
//添加元素
c.add("孙悟空");
c.add(6);
System.out.println("c集合中的元素个数为:" + c.size());
//删除元素
c.remove(6);
System.out.println("c集合中的元素个数为:" + c.size());
System.out.println("c集合中是否包含‘孙悟空’:" + c.contains("孙悟空"));
c.add("轻量级java应用开发");
System.out.println("c集合中的元素为:" + c);
Collection books = new HashSet();
books.add("轻量级java应用开发"); books.add("疯狂java讲义");
System.out.println("c集合是否完全包括集合books:" + c.containsAll(books));
c.removeAll(books);
System.out.println("c集合中的元素为:" + c);
//清空集合c
c.clear();
System.out.println("c集合中的元素为:" + c);
books.retainAll(c);
System.out.println("books集合中的元素为:" + books);
}
}
使用Lambda表达式遍历集合:
java8为Iterble接口新增了了一个foreach(Consumer action)接口,该方法所需的参数类型是一个函数式接口,而Iterable是Collection接口的父接口,应此Collection可以直接调用此方法。
当程序调用Iterable的foreach(Consumer action)遍历集合元素时,程序会依次将集合元素传给Comsumer的accept(T t)方法(该方法中唯一的抽象方法)。
public class CollectionEach {
public static void main(String[] args){
Collection books = new HashSet();
books.add("轻量级java企业应用开发");
books.add("疯狂java讲义");
books.add("疯狂android");
/*输出:迭代集合为:疯狂java讲义
迭代集合为:轻量级java企业应用开发
迭代集合为:疯狂android*/
books.forEach(obj -> System.out.println("迭代集合为:" + obj));
}
}
使用java8增强的Ieteraor遍历集合元素:
Iteraor接口也是java集合框架中的成员,主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
Iteraor定义了一些方法:
boolean hasnext(): 如果被迭代的元素还没有遍历完,则返回true。
Object next(): 返回集合中的下一个元素。
void remove():删除集合集合中上一次next方法返回的元素。
void forEachRemning(Consumer action):使用Lambda表达式遍历集合。
当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove方法删除上一次next()方法返回的集合元素才可以,否则会引发异常。
public class IteratorTest2 {
public static void main(String[] args){
Collection books = new HashSet();
books.add("轻量级java企业应用开发");
books.add("疯狂java讲义");
books.add("疯狂android");
Iterator it = books.iterator();
while(it.hasNext()){
String book = (String)it.next();
//输出:疯狂java讲义
// 轻量级java企业应用开发
// 疯狂android
System.out.println(book);
if (book.equals("疯狂java讲义")) {
it.remove();
}
}
//输出:[轻量级java企业应用开发, 疯狂android]
System.out.println(books);
}
}
使用Lambda表达式遍历Iterator
java8为Iterator提供了一个forEachRemning(Consumer action)方法,该方法所需的也是Consumer参数同样也是函数式接口。当程序调用Iterator的forEachRemning(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer的accept(T t)方法(该接口中唯一的方法)。
public class IteratorEach {
public static void main(String[] args){
Collection books = new HashSet();
books.add("轻量级java企业应用开发");
books.add("疯狂java讲义");
books.add("疯狂android");
Iterator it = books.iterator();
/*迭代元素集合为:疯狂java讲义
迭代元素集合为:轻量级java企业应用开发
迭代元素集合为:疯狂android*/
it.forEachRemaining(obj -> System.out.println("迭代元素集合为:" + obj));
}
}
使用foreach循环遍历集合元素
除了可以使用Iterator接口迭代访问Collection集合里的元素之外,使用java5提供的foreach循环迭代访问集合元素更加快捷。
public class ForeachTest {
public static void main(String[] args){
Collection books = new HashSet();
books.add("轻量级java企业应用开发");
books.add("疯狂java讲义");
books.add("疯狂android");
for(Object obj : books){
String book = (String)obj;
/*疯狂java讲义
轻量级java企业应用开发
疯狂android*/
System.out.println(book);
if (book.equals("疯狂Andriod讲义")) {
//下面代码将要引发异常
books.remove(book);
}
}
//[疯狂java讲义, 轻量级java企业应用开发, 疯狂android]
System.out.println(books);
}
使用java8新增的Prdicate操作集合:
java8为Collectio集合新增一个removeIf(Predicate filter)方法,该方法将会批量删除符合filter条件的所有元素。
public class PredicateTest {
public static void main(String[] args){
Collection books = new HashSet();
books.add(new String("轻量级java应用开发"));
books.add(new String("疯狂java讲义"));
books.add(new String("疯狂IOS讲义"));
books.add(new String("疯狂Ajax讲义"));
books.add(new String("疯狂android讲义"));
//统计书名包括“疯狂”子串的图书数量.输出:4
System.out.println(calAll(books,ele -> ((String)ele).contains("疯狂")));
//统计书名字符串长度大于10的图书数量.输出:2
System.out.println(calAll(books,ele -> ((String)ele).length()>10));
}
public static int calAll(Collection books , Predicate p ){
int total = 0;
for(Object obj : books){
if (p.test(obj)) {
total++;
}
}
return total;
}
}
使用java8新增的Stream操作集合:
java8新增了Stream,IntStream,LongStream,DoubleStream等流式API,这些api代表多个支持串行和并行聚集操作的元素。上面四个接口中,Stream代表一个通用的流接口,其他则分别代表元素类型为int,long,double的流。
独立使用流的方法:
1.使用Stream或Xxxstream的builder()类方法创建该Stream对应的Builder。
2.重复调用Budiler的add()方法,向该流中添加多个元素。
3.调用Builder的build()方法获取相应的Stream。
4.调用Stream的聚集方法。
对于大部分的聚集方法而言,每个Stream只能执行一次。
Stream提供了大量的方法进行聚集操作,这些方法既可以是”中间的“,也可以是”末端的“。
〉中间方法:中间操作允许流保持打开操作,并且可以直接调用后续的方法。中间方法的返回值是另一个流。
〉末端方法:末端方法是对流的最终操作。当对某个Stream对象执行末端方法后,该流将会被”消耗“,且不可再用。
除此之外,关于流的方法还有如下两个特征:
1.有状态的方法:这个方法会为流增加一些新的特征,比如元素的唯一性,元素的最大数量,保证元素以排序的方式被处理。有状态的方法往往需要更大的开销。
2.短路方法:短路方法可以尽早结束对流的操作,不必检查每个元素。
Stream常用的中间方法:
filter(Predicate predicate):过滤所有不符合predicate的元素。
map ToXxx(ToXxxFunction mapper):使用ToXxxFunction对流中的元素进行一对一的转换,返回一个新流包含转换后生成的所用元素。
peek(Consumer action):依次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素。该方法主要用于调试。
distinct():该方法用于排序流中所用重复的元素(判断元素重复的标准是使用equals()方法比较返回true)。这是一个有状态的方法。
sorted():该方法保证流中的元素在后续的操作中处于有序状态。这是一个有状态的方法。
limit(long maxSize):该方法用于保证对流的后续访问中最大允许的元素个数。这是一个有状态,短路方法。
常用的末端方法:
forEach(Consumer action):遍历流中的元素,对每个元素执行action。
toArray():将流中所有的元素转换为数组形式。
reduce():该方法有三个重载的版本,都用于通过某种操作来合并流中的元素。
min():返回流中元素的最小值。
max():返回流中元素的最大值。
count():返回流中所用元素的数值。
anyMatch(Predicate predicate):判断流中是否至少包含一个符合Predicate条件。
allMatch(Predicate predicate):判断流中是否每个元素都符合Predicate条件。
noneMatch(Predicate predicate):判断流中是否所有元素都不包括符和Predicate条件。
findFirst():返回流中第一个元素。
findAny():返回流中任意一个元素。
public class CollectionStream {
public static void main(String[] args){
Collection books = new HashSet();
books.add(new String("轻量级java应用开发"));
books.add(new String("疯狂java讲义"));
books.add(new String("疯狂IOS讲义"));
books.add(new String("疯狂Ajax讲义"));
books.add(new String("疯狂android讲义"));
//统计书中包含“疯狂”子串的图书数量
//输出:4
System.out.println(books.stream()
.filter(ele -> ((String)ele).contains("疯狂"))
.count());
//统计书名中包含“java”子串的图书数量
//输出:2
System.out.println(books.stream()
.filter(ele -> ((String)ele).contains("java"))
.count());
//统计图书中字符串长度大于10的图书数量
//输出:2
System.out.println(books.stream()
.filter(ele -> ((String)ele).length() > 10)
.count());
/*先调用Collection对象的stream方法将集合转换为Stream
* 再调用Stream中的mapToXxx()方法,进行转换
*/
books.stream().mapToInt(ele -> ((String)ele).length())
//用forEach方法遍历IntStream中每个元素
//输出:8 8 7 11 11
.forEach(System.out::println);
}
}
---------《疯狂java讲义》8.2
java集合 之 Collection和Iterator接口的更多相关文章
- java集合(2)-Collection与Iterator接口
1 package com.j1803.collectionOfIterator; 2 import java.util.ArrayList; 3 import java.util.Collectio ...
- Java集合【2】--iterator接口详解
目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...
- JAVASE(十四) 集合: 数组和集合、Collection、Iterator、List、Set、Map
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.数组和集合 1.1 内存中对数据进行存储和管理的“容器”:数组,集合 1.2 数组存储的特点和缺点 ...
- Java 集合系列18之 Iterator和Enumeration比较
概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括:第1部分 Iterator和Enumeration区别第2部分 Iterator和Enumeration实例 转载请 ...
- Java集合框架Collection
转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...
- Java集合之Collection接口
java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口. 一些Collection允 ...
- Java API ——Collection集合类 & Iterator接口
对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...
- Java容器深入浅出之Collection与Iterator接口
Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系.其中包括: 1. Co ...
- Java | 集合(Collection)和迭代器(Iterator)
集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...
随机推荐
- 潮流设计:15个创意的 3D 字体版式作品欣赏
3D字体设计是真的很棒,它最适用于广告.使用3D文字和不同的惊人效果,例如灯光或纹理带来了很多东西.在版式设计中,最重要的是消息.如果它抓住了用户的注意力,设计工作是在正确的轨道上. 您可能感兴趣的相 ...
- C++ 多态的实现原理与内存模型
多态在C++中是一个重要的概念,通过虚函数机制实现了在程序运行时根据调用对象来判断具体调用哪一个函数. 具体来说就是:父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际 ...
- node-gyp rebuild 卡住?
最近 npm install 时候经常遇到在 node-gyp rebuild 那里卡很久的情况(大于十分钟),于是研究了一下输出的错误日志解决了这个问题,在这里分享一下. 首先,请检查 node-g ...
- SQL Server里PIVOT运算符的”红颜祸水“
在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符.我经常引用这个与语言结构是SQL Server里最危险的一个——很 ...
- spring AspectJ的Execution表达式
Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式 execu ...
- EncryptionHelper
public static class EncryptionHelper { #region const /// <summary> /// 默认使用的适合于DES,RC2算法的Key / ...
- dos系统
实验一 命令解释程序的编写 一.目的和要求 1. 实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3)掌握C语言编程初步. 2.实验要求 编写类似于DOS,UNIX的命 ...
- Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
导读 行文本输入框在用于界面的文本输入,在WEB登录表单中应用广泛.一般行文本编辑框可定制性较高,既可以当作密码输入框,又可以作为文本过滤器.QLineEdit本身使用方法也很简单,无需过多的设置就能 ...
- MVC知识点02
MVC基础知识详情 1:在MVC中如果要从前台页面(.aspx)获取参数,只需要将其两个页面的参数设置成一样的,这样子MVC中的机制就会自动的将参数的值传到方法中. 2:在MVC中的方法要是两个都是相 ...
- 自学silverlight 5.0
这是一个silverlight游戏:http://keleyi.com/keleyi/phtml/silverlight/ 接了个单子,非要用Silverlight 5来作一个项目,之前从来没接触过这 ...