`

Java:集合类性能分析【转】

阅读更多
这篇文章是转的,暂时没有验证文章中的正确性,我有时间会一一验证,大家如果有时间,也可以帮忙验证一下,然后将过程跟结果发一下。
1.Java 集合框架图

-集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。

  -抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。

  -实现类:8个实现类(实线表示),对接口的具体实现。

  2.Java容器类介绍

  ① Java容器类都可以自动地调整自己的尺寸。

  ② Collection 接口是一组允许重复的对象。

  ③ Set 接口继承 Collection,不允许重复,使用自己内部的一个排列机制。

  ④ List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。

  ⑤ Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。

  Java 2简化集合框架图

3.Collection接口

  基本操作

  -增加元素add(Object obj); addAll(Collection c);

  -删除元素 remove(Object obj); removeAll(Collection c);

  -求交集 retainAll(Collection c);

  Collection是最基本的集合接口,所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同类型的元素。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class AddingGroups {
  public static void main(String[] args) {
    Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(
       1, 2, 3, 4, 5));
    Integer[] moreInts={6,7,8,9,10};
    collection.addAll(Arrays.asList(moreInts));
    for (Integer i : collection)
      System.out.print(i + ",");
  }
}

  结果:

  1,2,3,4,5,6,7,8,9,10,

  这里展示了Collection接口的2个用法,首先,Collection构造函数接受另一个Collection(List)作为参数,使其初始化。接着,调用addAll()方法添加元素,注意,该方法只接受另一个Collection作为参数。

  此外,必须注意,Collection接口不提供随机访问元素的get()方法。因为Collection包括Set,而Set自己维护内部顺序。如果想检查Collection中的元素,那就必须使用迭代器。

  4.List接口

  4.1 List接口

  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

  和下面要提到的Set不同,List允许有相同的元素。

  除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

  4.2 LinkedList类

  LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。此实现不是同步的。

  4.3 ArrayList类

  ArrayList实现了可变大小的数组。它允许所有元素,包括null。

  size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。

  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。此实现不是同步的。

  5.Set接口

  5.1 Set接口

  Set具有和Collection完全一样的接口,没有任何额外的功能。它是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。

  很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。

  请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

  5.2 HashSet

  此类实现Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。此类为基本操作提供了稳定性能,此实现不是同步的。

  5.3 LinkedHashSet

  具有可预知迭代顺序的Set 接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于,它维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到set中的顺序(插入顺序)进行迭代。注意,插入顺序不受在set中重新插入的元素影响。此实现不是同步的。

  5.4 TreeSet

  基于TreeMap的NavigableSet实现。使用元素的自然顺序对元素进行排序,或者根据创建set时提供的 Comparator 进行排序,具体取决于使用的构造方法。此实现为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。此实现不是同步的。

  6.Map接口

  请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

  6.1 WeakHashMap

  以弱键实现的基于哈希表的Map。在WeakHashMap中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的Map实现有所不同。此实现不是同步的。

  6.2 TreeMap

  该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。此实现不是同步的。

  6.3 HashMap

  基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用null之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。此实现不是同步的。

  6.4 SortedMap

  进一步提供关于键的总体排序的Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的Comparator进行排序。对有序映射的collection 视图(由 entrySet、keySet 和 values 方法返回)进行迭代时,此顺序就会反映出来。要采用此排序方式,还需要提供一些其他操作(此接口是 SortedSet 的对应映射)。

  7.集合类性能效率总结

  注意,这里展示的类都是非线程安全的。如果需要考虑线程安全,应该使用ConcurrentMap,CopyOnWriteArrayList,CopyOnWriteArraySet等。

接口 实现类 保持插入顺序 可重复 排序 使用说明

  List
ArrayList Y Y N 长于随机访问元素;但插入、删除元素较慢(数组特性)。
LinkedList Y Y N 插入、删除元素较快,但随即访问较慢(链表特性)。

  Set
HashSet N N N 使用散列,最快的获取元素方法。
TreeSet N N Y 将元素存储在红-黑树数据结构中。默认为升序。
LinkedHashSet Y N N 使用散列,同时使用链表来维护元素的插入顺序。

  Map
HashMap N N N 使用散列,提供最快的查找技术。
TreeMap N N Y 默认按照比较结果的升序保存键。
LinkedHashMap Y N N 按照插入顺序保存键,同时使用散列提高查找速度。

  总结

  ①如果涉及到堆栈,队列等操作,应该考虑用List。如果要进行大量的随机访问,应使用ArrayList;如果经常进行插入与删除操作,用使用LinkedList。

  ②HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。

  ③Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。

  ④对哈希表的操作,作为key的对象要正确重写equals和hashCode方法。

  ⑤尽量返回接口而非实际的类型(针对抽象编程),如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。

  ⑥程序中不应该使用过时的VectorHashtableStack。

  本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/69677

  • 大小: 60.6 KB
  • 大小: 15.2 KB
分享到:
评论

相关推荐

    Java集合类性能分析

    Java集合类性能分析 Collection List Map Set

    Cloud_Foundry中Java应用集合类内存泄漏检测_叶瑞浩.caj

    中Java应用内存泄漏的检测,通过监控集合类对象的内存消耗和集合内元素的 使用情况,得出对象内存泄漏的可能性大小,量化对象内存泄漏的风险。检测 系统首先收集垃圾回收事件后的应用内存数据,确定进行...

    java8集合源码分析-Awesome-Java:真棒-Java

    Java集合框架,并发容器,同步容器等 IO框架 Java基础字节流 字符流 NIO等 Java8 Java8语言的行为参数化和流编程等 Java虚拟机 Java虚拟机相关,内存模型,类加载机制,JVM性能解析等 零散的文章 数据结构与算法 ...

    软件测试中的Java列表对象的性能分析和测试

    JAVAJava软件测试中的Java列表对象的性能分析和测试SDK提供了有序集合接口java.util.List的几种实现,其中三种最为人们熟知的是Vector、ArrayList和LinkedList。有关这些List类的性能差别是一个经常被问及的问题。在...

    java后端宝典进阶版.zip

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

    Java面试通关宝典:深度解读核心知识点与实战技巧,全面提升面试表现力与技术实力

    Java集合框架:这部分问题关注ArrayList、LinkedList、HashMap、HashSet等集合类的特性和使用。例如,比较ArrayList和LinkedList的优缺点;解释HashMap的工作原理和如何处理哈希冲突;讨论如何选择合适的集合类来...

    java8集合源码分析-AboutJava:java相关知识(理论,代码)相关知识均是看书,博客等地方获取再由自己整理,如存在侵权,请告诉我

    集合源码分析 AboutJava ==java 相关知识(理论,代码)相关知识均是看书,博客等地方获取再由自己整理,如存在侵权,请告诉我== Java基础 (缺少代码) IO 缺少图片 BIO NIO JAVA8 异常 --- 容器 基本容器 集合 Map ...

    java面试手册及各类java书籍

    性能优化篇:分析Java应用的性能瓶颈,提供优化策略和最佳实践,帮助读者提升应用的性能。 面试题解析篇:精选大量Java面试题,并给出详细的解析和答案,帮助读者更好地应对面试挑战。 特色亮点: 权威性与实用性:...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    讲一下java中的集合.mp4 │ Java面试题10.ArrayList LinkedList.mp4 │ Java面试题11.HashMap和HashTable的区别.mp4 │ Java面试题12.实现一个拷贝文件的类使用字节流还是字符串.mp4 │ Java面试题13.线程的实现方式...

    java8集合源码分析-LearningNotes:Java笔记

    源码分析:ArrayList、Vector、LinkedList、HashMap、ConcurrentHashMap、HashSet、LinkedHashSet and LinkedHashMap 线程状态、线程机制、线程通信、J.U.C 组件、JMM、线程安全、锁优化 磁盘操作、字节操作、字符...

    Java列表对象的性能分析和测试

    Java列表对象的性能分析和测试软件测试SDK提供了有序集合接口java.util.List的几种实现,其中三种最为人们熟知的是Vector、ArrayList和LinkedList。有关这些List类的性能差别是一个经常被问及的问题。在这篇文章中,...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第20节Java虚拟机-高性能Java虚拟机00:02:58分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第22节Java内存区域-简介00:07:56分钟 | 第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第24节Java内存区域-程序...

    java8集合源码分析-geektime-java-week-training-camp:极客时间-Java每周训练营

    集合源码分析 geektime-java-week-training-camp 极客时间-Java每周训练营 Fork From 感谢 kimmking 老师的分享 训练营目录 第一周:JVM 进阶 - Java开发者大厂面试必知必会 JVM 基础知识、Java 字节码技术、JVM 类...

    2023java最新学习路线.docx

    2. 性能优化:学习分析和调优Java应用程序的性能,了解内存管理、垃圾回收、性能监测和调优工具。 3. 反射和字节码操作:学习使用Java的反射机制和字节码操作库,实现动态代理、代码生成和运行时修改类的功能。 4....

    Java优化编程(第2版)

    展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析了影响Java应用程序性能的根本原因。本书不是教你怎样使用...

    java并发编程从入门到精通

    《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java面试题及技巧4

    │ │ │ Java程序员认证模拟题及详细分析.doc │ │ │ question.rar │ │ │ test4.doc │ │ │ 模拟题.rar │ │ │ 经典的104-147模拟题.rar │ │ │ │ │ ├─035 │ │ │ 2003.10.5.15.51.43.TestKing%...

    java开源包4

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics