java实现ADT Heap
有关java中ADT的概念介绍
在本文中,我们将考察Java中的数据类型,但是我们将介绍抽象数据类型(ADT)的概念。我们还将通过介绍Java Collections Framework(Java 集合架构)来学习Java定义的一些ADT。
ADT
一个ADT是一个仅由保存的数据类型和可能在这个数据类型上进行的操作定义的。开发者们只能通过ADT的操作方法来访问ADT的属性,而且他们不会知道这个数据类型内部各种操作是如何实现的。
在Java中,我们常常使用一个接口来给出一个操作集合而不需要透露这些操作实现的细节。记住一个接口定义了一个方法集而Java类必须实现这个集合以便满足它的强制性条件或者实现这个接口的一个实例。
线性表,堆栈和队列
当我们谈论ADT的时候,经常会说到线性表,堆栈和队列。我们不会讨论这些数据结构的细节,但我们会讨论为什么它们被称为ADT。
一个线性表是有限个元素的集合,其元素以线性的方式进行排列并提供对它的元素的直接访问。一个堆栈是一个后进先出(LIFO)的有序线性表,元素从堆栈头加入,并从堆栈头取出。一个队列是一个先进先出的有序线性表,元素从队列尾加入,并从队列头取出。
线性表,堆栈和队列的内部结构可以用许多方式实现。例如,我们可以使用一个有序数组或者一个链表来实现每个结构。关键的一点是不论你如何实现其内部结构,它对外的接口总是不变的。这使得你能够修改或者升级底层的实现过程而不需要改变公共接口部分。
Java 集合架构
Java 2软件开发包(SDK)提供了一些新类来支持大多数常用的ADT。这些类被称为Java集合类(类似于MFC中的集合类),它们协同工作从而形成Java 集合架构。这个集合架构提供了一套将数据表示成所谓的集合抽象数据的接口和类。
java.util.Collection接口被用来表示任意的成组的对象,也就是元素。这个接口提供基本的诸如添加,删除,和查询这样的操作。Collection接口还提供了一个iterator方法。iterator方法返回java.util.Iterator接口的一个实例。而Iterator接口又提供了hasNext, ext, 和 remove方法。使用Iterator接口提供的方法,你可以从头到尾循环遍历一个Collection对象中的实例并能够安全的删除iterator(游标)所表示的元素。
java.util.AbstractCollection 是所有集合架构类的基础。AbstractCollection 类提供了对 java.util.Collection 接口中除iterator和size方法以外的所有方法的实现。这两个例外的方法由所有继承java.util.AbstractCollection的子类实现。
实现一个接口的类必须提供对所有接口方法的实现。因为集合架构中的一些接口方法是可选的,所以必须有一种方法来通知调用者某种方法没有实现。当一个可选的方法被实现而这个方法又并没有被实现的时候,就会抛出一个UnsupportedOperationException 异常。UnsupportedOperationException 类继承了RuntimeException 类。这使得调用者能够调用所有的集合操作而不需要把每次调用都放在一个try-catch对里。
List线性表
List接口继承了Collection接口并定义了一个允许相同元素存在的有序集合。List接口还附加了一些使用一个数值型索引值并基于元素在线性表中的位置来操作Collection中元素的方法。这些操作包括add,get,set和remove。
List接口还提供了listIterator方法。这个方法返回java.util.ListIterator 接口的一个实例,这个实例能够让你从头至尾或者从尾至头的遍历一个线性表。java.util.ListIterator 继承了java.util.Iterator 接口。因此,它支持对它代表的Collection中的元素的添加和修改。
下面的例子演示了如何从后向前遍历一个列表的元素。要完成这个工作,必须在遍历开始之前把ListIterator定位于列表最后一个元素之后。
ListIterator iter = aList.listIterator(aList.size());while (iter.hasPrevious())System.out.println(iter.previous().toString());}
集合架构提供了对List接口的两个实现:LinkedList(链表)和ArrayList(数组列表,即静态列表)。这两个实现都支持对其元素的随机访问。一个ArrayList实例支持数组风格的操作并支持数组大小的改变操作。一个LinkedList的实例则提供了在列表开始和结尾添加,删除和提供元素的显式的支持。使用这些新方法,一个程序员可以简单的把一个LinedList当做堆栈或者队列使用,如下:
LinkedList aQueue = new LinkedList(aCollection);aQueue.addFirst(newElement);Object anElement = aQueue.removeLast();LinkedList aStack = new LinkedList(aCollection);aStack.addFirst(newElement);Object anElement= aStack.removeFirst();
表A中的代码片段使用java.util.ArrayList 和 java.util.LinkedList演示了对java.util.List接口的实现实例的一些常用的操作。这些操作包括添加元素,随机访问元素和显式的在列表尾删除元素。
知其然不知其所以然是大有好处的
ADT提供了一个将对象公共接口中的操作和其具体的实现分开的强有力的工具。这使得一个ADT的实现可以不断变化和演化同时保持其公共接口不变。Java集合架构提供了大量的接口和其实现用来代表基本元素的集合并可以用来创建有用的ADT。
参考链接:
优先队列ADT_PrioQueue
堆ADT_Heap
java算法:堆栈ADT及实例
基本数据结构ADT及其实现
PriorityQueue的用法和底层实现原理
优先序列(可以实现堆排序)
.有关java中ADT的概念介绍
java实现ADT Heap相关推荐
- 认识Java Core和Heap Dump
什么是Java Core和Heap Dump Java程序运行时,有时会产生Java Core及Heap Dump文件,它一般发生于Java程序遇到致命问题的情况下. 发生致命问题后,Java进程有时 ...
- Java堆空间(Heap Space)
Java 堆空间(Heap Space) 概述 在Java程序中,堆是JVM内存空间中最大的一块,同时我们知道,每个线程都拥有一个虚拟机栈,但是堆不同,Java堆是被所有线程共享的一块内存区域,在虚拟 ...
- [Java]使用jConsole导出java程序的heap dump文件
[Java]使用jConsole导出Java程序heap dump文件 Heap dump文件存储着在该文件生成时,Java程序的所有未被回收的Objects的信息.通过使用MAT工具,可以揪出内存泄 ...
- Java 堆空间(Heap Space)
Java 堆空间(Heap Space) 概述 在Java程序中,堆是JVM内存空间中最大的一块,同时我们知道,每个线程都拥有一个虚拟机栈,但是堆不同,Java堆是被所有线程共享的一块内存区域,在虚拟 ...
- Java虚拟机的Heap监狱
作者:刘欣 来源:码农翻身 在Java虚拟机中,我是一个位高权重的大管家,他们都很怕我,尤其是那些Java 对象,我把他们圈到一个叫做Heap的"监狱"里,严格管理,生杀大权尽在掌 ...
- Java堆内存Heap与非堆内存Non-Heap简介和设置
Java 开发对JVM(Java虚拟机)的了解很有必要,网上看到,收集整理转载一下,方便日后的懒人计划 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一 ...
- Java堆内存Heap与非堆内存Non-Heap
堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建 ...
- Java 堆(Heap)内存简单图
首先了解下JVM结构图:CSDN 和 Java程序的运行流程CSDN JDK8堆内存(Heap)结构 JDK7堆内存(Heap)结构
- 创建和分析 Java 堆转储(Heap Dumps)
作为 Java 开发人员,我们熟悉我们的应用程序抛出 OutOfMemoryErrors 或我们的服务器监控工具抛出警报并抱怨 JVM 内存利用率高. 要调查内存问题,通常首先要查看 JVM 堆内存. ...
最新文章
- 热电偶校验仪使用说明_热电偶冷端补偿方法
- error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug...
- 大学必须掌握的计算机技巧,大学生必须掌握的电脑办公技巧
- OGEngine基于java支持跨平台的手游开发开源引擎
- (网页)parseFloat在工作中遇到的错误
- 从ASP.NET Core2.2到3.0你可能会遇到这些问题
- 前端框架--React props与React state
- 做风控的你,GPS数据有没有这样用?
- php 数据 缓存,php终极数据缓存,比redis、GlobalData等快200倍以上,极致性能
- 专家系统代码实现_前端代码是怎样智能生成的 - 语义化篇
- Ruby设计模式透析之 —— 单例(Singleton)
- ubuntu 安装多个CUDA版本并可以随时切换
- JAVA项目实战开发电商项目案例(九)收货地址模块开发
- 【LTspice仿真软件】如何从官网下载软件和入门到精通的教程
- [转]remote object /data/media/clockworkmod/backup/ does not exist
- 【CF633H】Fibonacci-ish II(权值线段树)(莫队)
- The JAVA_HOME environment variable is not defined correctly 解决方法
- 彩色图像增强opencv
- leetcode-94
- 1.23山师训练赛补题