文档章节

Java 集合类归纳总结

Linn_y
 Linn_y
发布于 2016/03/10 19:12
字数 3370
阅读 31
收藏 1

       

  该图为java集合框架的类图,其中实线边框为实现类,比如ArrayList、LinkedList、HashSet、TreeSet等。虚线边框的为抽象类,比如AbstractList、AbstractSet、AbstractMap等。点线边框的为接口,比如Iterator、Collection、Map等。

   从图中可以看到Java集合框架主要分割成两部分,集合(Collection)和映射(Map)。它们都实现了迭代器(Iterator)接口。

   图中Comparable与Comparator都是用于实现集合中元素比较、排序的接口。Collections与Arrays是操作集合或数组的工具类。

   下面对图中主要的接口或类进行总结归纳。以便在使用的时候能够选择合适的集合类。

1、Collection接口

      Collection接口是最基本的集合接口,它定义了有关集合操作的普遍方法。Collection接口派生出三个子接口List、Set、Quene。

1.1、List接口

       List接口继承于Collection接口。List最重要的特性是可以保证元素按照规定的顺序排列。List可以存放重复元素。List为Collection添加了大量的方法,以便我们可以在List中部插入和删除元素(当然只推荐LinkedList这样做,稍后会讲)。List的实现类有Vector、Stack、ArrayList、LinkedList。

  1.1.1、Vector

  Vector实现了一个动态数组。它提供了四种构造方法:

public Vector() //该方法系统会自动对向量进行管理
public Vector(int initialcapacity) //生成一个拥有初始容量的向量
public Vector(int initialCapacity, int capacityIncrement)//向量拥有初始容量,并指定了增量大小
public Vector(Collection<? extends E> c)//向量包含集合c中的元素,元素的顺序以迭代器返回的顺序
  1.1.2、ArrayList

  ArrayList也实现了一个可变大小的数组。它允许所有元素,包括null。由于ArrayList与Vector内部都是使用数组保存数据,因此获取数据或在集合容器末尾添加、删除元素效率会比较快。关于ArrayList与Vector的不同主要在于①Vector的方法都是同步的,是线程安全的,而ArrayList不是。由于线程的同步会影响性能,因此ArrayList会比Vector性能高。②当ArrayList与Vector空间不够,需要扩展的时候,Vector默认扩展一倍,而ArrayList扩展50%。

  ArrayList有三种构造方法:

public ArrayList() //返回一个空列表,长度为十
public ArrayList(Collection<? extends E> c) //返回一个列表,包含集合c中的元素,元素顺序以迭代器返回的顺序
public ArrayList(int initialCapacity) //生成一个具有初始容量的列表
  1.1.3、LinkedList

  LinkedList实现了双向链表的List,LinkedList也允许null元素链表的每个节点都包含一个指向前一个元素和一个指向后一个元素的指针。因此LinkedList在添加、删除元素的效率上会比ArrayList高。LinkedList提供了操作列表头和尾元素的方法。包括获取第一个和最后一个元素(getFirst()和getLast()),添加(addFirst()和addLast()),删除(removeFirst()和removeLast())。

  LinkedList有两种构造方法:  

public LinkedList() //返回一个空的链表
public LinkedList(Collection<? extends E> c) // 返回一个链表,包含集合c中的元素,元素的顺序以迭代器返回的顺序
  1.1.4、Stack

  Stack继承自Vector,实现一个后进先出的堆栈。Stack提供了5个额外的方法使得Vector得以被当做堆栈使用。下面列出构造方法及这五个方法。

public Stack() //返回一个空的堆栈
public empty() //测试堆栈是否为空
public peek() //查看堆栈顶部对象,但不从堆栈中移除
public pop() //移除堆栈顶部对象,并作为函数返回值返回
public push(E item) //把项压入堆栈顶部
public search(Object o) //返回对象在堆栈中的位置
1.2、Set接口

   set接口并未扩展Collection接口,它具有与Collection完全一样的接口。Set不允许存放重复元素,因此放入Set的元素必须定义equals()方法以确保对象的唯一性。Set接口不维护元素的顺序。Set接口的实现类包括HashSet、LinkedHashSet、TreeSet

  1.2.1、HashSet    

   HashSet是通过包装HashMap来实现,HashSet在添加一个值的时候,实际上是将值作为HashMap中的Key来进行保存。HashSet①不保证元素的排列顺序。②它不是同步的。③可以存放null,但只能存放一个。

   HashSet的add方法调用的是底层HashMap的put()方法,HashMap的put()方法,会首先判断key值是否存在,存在则修改value值,不存在插入key-value对。HashSet只使用了HashMap的key,所以不必修改value,只是在判断key是否存在后,执行插入或者不插入操作。HashSet判断元素是否存在的方式是通过判断hashCode值是否相同。

   HashSet有四个构造器:

