• 0
  • 0
分享
  • Java集合类框架详解——软件测试圈
  • 曼倩诙谐 2022-03-02 10:16:14 字数 3306 阅读 1276 收藏 0

一、Java集合框架概述

1.png

集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。

Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue,因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。

常见的实现类分别是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等。

二、Java集合类常见接口及实现类

1.Collection接口

Collection接口是最基本的集合接口,它不提供直接的实现,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

在Java中所有实现了Collection接口的类都必须提供两套标准的构造函数,一个是无参,用于创建一个空的Collection,一个是带有Collection参数的有参构造函数,用于创建一个新的Collection,这个新的Collection与传入进来的Collection具备相同的元素

2.List接口

List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。 用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Stack等。

3.Map接口

Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。 实现map的有:HashMap、TreeMap、HashTable。

三、ArraysList 和 LinkedList

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

4.ArrayList的大小默认为10,每次扩容为1.5倍,即为int newCapacity = oldCapacity + (oldCapacity >> 1)。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

5.ArrayList中的size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。

6.同样实现List接口的LinkedList与ArrayList不同,LinkedList是一个双向链表。所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。

四、HashMap 和 TreeMap

1.HashMap

以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。其不是同步的,且允许空值作为键和值。

HashMap的数据结构为数组+链表/红黑树(冲突的链表多于8个时,就把这个链表转换成红黑树),初始容量是16,默认加载因子为0.75。

HashMap的长度n为什么是2的整数次幂?一是为了减少hash冲突的概率,n为偶数 最低位为0 异或后结果必为偶数;其次是为了加快hash计算,&比%速度快;还有在JDK1.8中,扩容更方便,关注特殊位(n-1会多出一位,然后关注和这位对齐的hash,0不变,1加一个扩容之前的n)。

HashMap在JDK 1.7中使用的是头插法,在并发put时出现Entry链表形成环形数据结构,导致死循环,为了解决这个问题,在JDK1.8中使用的是尾插法。

如何保证HashMap的线程安全,一是Collections工具类中synchronizedCollection;二是采用装饰者模式实现map接口对HashMap进行封装;三是直接使用ConcurrentHashMap。

2.TreeMap

TreeMap存储K-V键值对,通过红黑树(R-B tree)实现;

TreeMap继承了NavigableMap接口,NavigableMap接口继承了SortedMap接口,可支持一系列的导航定位以及导航操作的方法,当然只是提供了接口,需要TreeMap自己去实现;

TreeMap实现了Cloneable接口,可被克隆,实现了Serializable接口,可序列化;

TreeMap因为是通过红黑树实现,红黑树结构天然支持排序,默认情况下通过Key值的自然顺序进行排序;

五、对集合的选择

1.对List的选择

对于随机查询与迭代遍历操作,数组比所有的容器都要快。所以在随机访问中一般使用ArrayList

LinkedList使用双向链表对元素的增加和删除提供了非常好的支持,而ArrayList执行增加和删除元素需要进行元素位移。

对于Vector而已,我们一般都是避免使用。

将ArrayList当做首选,毕竟对于集合元素而已我们都是进行遍历,只有当程序的性能因为List的频繁插入和删除而降低时,再考虑LinkedList。

2.对Set的选择

HashSet由于使用HashCode实现,所以在某种程度上来说它的性能永远比TreeSet要好,尤其是进行增加和查找操作。

虽然TreeSet没有HashSet性能好,但是由于它可以维持元素的排序,所以它还是存在用武之地的。

3.对Map的选择

HashMap与HashSet同样,支持快速查询。虽然HashTable速度的速度也不慢,但是在HashMap面前还是稍微慢了些,所以HashMap在查询方面可以取代HashTable。

由于TreeMap需要维持内部元素的顺序,所以它通常要比HashMap和HashTable慢。



作者:张玥   

来源:http://www.51testing.com/html/75/n-4481375.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   一、方案特色:  1.一体化:统一技术体系、统一管控模式、统一调度模式、统一用户体验,有效的提升了平台本身的可维护性,极大的提升了平台的用户体验和使用成本;  2.分层回归:支持分层自动化(单元测试、接口测试、WebUI自动化、前端测试)和端到端(全链路WebUI自动化)持续回归;  3.集成性:提供丰富的API,便于与其他平台(如研发协作平台等)的集成;  4.原子性:方案的运作具备独立的使用周期,不依赖于其他平台或系统;  5.扩展性:自主研发,可快速进行方案扩展,如代码质量度量体系、覆盖率、持续集成等;  6.业务解耦:自动化管控模块AQC-Auto与手动用例管控模块AQC-Case...
            1 1 1614
            分享
          •   如何使用Greenshot做好测试过程中的截图留痕工作?  在功能测试中,执行每一条测试用例时,都需要对这条用例的执行结果进行记录,以防后续在与开发沟通交流缺陷的过程中出现缺陷不能复现等情况发生。  可是,不好用的截图工具以及截图文件的整理都大大地增加了测试的工作量。因此,这就需要一款方便的截图工具来提升我们测试截图留痕的工作效率,在朋友的推荐下,我选择了Greenshot。  Greenshot是可配置且易于使用的,而且是一款免费的屏幕快照工具。话不多说,接下来我为大家介绍一下如何使用Greenshot做好测试过程中的截图留痕工作。  Greenshot的安装这里就不做过多介绍,大家记得...
            13 13 1921
            分享
          •   一、背景  随着自动化测试的设计理念不断完善、新的技术不断应用,自动化测试资产的积累代价和维护成本不断降低,自动化测试资产的数量持续增长。同时,随着DevOps的普及,应用研发过程越来越敏捷,自动化测试能力逐步从测试部门输出至开发部门,在每日构建、制品晋级、版本发布等流程中成为必备环节。  随着自动化测试执行能力的不断提升,自动化测试执行结果数据指数级增加,大量的结果分析处理工作成为自动化测试开展的瓶颈。本文介绍一种基于知识库的接口自动化测试结果分析方法与装置,通过接口测试结果模型化方法和基于错误码库、非缺陷知识库的错误归类分析方法,辅助测试人员高效实施大规模、多系统的接口自动化测试结果分...
            0 0 734
            分享
          •   据曼谷邮报(Bangkok Post)今日报道,一位熟悉字节跳动的消息人士透露,字节跳动旗下的 BytePlus 部门正考虑于 2025 年在泰国建立一个数据中心,提供基于云和人工智能(AI)的服务。  该消息人士表示,泰国是字节跳动东盟扩张计划的一部分,该国的电子商务具有巨大的增长潜力,特别是在拥有众多追随者和顶级(OTT)参与者的大型零售品牌方面。  报道称,BytePlus 最近通过委任泰国公司 Light Up Total Solution Public Co Ltd(LTS)为其独家经销商,在泰国市场推出技术解决方案,包括实时商务解决方案,旨在利用当地价值约 25 亿美元(IT之...
            0 0 78
            分享
          • 前言:本篇讲堂是紧接【安全测试工具-进阶篇[路径穿越和SQL注入防御]】的内容。例牌,先说下安全测试工具的更新情况【工具地址:https://gitee.com/samllpig/SafeTool-51testing】定位内容模块,添加重放功能集成平台,增加令牌弱密钥爆破、时间戳转换、生成JWT身份令牌三大模块小工具-编码器模块,增加Base64Url编解码功能 身份验证、会话管理、访问控制堪称web系统最重要的三大安全机制,是恶意黑客重点进攻的方向,也就是测试人员重点测试的方面。 本篇讲堂详细讲解身份验证,让大家理解,黑客是如何利用身份验证的设计缺陷,或讲漏洞,获得合法身...
            2 2 40
            分享
      • 51testing软件测试圈微信