Java 集合框架(常用数据结构)

早在Java 2中之前,Java就提供了特设类。比如:向量(Vector)、栈(Stack)、字典(Dictionary)、哈希表(Hashtable)这些类(数据结构)用来存储和操作对象组。虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。除了集合,该框架(framework)也定义了几个Map接口和类。Map里存储的是键/值对。尽管Map不是collections,但是它们完全整合在集合中。

所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。接口允许集合独立操纵其代表的细节。在面向对象的语言,接口通常形成一个层次。
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构。
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

集合框架的类和接口均在java.util包中。

下图是简化的集合框架关系图:

集合接口

整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet等,除此之外你也可以通过这些接口实现自己的集合。具体接口及其概述如下:

名称 概述
Collection Collection 是最基本的集合接口,一个 Collection 代表一组 Object,Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。
List List接口是一个有序的Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的小标)来访问List中的元素,而且允许有相同的元素。
Set Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素
SortedSet 继承于Set保存有序的集合。
Map 将唯一的键映射到值。
Map.Entry 描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。
SortedMap 继承于Map,使Key保持在升序排列。
Enumeration 这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。

更多参见:在线文档-jdk-zh

集合实现类

集合类型 描述
ArrayList 一种可以动态增长和缩减的索引序列
LinkedList 一种可以在任何位置进行高效地插入和删除操作的有序序列
ArrayDeque 一种用循环数组实现的双端队列
HashSet 一种没有重复元素的无序集合
TreeSet 一种有序集
EnumSet 一种包含枚举类型值的集
LinkedHashSet 一种可以记住元素插入次序的集
PriorityQueue 一种允许高效删除最小元素的集合
HashMap 一种储存键/值关联的数据结构
TreeMap 一种键值有序排列的映射表
EnumMap 一种键值属于枚举类型的映射表
WeakHashMap 一种其值诶用武之地后可以被垃圾回收器回收的映射表
LinkedHashMap 一种可以记住键/值项添加次序的映射表
IdentityHashMap 一种用==,而不是用equals比较键值的映射表

另外还有一组名字以Abstract开头的类,例如,AbstractQueue,这些类是为类库实现者而设计的,用来实现自己的数据结构。

常用数据结构

  • 向量(Vector)

    Vector类实现了一个动态数组。和ArrayList和相似,但是Vector是同步访问的(同步操作会耗费大量时间,建议在不需要同步时使用ArrayList),而且Vector包含了许多传统的方法,这些方法不属于集合框架。Vector主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。需要注意的是向量中的数据被转化为Object对象,取出元素使用时要强制转化为原来的类型。

    Vector类支持4种构造方法:

    常用方法:

    方法 描述
    boolean add(E e) 将指定元素添加到此向量的末尾。
    void add(int index, E element) 在此向量的指定位置插入指定的元素。
    E remove(int index) 移除此向量中指定位置的元素。
    boolean remove(Object o) 移除此向量中指定元素的第一个匹配项,不包含则元素保持不变。
    E set(int index, E element) 用指定的元素替换此向量中指定位置处的元素。
    void setElementAt(E obj, int index) 将此向量指定 index 处的组件设置为指定的对象。
    E get(int index) 返回向量中指定位置的元素。
    int indexOf(Object o) 返回此向量中第一次出现的指定元素的索引,不包含则返回 -1。
    boolean isEmpty() 测试此向量是否不包含组件。
    void clear() 从此向量中移除所有元素。
    int capacity() 返回此向量的当前容量。
    boolean contains(Object o) 如果此向量包含指定的元素,则返回 true。
    void setSize(int newSize) 设置此向量的大小。
    void trimToSize() 对此向量的容量进行微调,使其等于向量的当前大小。

    Vector还定义了很多其他方法,具体可以看:Java Vector 类

  • 哈希表(Hashtable)

    Hashtable(确实是小写的t)是原始的java.util的一部分, 是一个Dictionary具体的实现 。然而,Java 2 重构的Hashtable实现了Map接口,因此,Hashtable现在集成到了集合框架中。它和HashMap类很相似,但是它支持同步(同样建议不需要同步时使用HashMap)。像HashMap一样,Hashtable在哈希表中存储键/值对。当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引。

    Hashtable定义了四个构造方法:

    如果散列表的装载因子是0.75,那么当散列表的容量被使用了75%时,就会自动将容量增加到原始容量的2倍。通常,默认加载因子(0.75)在时间和空间成本上寻求一种折中,装载因子过高虽然减少了空间开销,但同时也增加了查找某个条目的时间。

    常用方法:

    方法 描述
    V put(K key, V value) 将指定 key 映射到此哈希表中的指定 value。
    V remove(Object key) 从哈希表中移除该键及其相应的值。
    V get(Object key) 返回指定键所映射到的值,不包含则返回 null。
    void clear() 将此哈希表清空,使其不包含任何键。
    boolean containsValue(Object value) 如果此 Hashtable 将一个或多个键映射到此值,则返回 true。
    boolean isEmpty() 测试此哈希表是否没有键映射到值。
    int size() 返回此哈希表中的键的数量。
    void rehash() 增加此哈希表的容量并在内部对其进行重组,以便更有效地容纳和访问其元素。

    Hashtable中还定义了一些其他方法,具体可以看:Java HashTable 接口

  • 栈(Stack)

    栈是Vector的一个子类,它实现了一个标准的后进先出的栈。堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法,如下:

    方法 描述
    boolean empty() 测试堆栈是否为空。
    Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。
    Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对。
    Object push(Object element) 把项压入堆栈顶部。
    int search(Object element) 返回对象在堆栈中的位置,以 1 为基数。

    但是Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。

    注:Java 中 Queue 是接口, Deque 是其子接口,LinkedList 和 PriorityQueue 是其实现类,而 ArrayDeque 是 Deque 接口的实现类。具体方法可以查看:JDK 1.6 在线中文手册

  • 链表(LinkedList)

    LinkedList是一个双端链表,存放在结点中的数据都被看作是一个Object对象。由于任何类都是Object类的间接子类,因此,可以把任何一个对象作为链表结点中的数据。需要注意的是get()方法返回的类型是Object,要类型转换回原来的类型。
    构造方法:

    常用方法:

    方法 描述
    boolean add(E e) 将指定元素添加到此列表的结尾
    void add(int index, E element) 在此列表中指定的位置插入指定的元素。
    E remove(int index) 移除此列表中指定位置处的元素。
    E remove() 获取并移除此列表的头(第一个元素)。
    boolean remove(Object o) 移除首次出现的指定元素,不包含则不作更改。
    E set(int index, E element) 将此列表中指定位置的元素替换为指定的元素。
    E get(int index) 返回此列表中指定位置处的元素。效率低,并非随机访问。
    int indexOf(Object o) 返回此列表中首次出现的指定元素的索引,不存在则返回-1.
    boolean contains(Object o) 至少包含一个指定元素,则返回 true。
    int size() 返回此列表的元素数。
    void clear() 从此列表中移除所有元素。
    Object clone() 返回此 LinkedList 的浅表副本。(这些元素本身没有复制。)
    Object[] toArray() 此方法返回一个新数组,调用者可以随意修改。

    LinkedList也实现了Deque接口,List接口和Queue接口,存在方法支持其用作堆栈、队列或双端队列,这里不做展开,具体方法可以查看:JDK 1.6 在线中文手册