public HashSet() //构建一个空的集合,其包装的HashMap具有默认的初始容量16和负载因子0.75。负载因子是HashMap中存储的数据量/HashMap的总容量,当达到该值时,总容量自动扩展1倍。
public HashSet(Collection<? extends E> c) //构建一个新的集合,该集合包含集合c中的元素。
public HashSet(int initialCapacity) // 构建一个具有初始容量initialCapacity的集合。
public HashSet(int initialCapacity, float loadFactor) // 构建一个具有初始容量initialCapacity和负载因子loadFactor的集合。
  1.2.2、LinkedHashSet

   LinkedHashSet集合是HashSet的子类,它同样是根据元素的hashCode值决定元素的存储位置,但它同时使用链表维护元素的次序。这样就使得集合中的元素是以插入顺序保存,当遍历此集合时,会以元素的添加顺序访问。

   LinkedHashSet在遍历Set中全部元素时,性能比HashSet好,但是因为要以链表维护元素次序,所有插入时性能会逊色于HashSet。

   LinkedHashSet构造器与HashSet类似:

public LinkedHashSet() //构建一个空的集合,默认容量16,负载因子0.75
public LinkedHashSet(Collection<? extends E> c) //构建一个新的集合,该集合包含集合c中的元素。
public LinkedHashSet(int initialCapacity) // 构建一个具有初始容量initialCapacity的集合。
public LinkedHashSet(int initialCapacity, float loadFactor) // 构建一个具有初始容量initialCapacity和负载因子loadFactor的集合。
  1.2.3、TreeSet

   TreeSet是SortedSet的唯一实现类。TreeSet是通过包装TreeMap来实现的,而TreeMap的实现是红黑树结构,也就是一棵自平衡的排序二叉树。因此TreeSet可以保证集合元素处于排序状态。

   TreeSet是非同步的,因此不能在多线程间共享。运行速度会比HashSet慢。

   TreeSet支持两种排序方式,自然排序和自定义排序。自然排序是默认排序方式。①自然排序:基于二叉树的集合保证元素唯一性或排序顺序是根据其元素的compareTo方法的返回值确定,obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。②自定义排序要继承Comparator接口,实现int compare(T o1,To2)方法。

   TreeSet提供四种构造方法:

public TreeSet() //构建一个空的树集,其中元素根据自然排序进行排序
public TreeSet(Collection<? extends E> c) //构建一个新的树集,该集合包含集合c中的元素,元素根据自然排序进行排序
public TreeSet(Comparator<? super E> comparator) //构建一个空的树集,其中的元素按指定比较器进行排序
public TreeSet(SortedSet<E> s) //构建一个包含相同元素的树集,并使用相同的排序集合

2、Map接口

  Map是一种维护键对象和值对象之间映射关系的集合。一个映射不能包含重复的键,且每个键最多只能映射到一个值。Map提供keySet()方法获得key的集合,提供values()方法获得value的集合。entrySet()方法则可以获得映射关系的集合。

  它有几个比较重要的实现类:HashMap、Hashtable、LinkedHashMap、TreeMap。

  2.1、HashMap   

   HashMap是基于哈希表的Map接口的非同步实现。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步能力。HashMap允许null值和null键,但是它不维护元素顺序。因为基于哈希表实现,HashMap的查找,插入,删除操作的算法复杂度为O(n)。

   HashMap提供四种构造方法:

public HashMap() //构建一个空的HashMap,默认容量16,负载因子0.75
public HashMap(int initialCapacity) //构建一个空的HashMap,初始容量为initialCapacity,负载因子为0.75
public HashMap(int initialCapacity, float loadFactor) //构建一个空的HashMap,初始容量为initialCapacity,负载因子为loadFactor。
public HashMap(Map<? extends K,? extends V> m) //构建一个新的HashMap,其与m具有相同的映射。
  2.2、Hashtable

   Hashtable与HashMap的实现差不多。它们的主要差别有以下几点:

   (1) 虽然都实现了Map接口,但Hashtable类继承于Dictionary抽象类,而HashMap类继承于AbstractMap抽象类。

   (2) HashMap可以允许存在一个为null的值和任意个为null的value,但Hashtable中key与value值都不能为null。在HashMap中不能通过get()方法来判断HashMap中是否存在某个键,而要用containsKey()方法来判断。

   (3) HashTable的方法使同步的,而HashMap的方法使非同步的。但上文已经提到Collections的synchronizedMap方法使HashMap具有同步能力。

   (4) HashMap、HashTable都使用了Iterator。但是HashTable还使用了Enumeration方式。

  (5) 哈希值使用不同,Hashtable直接使用对象的hashCode。而HashMap重新计算hash值。

   (6) Hashtable和HashMap内部实现方式的数组的初始化大小和扩容的方式。Hashtable中hash数组的默认大小是11,增加方式是old*2+1。HashMap中hash数组的默认值大小是16,增加方式是old*2,而且容量是2的倍数。

   Hashtable提供了四种构造方法,与HashMap相似,只是默认容量为11。

public Hashtable() //构建一个空的HashMap,默认容量11,负载因子0.75
public Hashtable(int initialCapacity) //构建一个空的HashMap,初始容量为initialCapacity,负载因子为0.75
public Hashtable(int initialCapacity, float loadFactor) //构建一个空的HashMap,初始容量为initialCapacity,负载因子为loadFactor。
public Hashtable(Map<? extends K,? extends V> m) //构建一个新的HashMap,其与m具有相同的映射。
  2.3、LinkedHashMap

    LinkedHashMap继承自HashMap,它的底层使用哈希表与双向链表保存所有元素。因为拥有双向链表的实现,所以它保留了元素插入顺序,它的迭代顺序也是可以预知的。LinkedHashMap遍历时比HashMap慢,但他的插入、删除操作的算法复杂度都是O(n)级的。它通过重写HashMap的方法来实现链接列表的特性。LinkedHashMap允许使用null键和null值。    

   LinkedHashMap提供了五种构造方法:

public LinkedHashMap() //构建一个空的LinkedHashMap,初始容量为16,负载因子为0.75
public LinkedHashMap(int initialCapacity) //构建一个空的LinkedHashMap,初始容量为initialCapacity,负载因子为0.75
public LinkedHashMap(int initialCapacity, float loadFactor) //构建一个空的LinkedHashMap,初始容量为initialCapacity,负载因子为loadFactor
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) //构建一个空的LinkedHashMap,初始容量为initialCapacity,负载因子为loadFactor,并指定排序模式
public LinkedHashMap(Map<? extends K,? extends V> m) //构建一个新的HashMap,其与m具有相同的映射。

   LinkedHashMap 定义了排序模式accessOrder,该属性为boolean型变量,对于访问顺序,为true。对于插入顺序,则为false。构造方法不指定,默认为插入顺序。

  2.4、TreeMap

   TreeMap实现了SortedMap接口。上文TreeSet已经讲到,TreeMap实现了红黑树的数据结构。TreeMap的每个Entry都被当做红黑树的一个节点来对待。由于红黑树在插入节点和查找时都要通过某一规则遍历,所有效率比HashMap差一些。但它的优点在于可以保持元素的排列顺序。TreeMap的排序同样有两种,自然排序和自定义排序。

   TreeMap提供了四种构造方法:

public TreeMap() // 构建一个空的TreeMap,排序方式为自然排序
public TreeMap(Comparator<? super K> comparator) // 构建一个空的TreeMap,排序方式按照comparator
public TreeMap(Map<? extends K,? extends V> m) // 构建一个新的TreeMap,它包含映射m中的元素,排序方式为自然排序
public TreeMap(SortedMap<K,? extends V> m) // 构建一个新的TreeMap,它包含映射m中的元素,排序方式与m排序方式相同

3、Map.Entry

   最后来讲一下Map.Entry。Map中提供了一个方法entrySet(),该方法返回一个包含元素类型是Map.Entry的集合,它保存的是一个键-值对的组合。Map.Entry是Map声明的一个内部接口。此接口为泛型,定义为Entry<K,V>。它提供getKey(),getValue()方法获得键或值。

© 著作权归作者所有

共有 人打赏支持
Linn_y
粉丝 0
博文 5
码字总数 6671
作品 0
朝阳
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
sharding-jdbc分库分表规则(1)-单表查询

前言 当数据量到达一定数量级的时候,一般都会考虑分库分表。sharding-jdbc是一个开源的客户端分库分表基础类库,以一个jar包的形式提供,基于原生的JDBC驱动进行增强,基本能够无缝整合旧代...

xiaomin0322
06/07
0
0
Kotlin语言中的泛型设计哲学

Kotlin语言的泛型设计很有意思,但并不容易看懂。关于这个部分的官方文档,我反复看了好几次,终于弄明白Kotlin语言泛型设计的背后哲学。这篇文章将讲述Kotlin泛型设计的整个思考过程及其背后...

欧阳锋
04/16
0
0
java内存分配和String类型的深度解析

一、引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是...

萧十一郎君
2013/10/19
0
30
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kernel version does not match DSO version

错误信息: kernel version 384.11 does not match DSO version 384.130.0 原因是: cuda driver版本太低,不匹配DSO 简单有效的修复方法,升级nvidia driver, 步骤如下: 1. google seach ...

刘小米
今天
0
0
maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部