`
jiuyuehe
  • 浏览: 181998 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

边读边写【3】 ----java 集合包之各个集合性能分析

阅读更多
上次主要看了Map接口,以及Map的选择地址:
http://jiuyuehe.iteye.com/blog/1480386
这次看的是Set接口。还有一个总结,到这里java常用的集合基本就这些了。总结下,分析分析性能。

Set 跟List 最明显的区别就是 Set 不允许元素重复,而List 可以。
Set中主要是HashSet 跟TreeSet


HashSet
api 中对它如下解释:

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此 set 进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。


从源码中也可以看的出来
  private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
	map = new HashMap<E,Object>();
    }


他就是用了一个Map 把key弄能了一个new Object() hash 到他实际的地址中,原来就是HashMap嘛。那具体还是回到了Map中  。点击看HashMap

-----------------------------------分割线------------------------------------------------

TreeSet
这个HashSet 就是由HashMap 实现,TreeSet 是不是TreeMap 呢。

 private static final Object PRESENT = new Object();

    /**
     * Constructs a set backed by the specified navigable map.
     */
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }

    /**
     * Constructs a new, empty tree set, sorted according to the
     * natural ordering of its elements.  All elements inserted into
     * the set must implement the {@link Comparable} interface.
     * Furthermore, all such elements must be <i>mutually
     * comparable</i>: {@code e1.compareTo(e2)} must not throw a
     * {@code ClassCastException} for any elements {@code e1} and
     * {@code e2} in the set.  If the user attempts to add an element
     * to the set that violates this constraint (for example, the user
     * attempts to add a string element to a set whose elements are
     * integers), the {@code add} call will throw a
     * {@code ClassCastException}.
     */
    public TreeSet() {
	this(new TreeMap<E,Object>());
    }


还真是-。那继续点击看TreeMap

========================================大分割线=======================================================
点击看List
点击看Map

这里将java集合包里面常用的集合以及他的实现都过了一下,这些集合各有各的特点,各有各的缺点。那么什么时候选什么集合,这里总结下:

性能测试: 单线程下,测试集合大小分别为100,1000,10000.情况下的add remove get 测试10次取平均.

以下数据来自《分布式java应用》
A=ArrayList  L= LinkedList HS= HashSet HM = HashMap TS = TreeSet V =Vector S =Stack TM = TreeMap
元素100时候(单位ns)
集合            增加        查找        删除
A              3756        2873         2444
L              3251        2829         2330
V              2402        2846         2704  
S              2180        2572         2277   
HS             2930        1559         1720
TS             5662        1846         4413
HM             3004        1579         1726
TM             5410        1840         4123


元素1000时候
集合            增加        查找        删除
A              4156        8873         9444
L              3251        12829        12330
V              2802        10846        9704  
S              1880        10572         9277   
HS             2130        1559         2720
TS             3062        1846         4413
HM             1995       1579          1726
TM             3410        1840         4123


元素10000时候
集合            增加        查找        删除
A             8156        88873         99444
L              3251        152829        152330
V             8802        95846        95704  
S              1880        96572         99277   
HS             2130        1559         2720
TS             3062        1846         4413
HM             1995       1579          1726
TM             3410        1840         4123



随着元素的增加 add 所以集合基本变动不大 List还是有所下降。 所有List 的删除,查找 性能 大幅度下降。  Set Map 基本不受元素的数量影响。

总结: 对于查找和删除较为频繁,元素量较多的情况(超过10000)Set /Map 才是更好的选择

分享到:
评论

相关推荐

    JAVA中常用的集合类型

    Java 中的集合类型 Java 中的集合类型是指在 Java 语言中用于存储和操作数据的高级数据类型。这些集合类型主要有三种形式:Set(集)、List(列表)、Map(映射)。每种类型的集合都包括三部分:接口、实现和算法。...

    Java-Collections-Benchmark:展示每个集合的CRUD性能的基准

    集合:HashSet用于创建,更新和删除,LinkedHashSet用于读取。 全部:LinkedList用于创建,ArrayList用于读取,LinkedHashMap用于更新,HashMap用于删除 清单 -------------------------------------------------...

    Java面试题-基础和集合.docx

    文件内容简介: ...总的来说,该文件提供了一份全面的Java面试准备指南,涵盖了从基础知识到高级概念的各个方面,适用于准备Java编程语言相关岗位的求职者,以及希望加深对Java语言理解的开发者和学习者。

    Java遍历集合方法分析(实现原理、算法性能、适用场合)

    Java语言中,提供了一套数据集合框架,其中定义了一些诸如List、Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList。 除此之外,Java对于数据集合的遍历...

    Java面试宝典-经典

    82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt...

    java软件开发求职试题集合.pdf

    "java软件开发求职试题集合.pdf" 这份文件集合了Java软件开发领域中的多个问题,涵盖了Java基础知识、算法、数据结构、设计模式、Web开发、数据库等方面。下面是对每个问题的详细解释: 1. try-catch-finally语句...

    Java规范Java规范Java规范Java规范

    Java 规范详解 《阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,...《阿里巴巴 Java 开发手册》是 Java 开发者的必备指南,涵盖了 Java 开发的各个方面,帮助开发者提高编码质量和效率。

    java后端宝典进阶版.zip

    Java集合框架:介绍Java中常用的集合类,如List、Set、Map等,以及它们的特点、用法和性能分析,帮助读者选择合适的集合类来解决实际问题。 Java并发编程:深入讲解Java中的线程、锁、并发容器等并发编程相关的知识...

    JAVA开发五年程序员简历模版

    包含了多个模块的面试题讲解,如:Redis、MySQL、框架、微服务、消息中间件、数据结构、Java集合源码分析、多线程、JVM、设计模式、高并发场景、企业实际问题场景等等各个方面逐一讲解。 1、具备扎实的编程基础,...

    JAVA面向对象编程(孙卫琴).part05

    全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机...

    docker部署Java项目流程

    Docker 部署 Java 项目流程 Docker 是一个开源的应用容器引擎,基于 Go 语言开发并遵从 Apache2.0 协议开源。使用 Docker 可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的 Linux 机器...

    Java面试宝典2010版

    82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt...

    2022年JAVA面试题华为IBM.doc

    2. Java 代码的效率考虑:可以通过使用 Java 的性能分析工具来分析代码的效率。 EJB 旳 life cycle 1. EJB 的生命周期:EJB 的生命周期包括创建、激活、钝化、销毁四个阶段。 2. EJB 的分类:EJB 可以分为 Session...

    java面试题大全(2012版)

    82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt...

    java 面试题 总结

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    最新Java面试宝典pdf版

    82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt...

    【文献综述】基于JAVA的俄罗斯方块游戏设计与实现.pdf

    实现跨平 台性的方法是大多数编译器在进行 Java 语言程序的编码时候会生成一个用字节码 (Bytecode)写成的"半成品" ,这个"半成品"会在 Java 虚拟机[7](解释层)的帮助下运 行,虚拟机会把它转换成当前所处硬件...

    Java面试笔试资料大全

    82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt...

Global site tag (gtag.js) - Google Analytics