https://www.cnblogs.com/mingyueanyao/p/7260301.html

原文地址:https://www.cnblogs.com/feng9exe/p/9274525.html

时间: 2024-10-18 16:52:13

Java 集合框架(常用数据结构)的相关文章

一起学 Java集合框架、数据结构、泛型

一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类):是集合接口的具体实现.从本质上讲,它们是可重复使用的数据结构. 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序.这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现. 集合接口 序号 name 接口描述 1 Collection Col

JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据类型也是可以引用的 一.基本数据类型的对象包装类 左为基本数据类型,又为引用数据类型 byte Byte int Integer long Long boolean Booleab float Float double Double char Character 我们拿Integer来举例子 //整

【Java】Java集合框架源码和数据结构简要分析——List

前言 之前一直把集合框架分成Collection和Map来对待,主要是基于储存内容是单列和双列,实际上这样来区分不太正确,set实际上是双列的结构. 现在回顾集合框架,看到很多当初看不到的东西. 现在来看集合框架,一部分是List,一部分是Set和Map,Set和Map几乎就是一回事. 一.数据结构 不讲太深入的东西,实际上我也讲不了多深入. 数据结构,就是一堆数据的关系. 逻辑结构--数据逻辑上的关系,其实就是数据结构,而数据的逻辑结构几乎可以分成四种:线性结构.集合结构.树形结构和图结构.

异常处理、常用类、Java集合框架、反射

异常处理: 1.  异常:程序在执行过程中所产生的问题. 异常的三种类:①检查异常:又叫checdked异常或者受检异常.通常是用户错误或者不能被程序员所预见的问题.检查异常需要被解决之后才能通过编译. ②运行时异常:程序在运行过程中可能发生的.可以被程序员所避免的异常类型. ③错误:事实上错误不是异常,但却是用户和程序员无法控制的问题. 2.  异常的控制流程: 异常是被一个方法抛出的对象. (1) 处理异常的三个方法:①捕获这个异常,不让它沿着调用栈继续向下抛. ②捕获这个异常,并继续向下抛

处理异常、常用类、反射、类加载与垃圾回收、java集合框架

异常处理概述 检查异常:检查异常通常是用户错误或者不能被程序员所预见的问题.(cheched) 运行时异常:运行时异常是一个程序在运行过程中可能发生的.可以被程序员避免的异常类型.(Unchecked)RentimeExeption 错误:实际上,错误根本不是异常,但却是用户或程序员所无法控制的问题. 异常是程序在执行过程中所产生的问题.JVM发生了内存溢出等... 异常处理:method()方法有三种 1 捕获这个异常,不让他沿着调用栈继续向下抛出 2 捕获这个异常,并继续向下抛出 3 从而导

JAVA集合框架及其背后的数据结构

一:介绍:Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes .其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速.便捷的存储 store .检索retrieve .管理 manipulate ,即平时我们俗称的增删查改 CRUD .如:一副扑克牌(一组牌的集合).一个邮箱(一组邮件的集合).一个通讯录(一组姓名和电

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

我所理解Java集合框架的部分的使用(Collection和Map)

所谓集合,就是和数组类似--一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接口,长虚线表示抽象类,实线表示类,箭头表示实现接口或者继承)(在网络上找的图,不知道原作者,侵权请联系我删除)(总之,关系很复杂,所以不用记得这个图,只是用来吓吓人而已的). 下面贴上个人理解之精简版之Collection(集)和Map(地图?暂且这么理解吧),话说思维导图蛮好用,以下是两幅思维导图

【Java集合源码剖析】Java集合框架

Java集合工具包位于package java.util下.包含了一些常用的数据结构,如数组.链表(单/双向).树.栈.队列.哈希表等. Java集合框架大致可分为五部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的整体框架如下: 如图,Java集合类大致分为两大类:Collection和Map. Collection主要包括两部分:List和Set. List接口通常表示一个列表(数