Java集合类以及如何分类

Java中的集合类有哪些?都是怎么分类的呢?

        Java中整个集合框架中,主要非为List、Set、Queue、Stack、Map等数据结构。其中,前四种数据结构都是单一元素的组合,而最后的Map则是以KV对的形式使用。

        从继承的关系上讲,List、Set、Queue都是Collection的子接口,Collection又继承了Iterable接口,说明这几种集合都是可以遍历的。看图:

Java集合类以及如何分类_第1张图片

从功能上讲,List代表一个容器,可以是先进先出,也可以是先进后出。而Set相对于List来说,是无序的,同时也是一个去重(chong)的列表,既然会去重,就一定会通过equals、compareTo、hashCode、等方法进行比较。Map则是KV的映射,也会涉及到Key值的查询等能力。

从实现上来讲,List可以有链表实现或则可以有数组实现,两者各有优劣,链表的话增删快,数组的话查询快。Queue的话则可以实现优先队列、双端队列等等。Map的话则可以实现分为普通的HashMap和可以进行排序的TreeMap等等。

可能有的小伙伴看到Collection时,只是知道认识或者了解,不能明白这个东西到底是做什么的,那就一起复盘一下......。

Collection和Collections的区别:

  • Collection 是一个集合接口:它呢提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多种的具体的实现。是List、Set等的父接口。
  • Collections 是一个包装类:它包含有各种有关集合操作的静态多态方法。这个类不能被实例化,就像是一个工具类,服务于Java 的 Collection框架。在日常开发中的话,不仅要了解到Java 的Collection 及其子类的用法,还要了解Collections 用法。可以提升很多处理集合类的效率。

Java中的Collection又是如何进行迭代的呢?

  • 传统的for循环遍历,是基于计数器的:遍历者自己在集合外部维护一个计数器,然后呢,依次读取每一个位置的元素,当读取到最后一个元素的话,停止。其主要就是需要按照元素的位置来进行读取元素。
  • 迭代器遍历,Iterator:每一个具体实现的数据集合,一般都需要提供相应的Iterator。相比于传统的for循环,Iterator取缔了显式的遍历计数器。所以基于顺序存储集合的Iterator可以直接按照位置访问数据。而基于链式存储集合的Iterator,正常的实现,都是需要保存当前遍历的位置。然后根据当前位置来向前或者侯移动指针。
  • foreach循环遍历:根据反编译的字节码可以发现,foreach内部也是采用了Iterator的方式实现,只不过是Java编译器帮我们生成了这些代码,我们直接用就可以。
  • 迭代遍历器:Enumeration:Enumeration接口是Iterator迭代器的“古老版本”,从JDK 1.0开始,Enumeration接口就已经存在了(Iterator从JDK 1.2才出现),大家可以去看一下相关的资料。
  • Stream:JDK 1.8中新增了Stream,使用一种类似于SQL语句从数据库查询数据的直观方式来提供一种对Java 集合运算和表达的高阶抽象。Stream API可以极大的提高Java 程序员的生产力,让程序员写出高效率,更简洁的代码。

Iterable和Iterator如何调用呢?

Iterator 和 Iterable 是两个接口,前者代表的是迭代的方式,比如:next 和 hasNext 两个方法就是需要在该接口中实现。后者代表的是 是否可以迭代,如果可以迭代的话,会返回Iterator接口,也就是说返回迭代方式。

常见的使用方法一般是集合实现 Iterable 表明这个集合可以遍历,同时选择 Iterator 或者是自定义一个 Iterator 的实现类去选择遍历方式,看下面代码:

class AbstractList implements Iterable {

    public Iterable iterator() {
        
        
        return new Itr();
    }

    private class Itr implements Iterable {

    
    }
}

最后一问:为什么不能把Iterable 和 Iterator 合成一个使用呢?

  1. 通过Javadoc文档可以看出来,Iterable 和Iterator 并不是同时实现的,上面也说过,Iterator在 1.2 就出现了,目的是为了代替 Enumeration ,而Iterable 则是1.5 才出现的。
  2. 将是否可以迭代和迭代方式抽出来,更符合单一职责原则,如果抽出来,那迭代方式就可以被多个可迭代的集合复用,是不是更符合面向对象的特点呢?

OK,关注,后期定期出现干货热点问题,可能你的工作中用不到,但是等到用到的时间再去抱佛脚显然靠不住。脱离业务谈技术,可不就是耍流氓。^-^ ^-^ ^-^

前面几篇文章彻底公开,后面文章只对粉丝公开哦!

你可能感兴趣的:(Java集合类,java)