zoukankan      html  css  js  c++  java
  • 集合框架

    1.HashSet集合框架

    hashSet集合的添加方法上次已经讲过了,我们接下来要在maven工程下来讲其他的一些方法了:

    image

    如上图,把环境弄好。 写个循环来测试一下能否存储值:

    image

    其运行结果如:

    image

    其实我们自己写的hashSet的添加方法的objs数组长度只定义为了10,这是不太够的,我最好都要给定到1000,或者更多一点。这个长度定大一点,集合的运行速度就会更加快一点。

    哈希集合的特点在于检索速度非常快,链表数组删除、修改比较灵活方便、然后就是数组集合的添加比较快。其中数组集合和链表集合是有序集合,而哈希集合是无序集合,它添加进去的【学Java,到凯哥学堂kaige123.com】数据的顺序是打乱的。哈希集合的特点在于检索速度非常快,我们这里有junit来测试一下它的检索速度到底怎么样,先把junit的依赖加进来:

    image

    然后,我们写个junit的测试案例代码,测试一下ArrayList和HashSet两种集合的检索时间的差别:

    image

    由上图,我们可以看出,ArrayList的检索速度和HashSet的检索速度比起来简直是太慢了。

    自己写一个检索方法:

    哈希里面存储数据时用到的是链表集合的方式,我们在检索一个集合中有没有该数据时,要先把这个数据的hash值计算出来,找到相应的位置,然后再到对应位置下的单链里面去一个一个去问。我们的写的contains1方法如下图:

    image

    写这个方法的主要思路就是要先把要检索的数据进行hashCode值的计算,然后定位到在Object数组的哪个位置里面,然后到相应的位置下的单链表里面去一个一个的对比。

    image

    上图是自己写的contains1方法的检索速度测试,

    image

    image

    image

    由上可知,在Object数组长度是10的时候,我们把检索的数据量加到1000000的时候,需要6000多毫秒,这是比较慢的,但是如果我们把Object数组长度增加到10000,再来检索1000000个数据,此时只要21毫秒,可以看出,Object数组的长度越长,检索的速度就会大大的缩短。因为Object数组长度长了,那么每个位置下的单链表的长度就短了,比对的时间就少了。 所以对于hashSet来说,Object数组的长短决定了检索的时间快慢。哈希集合添加速度不快,查找速度非常快,之所以会有这么快的查找速度,是因为它在查找数据之前就已经做好了充分的准备工作。我们写的哈希集合和系统的哈希集合是有一定差距的,系统的哈希集合的Object是可以自动改变长度的。系统的哈希集合的Object数组会自动根据数据量的多少来进行相应的扩大或减少,当数据量多了,Object的长度就会增加。

    集合家族:

    image

    主要的类结构如上图所示。其中Collection、List、Set三个是接口。

    image

    为啥要在最高的集合接口下弄两个不同的接口?有何用途?

    其中List集合是有序集合,可以添加重复值。

    Set集合是无序集合,检索速度非常快,不可添加重复值。这两个都继承于最高接口,它们都是集合。 这个集合框架结构是很好的了,为啥要做不同的集合呢?

    因为集合是数据存储中心,要存数据的,但是存数据时有各种各样的不同的要求,有些要求你存储速度快,有些要求检索速度快,还有一些要求存储有序,所以说为了满足各种需求,我们就应该做出不同的集合接口来进行各种数据的存储。

    集合框架就是包含不同的集合的,每个集合都各有特色,每个集合都是为了某种特定业务而开发出来的。那最高集合接口Collention呢?它实际上就是规定了,规定集合的方法,约定了只要你是集合,就要按照我的方法来,就必须有这些方法。不然就不算是集合了。最高集合是统一方法的。

    ArrayList:有序的、数组的集合
    Vector      数组集合,线程安全的
          >>stack   堆栈集合、进栈出栈的描述很方便,Vector的派生,适用于某些算法。
    LinkedList:双链表集合,上可找下,下可找上,删除、插入、前面加入、中间加入都非常方便灵活的,它的结构没有ArrayList动荡这么大。
    HashSet:天生服务于检索的,检索速度快,无序
    TreeSet:在做到检索速度快的同时,还可以帮你排序,这是二叉树的算法。添加进来的数据会帮你排序摆放(和有顺序不是一回事,添加进来的数据可以排顺序的。)

    先认识一下java.util.Collection,最高的集合接口:

    image

    方法主要有以上这些,可以将这些方法进行分类管理:

    主要有哪几类呢?

    添加数据

    删除数据

    查看数据

    转换数组

    image

    什么是集合? 集合就是可以进行无限存储的容器。重点是容器: 说起容器呢,设计一种容器,应该有哪些类型的方法呢? 比如桶: 要有存放、取出、查询、清除这些类型的功能方法的。 集合是容器,能存储、取出,大体的方法应该设计为下面这些种类:

    image

    添加数据:

    add(Object)每次添加一个数据
    addAll(Collection)批量添加数据对象
    删除数据:
    remove(Object)删除某个数据对象
    removeAll(Collection)批量删除
    retainAll(Collection)交集删除
    clear()清除所有数据
    查询数据:
    iterator拿出所有数据
    contains(Object)检索某个数据
    containsAll(Collection)批量检索
    isEmpty判断是否为空集合
    size看集合的大小

    转换数组 toArray将集合转换为对象数组。 作为一个容器,上面的方法是必须设计出来的,要求我们的每个集合都要有这些方法的。我们设计容器的时候,要把它设计为接口类型,我们是规范容器的功能、不是实现容器的功能,这是设计的重点思路。 如果我们做个集合,也可以遵照上面的最高集合接口规定的方法规则的。

    image

    上面就是交集删除的意思(retainAll)给你的数据是要保留的,其他的删除掉。

    Iterator是迭代器,以后拿值都用迭代器来拿值了,为啥用迭代器来拿值了呢?

    以前不是都用下标来拿值的吗?

    List一般可以用下标来拿值,但是Set也可以用下标来拿值吗?

    Set是不适合按下边拿值的,因为Set是散列的集合,不好按下标来拿值。

    Set集合应该用迭代器来拿值,实际上所有的集合都可以用迭代器来拿值,只不过List也可以使用下标来拿值。

    List集合接口:

    image

    List集合的方法有哪些?如上图。可以看出上面罗列的方法都是基本上与下标有关系的。

    Add(int,Object)按下标插入
    Add(int,Collection)按下标批量插入
    Get(int)按下标获得
    IndexOf(Object)看集合中有没有这个对象,在集合的哪个下标下
    LastIndexOf(Object)从后往前看集合中有没有该对象,在集合的哪个下标下
    ListIterator(int)list的迭代器,甚至可以设置从哪个地方开始迭代取值
    Remove(int)按下标删除
    Set(int,Object)按下标替换
    SubList(int,int)按下标截取

    image

    由上图可知,List的相关方法都是与下标有关系的,这些是List集合特有的用下标控制的方法,所以是不会在Collection里面去规定的。

    Set集合接口里面是没有自己特有的方法的,它的所有方法都是从父类Collection里面继承下来的。为啥它不设计自己的方法呢?

    因为父类的方法都够它的功能了,而且它自己也没有什么特殊的方法要重新设计的。没有必要再重新设计方法。

    总结一下:

    学习了如何搭建集合框架,如何设计每个方法?上面是接口、规范,下面实现。

  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/kaigexuetang/p/7405331.html
Copyright © 2011-2022 走看看