`

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集合类性能分析 #### 一、Java集合框架概览 Java集合框架是一个非常重要的概念,它提供了处理数据集合的标准方法。集合框架的核心部分主要包括集合接口、抽象类以及具体的实现类。 - **集合接口**:Java...

    java集合类类性能测试源代码

    这个“java集合类性能测试源代码”很可能是为了对比不同集合类在特定场景下的性能表现,帮助开发者选择最适合的集合实现。下面将详细解释Java集合框架中的主要类和它们的性能特性。 1. **ArrayList与LinkedList** ...

    Java源码分析:集合-容器.pdf

    Java集合框架是Java编程语言中非常重要的组成部分,它为Java开发者提供了大量用于存储数据的结构。Java集合框架主要包括两大类,单列集合和双...了解这些集合类的内部实现和特性对于开发高性能的Java应用程序至关重要。

    第16章:Java集合.zip_java 集合_java集合

    本章PDF课件详细讲解了这些概念,并可能包括实例代码演示、性能分析以及各种操作的注意事项,旨在帮助学习者深入理解并熟练运用Java集合框架。通过学习,开发者可以更高效地管理内存资源,优化程序性能,解决实际...

    Java集合概述与实例分析

    Java集合框架是Java编程语言中的一个核心特性,它提供了一种高效、灵活的方式来存储和操作对象数组。在Java中,集合被分为两个主要接口:Collection和Map。本篇将深入探讨Collection接口及其子接口,包括List和Set,...

    java并发集合

    Java提供了一系列的并发集合类,使得在并发环境中实现高效且线程安全的数据处理成为可能。这些集合主要存在于`java.util.concurrent`包中,设计目标是提高并发性能并减少同步开销。 首先,我们要了解Java并发集合的...

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

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

    java 集合 分析比较

    ### Java集合分析与比较 #### 一、Java集合体系概览 Java集合框架(Java Collection Framework)是Java标准库中的一个重要组成部分,它提供了一系列用于存储和操作数据的接口及实现类。通过合理选择不同的集合类型...

    java行转列的例子

    "java行转列"这个主题是数据处理中的一个常见需求,尤其是在数据分析、报表生成或数据显示时。当我们从数据库中获取数据,有时会遇到单个字段的数据需要在用户界面上以列的形式展示,这时就需要进行数据的行列转换。...

    Java编程中影响性能的细节

    6. **选择合适的包装类型和基本类型**:包装类型适用于需要对象的场景,如集合类。而在其他情况下,使用基本类型可以减少不必要的对象创建,提高性能。 7. **谨慎使用synchronized**:同步操作会带来性能开销,可能...

    Java集合框架常见面试题.pdf

    * 提高了程序的性能:Java 集合框架提供的集合类和遍历集合的方式,提高了程序的性能和响应速度。 Java 集合框架的应用 Java 集合框架的应用非常广泛,包括: * 数据存储:Java 集合框架可以用于存储和操作大规模...

    java知识集合

    性能监控工具可以帮助开发者监测JVM运行时的状态,分析性能瓶颈。 文件中还提及了Java架构师在学习Java时应当关注的高级主题,例如机器学习和数据库设计。机器学习是计算机科学中的一个分支,它让机器能通过经验...

    JAVA集合例子

    "JAVA集合例子"这个资源很可能是包含了一些关于Java集合使用的示例代码,帮助开发者更好地理解和运用这些集合类。集合框架主要由接口和实现类组成,如List、Set、Queue和Map等,它们为不同类型的数据组织提供了不同...

    Java 集合类面试题.docx

    以下是一些关于Java集合类的重要知识点: 1. **Collection与Collections的区别** - **Collection** 是所有单列集合的父接口,包括 List、Set 和 Queue。它定义了集合的基本操作,如增加元素、删除元素、遍历元素等...

    (zz)java集合类总结

    ### Java集合类总结 在Java开发中,集合类(Containers)是极其重要的组成部分,它们作为开发者日常编程不可或缺的工具,不仅让代码变得更加简洁、高效,还能显著提升程序的功能性和灵活性。本文将对Java标准类库中...

    关于Java软件的性能测试分析.zip

    3. **Java性能指标**:关键的Java性能指标包括CPU使用率、内存使用(堆和非堆内存)、线程状态、垃圾回收(GC)行为、JVM内存配置和类加载器活动等。 4. **性能测试工具**:Java性能测试常使用的工具有JMeter、...

    第一章 Java常用集合类总览1

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的抽象,使得开发者可以更加方便地管理和操作数据。本章我们将概览Java中最常用的集合类,特别是Collection接口及其子接口List,以及...

    《Java程序性能优化》(葛一鸣)PDF版本下载.txt

    - **合理使用集合类**:如ArrayList与LinkedList的选择,HashMap与ConcurrentHashMap的区别等。 - **减少对象创建**:避免不必要的对象实例化,可以采用对象池等方式复用对象。 - **弱引用与软引用**:利用JVM提供的...

    易语言仿java集合 list map源码

    3. 集合类的实现:分析List类和Map类的内部结构,理解它们如何存储和操作数据。 4. 面向接口编程:虽然易语言没有像Java那样的接口概念,但可以通过模拟接口的实现,提供类似的功能。 5. 键值对操作:了解如何在Map...

    java集合框架全面进阶

    5. **源码分析**:深入理解Java集合框架的源码,有助于优化代码性能。例如,了解HashMap的扩容机制、LinkedList的节点操作、ArrayList的动态数组管理等,能够帮助开发者在设计和实现自己的数据结构时避免常见陷阱。 ...

Global site tag (gtag.js) - Google Analytics