一、各Set实现类的性能分析

HashSet和TreeSet是Set的两个典型实现。HashSet的性能总是比TreeSet好(特别是最常用的添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。

HashSet的子类:LinkedHashSet,对于普通的插入、删除操作,LinkedHashSet比HashSet要略微慢一点,这是由维护链表所带来的额外开销造成的,但由于有了链表,遍历LinkedHashSet会更快

EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素

Set的三个实现类HashSet、TreeSet和EnumSet都是线程不安全的。如果有多个线程同时访问一个Set集合,并且有超过一个线程修改了该Set集合,则必须手动保证该Set集合的同步性。通常可以通过Collections工具类的synchronizedSortedSet方法“包装”该Set集合。这个操作最好在创建时进行,以防止对Set集合的意外非同步访问。

二、各种线性表的性能分析

Java提供的List就是一个线性表接口,而ArrayList、LinkedList又是线性表的两种典型实现:基于数组的线性表和基于链表的线性表。Queue代表了队列,Deque代表了双端队列(既可作为队列使用,也可作为栈使用)

一般来说,由于数组以一块连续内存区来保存所有的数组元素,所以数组在随机访问时性能最好,所有的内部以数组作为底层实现的集合在随机访问时性能都比较好;而内部以链表作为底层实现的集合在执行插入、删除操作时有较好的性能。但总体来说,ArrayList的性能比LinkedList的性能要好,因此大部分时候都应该考虑使用ArrayList。

关于使用List集合有如下建议:
    
     1. 如果需要遍历List集合元素,对于ArrayList、Vector集合,应该使用随机访问方法(get)来遍历集合元素,这样性能更好;对于LinkedList集合,则应该采用迭代器(Iterator)来遍历集合元素。

2. 如果需要经常执行插入、删除操作来改变包含大量数据的List集合的大小,可考虑使用LinkedList集合。使用ArrayList、Vector集合可能需要经常重新分配内部数组的大小,效果可能较差。

3. 如果有多个线程需要同时访问List集合中的元素,开发者可考虑使用Collections将集合包装成线程安全的集合。

三、各Map实现类的性能分析
    
     对于Map的常用实现类而言,虽然HashMap和Hashtable的实现机制几乎一样,但由于Hashtable是一个古老的、线程安全的集合,因此HashMap通常比Hashtable要快。
    
     TreeMap通常比HashMap、Hashtable要慢(尤其在插入、删除key-value对时更慢),因为底层采用红黑树来管理key-value对(红黑树的每个节点就是一个key-value对)。

使用TreeMap有一个好处: TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作。当TreeMap被填充之后,就可以调用keySet(),取得由key组成的Set,然后使用toArray()方法生成key数组,接下来使用Arrays的binarySearch()方法在已排序的数组中快速地查询对象。

对于一般的应用场景,程序应该多考虑使用HashMap,因为HashMap正是为快速查询设计的(HashMap底层其实也是采用数组来存储key-value对)。但如果程序需要一个总是排好序的Map时,则可以考虑使用TreeMap。
    
     LinkedHashMap比HashMap慢一点,因为它需要维护链表来保持Map中key-value时的添加顺序。IdentityHashMap性能没有特别出色之处,因为它采用与HashMap基本相似的实现,只是它使用==而不是equals()方法来判断元素相等。EnumMap的性能最好,但它只能使用同一个枚举类的枚举值作为key。

转载于:https://www.cnblogs.com/chenfengl/p/10726531.html

Java集合性能分析-疯狂Java讲义相关推荐

  1. java集合性能_Java集合性能分析-疯狂Java讲义

    一.各Set实现类的性能分析 HashSet和TreeSet是Set的两个典型实现.HashSet的性能总是比TreeSet好(特别是最常用的添加.查询元素等操作),因为TreeSet需要额外的红黑树 ...

  2. Java 集合框架分析:JAVA集合中的一些边边角角的知识

    相关文章: Java 集合框架分析:Set http://blog.csdn.net/youyou1543724847/article/details/52733723 Java 集合框架分析:Lin ...

  3. Java 集合框架分析:线程安全的集合

    相关文章: Java 集合框架分析:Set http://blog.csdn.net/youyou1543724847/article/details/52733723 Java 集合框架分析:Lin ...

  4. Java集合(一)Java集合及其关系

    本文目录 1 Java集合接口继承关系和实现 1.1 Java集合包 1.2 Java集合接口关系 1.3 Java集合框架类关系及特性 2 Java集合接口/类简述 2.1 Collection,i ...

  5. (转)性能分析之-- JAVA Thread Dump 分析综述

    原文链接:http://blog.csdn.net/rachel_luo/article/details/8920596 最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相 ...

  6. Java:集合类性能分析

    1.Java 集合框架图 -集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础. -抽象类:5个抽象类(长虚线表示),对集合接口的部分实现.可扩展为自定义集合类. -实现类:8个实现 ...

  7. Java集合:什么是Java集合?

    一.集合的由来 通常,我们的Java程序需要根据程序运行时才知道创建了多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需 ...

  8. 广州Java培训,疯狂Java如何?谈谈疯狂Java,谈谈李刚

    蛇年已经过了快一个月了,本以为年后好找工作,没想到面试了几家企业才发现,自己尽然连一些框架的原理都没学到,基础不扎实不说,项目经验更是少得可怜,没办法,这几天只好又找了其它培训机构的一些项目视频重新学 ...

  9. Java集合之Stack(出自Java知识体系)

    安琪拉正在梳理Java知识体系,这篇讲Java集合的Stack.如果希望获取完整的<安琪拉Java知识体系>整理中, 完成后公众号回复"知识体系" 即可获取. 完整的J ...

最新文章

  1. 如果有一天 Pytorch / Tensorflow 不开源了,我们该怎么办?
  2. spark 简单实战_大数据入门与实战-Spark上手
  3. ubuntu中使用VsCode+Eigen创建Eiegn应用程序
  4. CentOS 7下安装Logstash ELK Stack 日志管理系统(上)
  5. c语言prime函数怎么用_C语言 要发就发
  6. 计算机投诉信英语作文,投诉信A Letter of Complaint
  7. ORC 在 Hive 中的应用
  8. mysql自带订阅功能_为博客提供订阅功能
  9. python教材答案第四章_python核心编程课后习题解答第四章
  10. 最详细的git( Github和Gitee )入门使用(上传与克隆)
  11. C++随记总结(1)----关于C++中的大小端、位段(惑位域)和内存对齐
  12. Cesium:加载OSGB倾斜摄影三维模型
  13. 玩转opencv之有趣的调色板
  14. 君子不玩物丧志,亦常以借物调心,网站集成二次元网页小组件(widget)石蒜模拟器,聊以赏玩
  15. 考驾照 一把过 74天拿证 这速度还可以?
  16. 51la图片做网店流量统计
  17. DB2DIAG 命令学习
  18. JAVA-JDBC事务基础概念及测试方法
  19. AutoCAD AutoLisp 脚本编写
  20. Win10 渗透工具包

热门文章

  1. XML指南——XML元素
  2. Android-消息机制总结
  3. 【WPF】wpf image控件加载网络图片不显示问题,
  4. (Call Stack)
  5. AspxTreeList获取选中项的值
  6. DB2对年份的处理Year()
  7. C++学习笔记-类定义的注意事项和C#的区别
  8. 安全的本质--理解CIA和AAA
  9. 消费者rebalance机制分析
  10. 仿形靠模的计算机设计方法,仿形靠模的计算机设计方法.pdf