点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~


今天心情有点粉,来学学 Collection 吧!

什么是集合?

  • 集合,或者叫容器,是一个包含多个元素的对象;
  • 集合可以对数据进行存储,检索,操作;
  • 它们可以把许多个体组织成一个整体:
    • 比如一副扑克牌(许多牌组成的集合);
    • 比如一个电话本(许多姓名和号码的映射)。

什么是集合框架?

集合框架是一个代表、操作集合的统一架构。所有的集合框架都包含以下几点:

  • 接口:表示集合的抽象数据类型。接口允许我们操作集合时不必关注具体实现,从而达到“多态”。在面向对象编程语言中,接口通常用来形成规范。
  • 实现类:集合接口的具体实现,是重用性很高的数据结构。
  • 算法:用来根据需要对实体类中的对象进行计算,比如查找,排序。
    • 同一种算法可以对不同的集合实现类进行计算,这是利用了“多态”。
    • 重用性很高。

不仅 Java,其他语言也有一些集合框架,比如 C艹 的 STL(标准模板库),Smalltalk 的集合层次结构。不同于他们陡峭的学习曲线,Java 集合框架设计的更加合理,学习起来更加轻松。

使用集合框架有什么好处呢?

使用 Java 集合框架能有以下几点好处:

  • 编码更轻松:Java 集合框架为我们提供了方便使用的数据结构和算法,让我们不用从头造轮子,直接操心上层业务就好了。
  • 代码质量更上一层楼:Java 集合框架经过几次升级迭代,数据结构和算法的性能已经优化地很棒了。由于是针对接口编程,不同实现类可以轻易互相替换。这么优雅的设计,省下你自己磨练多少工夫,恩?!
  • 减少学习新 API 的成本:过去每个集合 API 下还有子 API 来对 API 进行操作,你得学好几层才能知道怎么使用,而且还容易出错。现在好了!有了标准的 Java 集合框架,每个 API 都继承自己顶层 API,只负责具体实现,一口气学 5 个集合,不费劲!
  • 照猫画虎也容易多了:由于顶层接口已经把基础方法都定义好了,你只要实现接口,把具体实现方法填好,再也不用操心架构设计。

Java 集合框架主要结构图

如上图所示,Java 的集合主要按两种接口分类:Collection, Map.

Collection 接口

Collection 作为集合的一个根接口,定义了一组对象和它的子类需要实现的 15 个方法:

对集合的基础操作,比如 :

  • int size()

    • 获取元素个数
    • boolean isEmpty()
    • 是否个数为 0
    • boolean contains(Object element)
    • 是否包含指定元素
    • boolean add(E element)
    • 添加元素,成功时返回 true
    • boolean remove(Object element)
    • 删除元素,成功时返回 true
    • Iterator<E> iterator()
    • 获取迭代器

还有一些操作整个集合的方法,比如 :

  • boolean containsAll(Collection<?> c)

    • 是否包含指定集合 c 的全部元素
  • boolean addAll(Collection<? extends E> c)
    • 添加集合 c 中所有的元素到本集合中,如果集合有改变就返回 true
  • boolean removeAll(Collection<?> c)
    • 删除本集合中和 c 集合中一致的元素,如果集合有改变就返回 true
  • boolean retainAll(Collection<?> c)
    • 保留本集合中 c 集合中两者共有的,如果集合有改变就返回 true
  • void clear()
    • 删除所有元素

还有对数组操作的方法:

  • Object[] toArray()

    • 返回一个包含集合中所有元素的数组
  • <T> T[] toArray(T[] a)
    • 返回一个包含集合中所有元素的数组,运行时根据集合元素的类型指定数组的类型

在 JDK 8 以后,Collection 接口还提供了从集合获取连续的或者并行流:

  • Stream<E> stream()
  • Stream<E> parallelStream()

点击这里了解流 Stream.

遍历 Collection 的几种方式:

  1. for-each语法

    Collection<Person> persons = new ArrayList<Person>();
    for (Person person : persons) {
    System.out.println(person.name);
    }
  2. 使用 Iterator 迭代器

    Collection<Person> persons = new ArrayList<Person>();
    Iterator iterator = persons.iterator();
    while (iterator.hasNext) {
    System.out.println(iterator.next);
    }
  3. 使用 aggregate operations 聚合操作

    Collection<Person> persons = new ArrayList<Person>();
    persons
    .stream()
    .forEach(new Consumer<Person>() {
    @Override
    public void accept(Person person) {
    System.out.println(person.name);
    }
    });

Aggregate Operations 聚合操作

在 JDK 8 以后,推荐使用聚合操作对一个集合进行操作。聚合操作通常和 lambda 表达式结合使用,让代码看起来更简洁(因此可能更难理解)。下面举几个简单的栗子:

1.使用流来遍历一个 ShapesCollection,然后输出红色的元素:

myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

2.你还可以获取一个并行流(parallelStream),当集合元素很多时使用并发可以提高效率:

myShapesCollection.parallelStream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

3.聚合操作还有很多操作集合的方法,比如说你想把 Collection 中的元素都转成 String 对象,然后把它们 连起来:

String joined = elements.stream()
.map(Object::toString)
.collect(Collectors.joining(", "));

看起来是不是非常简洁呢!

聚合操作还有很多功能,这里仅做介绍,想要了解更多可以查看Aggregate Operations 官方指引

Iterator 迭代器

Java 集合解析:IteratorJava 集合解析:ListIterator 我介绍了 Collection 的迭代器 Iterator 以及用于 List 的迭代器 ListIterator。

结合 Collection 和 Iterator 可以实现一些复用性很强的方法,比如这样:

public static void filter(Collection<?> c) {
for (Iterator<?> it = c.iterator(); it.hasNext(); )
if (!condition(it.next()))
it.remove();
}

这个 filter 方法是多态的,可以用于所有 Collection 的子类、实现类。 这个例子说明了使用 Java 集合框架我们可以很随便就写出 “优雅,可拓展,复用性强” 的代码~

总结

Collection 接口是类集框架的基础之一。

它创建所有类集都将拥有的 15 个核心方法。

因为几乎所有集合类集都实现了 Collection接口,所以熟悉它对于清楚地理解框架是必要的。

接下来将逐步了解集合框架的各个子接口及实现类。

感谢 密哥 提醒,parallel 应该是并行,而不是并发。

并发与并行的概念区别还是挺大的。

并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。

而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。

从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。

http://zhidao.baidu.com/link?url=1L6YSAULAhjLH4ZYfO0yCbKlvo8DJeQMtCmCLKYpENStbpxNDiFCwaJf4iZaNDr7cho37GctXOddek3LhrO3_K

这里 看到的一幅生动形象图:

Thanks

https://docs.oracle.com/javase/tutorial/collections/intro/index.html

https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

http://joearms.github.io/2013/04/05/concurrent-and-parallel-programming.html

Java 集合深入理解(3):Collection的更多相关文章

  1. Java 集合深入理解(4):List<E> 接口

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...

  2. Java 集合深入理解(8):AbstractSequentialList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...

  3. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  4. Java 集合深入理解(15):AbstractMap

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天来了解下 AbstractMap. 什么是 AbstractMap AbstractMap 是 Map 接口的的实现类 ...

  5. Java 集合深入理解(14):Map 概述

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...

  6. Java 集合深入理解(12):古老的 Vector

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天刮台风,躲屋里看看 Vector ! 都说 Vector 是线程安全的 ArrayList,今天来根据源码看看是不是这 ...

  7. Java 集合深入理解(11):LinkedList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情鱼肚白,来学学 LinkedList 吧! 日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就 ...

  8. Java 集合深入理解(9):Queue 队列

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情不太好,来学一下 List 吧! 什么是队列 队列是数据结构中比较重要的一种类型,它支持 FIFO,尾部添加.头部 ...

  9. Java 集合深入理解(6):AbstractList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情比天蓝,来学学 AbstractList 吧! 什么是 AbstractList AbstractList 继承自 ...

随机推荐

  1. 多分类问题中,实现不同分类区域颜色填充的MATLAB代码(demo:Random Forest)

    之前建立了一个SVM-based Ordinal regression模型,一种特殊的多分类模型,就想通过可视化的方式展示模型分类的效果,对各个分类区域用不同颜色表示.可是,也看了很多代码,但基本都是 ...

  2. spring校验相关

    转载:http://elim.iteye.com/blog/1812584 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证 ...

  3. BZOJ1579 [Usaco2009 Feb]Revamping Trails 道路升级

    各种神作不解释QAQQQ 先是写了个作死的spfa本机过了交上去T了... 然后不想写Dijkstra各种自暴自弃... 最后改了一下步骤加了个SLF过了... 首先一个trivial的想法是$dis ...

  4. java使用dom4j解析xml文件

    关于xml的知识,及作用什么的就不说了,直接解释如何使用dom4j解析.假如有如下xml: dom4j解析xml其实很简单,只要你有点java基础,知道xml文件.结合下面的xml文件和java代码, ...

  5. 转 velocity 模板使用总结

    Velocity是一个基于java的模板引擎.它允许任何人仅仅简单的使用模板语言来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一 ...

  6. ORACLE 建库过程总结

    1,忘记sys密码 打开CMD命令窗口,执行以下操作: ,SQLPLUS /NOLOG; , ,CONNECT / AS SYSDBA , ,ALTER USER SYS IDENTIFIED BY ...

  7. Java DES 加解密文件

    import com.mchange.v2.io.DirectoryDescentUtils; import javax.crypto.Cipher;import javax.crypto.Ciphe ...

  8. Protocol Buffers in HBase

    For early Hbase developers, it is often a nightmare to understand how the different modules speak am ...

  9. ASP.NET MVC4 部分视图

    ASP.NET MVC4 部分视图 2014-10-24 16:48 by 易code, 2662 阅读, 1 评论, 收藏, 编辑 [部分视图] ASP.NET MVC 里的部分视图,相当于 Web ...

  10. 7 libjpeg使用

    一.交叉编译libjepg编译 tar xzf libjpeg-turbo-1.2.1.tar.gz ./configure –help ./configure --prefix=/work/proj ...