Java中8种常见的数据结构

数组、链表、堆、栈、队列、树、哈希、图

一、数组

1.简述

              数组是一种基本线性结构的数据结构,可以存储基本类型数据或对象,连续的存储空间和

              数组的元素是可以重复的。数组只是存储元素的容器,它不对元素的值做任何限制

              一旦创建,其大小就是固定的,不能动态地增加或减少元素。

2.例子

        2.1基本类型

        2.1.1 定义了一个数组

                int[ ]   arr =  new int[ ];

        2.1.2  通过索引给数组中的每个元素赋值

                arr[0] = 1;         arr[1] = 2;         arr[2] = 3;         arr[3] = 4;         arr[4] = 5;

        2.1.3 通过索引来访问或修改数组中的元素

                 // 访问第一个元素,结果是1        int firstElement = arr[0];      

        // 访问第二个元素,结果是2        int thirdElement = arr[2];

        // 修改数组中的元素 arr[0] = 20; 

        // 将第二个元素修改为10 arr[1] = 10; 

    2.1.在Java中,数组的大小是固定的,不能直接删除元素。但是你可以通过创建一个新的数

        组,然后将原数组中除了第一个元素之外的其他元素复制到新数组中,从而实现删除第一个

        元素的效果。

                // 创建一个新的数组,其长度比原数组小1 int[] newArr = new int[arr.length - 1];

                // 将原数组中除了第一个元素之外的其他元素复制到新数组中

                 System.arraycopy(arr, 1, newArr, 0, newArr.length);

                // 更新arr,使其指向新数组 arr = newArr;

            2.2对象类型

             2.2.1// 创建一个可以存储3个Person对象的数组   

                        Person[] persons = new Person[3];

             2.2.2// 在数组的第三个位置分别存储一个Person对象

                        persons[0] = new Person("张三", 20);

                        persons[1] = new Person("李四", 25);

                        persons[2] = new Person("王五", 30); 

             2.2.3// 访问数组中的第一个元素 Person firstPerson = persons[0]; 

                     // 修改数组中的元素 persons[1] = new Person("赵六", 28); 

二、链表(单链表,双链表,循环链表,双向循环链表):

 1.简述

                链式的线性表,采用链式存储(非连续、非顺序的内存空间),

                链表中的每一个独立的元素被称为结点,故链表由一系列的结点组成。

                每个结点都由两部分组成数据域、指针域

                数据域用来存放当前结点需要存储的数据内容,

                指针域用于存放当前结点的下一个结点的地址。如下图所示:

     生活举例熟悉概念:假如我们需要存放一堆物品,但没有足够大的空间将所有的物品一次性放

                下,此时该如何既放下所有的物品,又能简单的找到所有的物品位置呢?我们可以尝试

                采用如下解决方案:存放物品时,每放置一件物品就在该物品上贴一个小纸条,标明下

                一件物品放在哪里。这样,我们只需要记住第一件物品的位置,从第一件物品上的小纸

                条,就可以找到第二件物品,再根据第二件物品纸条的内容就找到第三件物品。按照这

                个方法依次类推,我们便可以找到所有的物品,这就是所谓的链式存储。

2.例子

        2.1String类型

        2.1.1  定义了一个数组

               LinkedList<String> linkedList = new LinkedList<>();

        2.1.2  // 在链表头部添加元素 linkedList.addFirst("元素0");

                  //添加元素linkedList.add("元素1");

                  // 在链表尾部添加元素 linkedList.addLast("元素4");

         2.1.3// 移除链表头部元素 linkedList.removeFirst();

                // 移除链表尾部元素 linkedList.removeLast();

                //删除第五个元素 linkedList.remove(4);

         2.1.4 使用set(int index, E element)方法来修改链表中的某个元素,

              其中index是元素在链表中的位置(从0开始计数),element是新的元素。

               // 修改链表中第一个元素 linkedList.set(0,"修改元素");

          2.5// 获取链表中第一个元素 Person firstPerson = linkedList.get(0);

            2.2对象类型

             2.2.1 LinkedList<Person> linkedList = new LinkedList<>();

             2.2.2 // 创建Person对象 Person person1 = new Person("张三", 20);

                                                    Person person2 = new Person("李四", 25);

             2.2.3 // 在链表首部添加元素 linkedList.addFirst(person1);

                      // 在链表尾部添加元素 linkedList.addLast(person2);

             2.2.4// 创建Person对象 Person person3 = new Person("王五", 30);

                      // 修改链表中第一个元素 linkedList.set(0, person3);

        

熟悉概念:

1.线性结构:

在Java中,线性结构是一种数据结构,它的元素之间存在一对一的线性关系。

线性结构有两种不同的存储方式:顺序存储和链式存储。

顺序存储的线性表称为顺序表,顺序表中的元素在内存中是连续存储的,例如数组。

链式存储的线性表称为链表,链表中的元素在内存中可以是非连续存储的,

元素节点中存放数据元素以及指向下一个节点的指针。

线性结构有以下几个特点:

  1. 存在唯一的一个被称作“第一个”的元素。
  2. 存在唯一的一个被称作“最后一个”的元素。
  3. 除第一个元素外,其他数据元素均有一个前驱。
  4. 除最后一个元素外,其他数据元素均有一个后继。

在Java中,常见的线性结构包括数组、链表、栈、队列等。

2.内存地址:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
因为小弟权限不够,所以分开两个帖子上存,资源名称分别是: Java数据结构和算法文第二版(1) Java数据结构和算法文第二版(2) 【内容简介】 本书可帮助读者: 通过由基于JAVA的演示所组成的可视专题讨论来掌握数据结构和算法 学会如何为常见和不太常见的编程条件选择正确的算法 利用数据结构和算法为现实世界的处理过程建模 了解不同的数据结构的优势和弱点,考虑如何利用它们改进编程的效率 学会如何用面向对象的编程简化数据结构和算法 本书以一易懂的方式教授如何安排和操纵数据的问题,其不乏一些难题;了解这些知识以期使计算机的应用获得最好的表现。 不管使用何语言或平台,掌握了数据结构和算法将改进程序的质量和性能。 书提供了一套独创的可视讨论专题用以阐明主要的论题;它使用JAVA语言说明重要的概念,而避免了C/C++语言的复杂性,以便集精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二版,他利用Java语言最新特性,修改并扩充了他的例子。在每一章后都有问题和练习,使读者有机会测试自己的理解程序。 【原 书 名】 Data Structures & Algorithms in Java 【原出版社】 SAMS 【作  者】[美]Robert Lafore [同作者作品] [作译者介绍] 【译  者】 计晓云[同译者作品] 赵研 曾希 狄小菡 【丛 书 名】 国外经典计算机科学教材 【出 版 社】 国电力出版社  【书 号】 7508319117 【出版日期】 2004年2月 【开 本】 16开 【页 码】 560 【版 次】2-1 本书以一易懂的方式教授如何安排和操纵数据的问题,其不乏一些难题;了解这些知识以期使计算机的应用获得最好的表现。不管使用何语言或平台,掌握了数据结构和算法将改进程序的质量和性能。 书提供了一套独创的可视讨论专题用以阐明主要的论题;它使用Java语言说明重要的概念,而避免C/C++语言的复杂性,以便集精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二版,他利用Java语言最新特性,修改并扩充了他的例子。在每一章后都有问题和练习,使读者有机会测试自己的理解程序。 出版说明 献词 简介 第1章 综述 数据结构和算法能起到什么作用? 数据结构的概述 算法的概述 一些定义 面向对象编程 软件工程 对于C++程序员的Java Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验 编程作业 第3章 简单排序 如何排序? 冒泡排序 选择排序 插入排序 对象排序 几简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验 编程作业 第6章 递归 三角数字 阶乘 变位字 递归的二分查找 汉诺(Hanoi)塔问题 归并排序 清除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树 为什么使用二叉树? 树的术语 一个类比 二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红-黑树 本章讨论的方法 平衡树和非平衡树 使用RBTree专题applet 用专题applet做试验 旋转 插入一个新节点 删除 红-黑树的效率 红-黑树的实现 其他平衡树 小结 问题 实验 第10章 2-3-4树和外部存储 2-3-4树的介绍 Tree234专题applet 2-3-4树的Java代码 2-3-4树和红-黑树 2-3-4树的效率 2-3树 外部存储 小结 问题 实验 编程作业 第11章 哈希表 哈希化简介 开放地址法 链地址法 哈希函数 哈希化的效率 哈希化和外部存储 小结 问题 实验 编程作业 第12章 堆 堆的介绍 Heap专题applet 堆的Java代码 基于树的堆 堆排序 小结 问题 实验 编程作业 第13章 图 图简介 搜索 最小生成树 有向图的拓扑排序 有向图的连通性 小结 问题 实验 编程作业 第14章 带权图 带权图的最小生成树 最短路径问题 每一对顶点之间的最短路径问题 效率 难题 小结 问题 实验 编程作业 第15章 应用场合 通过数据结构 专用数据结构 排序 图 外部存储 前进 附录A 运行专题applet和示例程序 专题applet 示例程序 Sun Microsystem软件开发工具集 重名的类文件 其他开发系统 附录B 进一步学习 数据结构和算法 面向对象程序语言 面向对象设计(OOD)和软件工程 附录C 问题答案 第1章,综述 第2章,数组 第3章,简单排序 第4章,栈与队列 第5章,链表 第6章,递归 第7章,高级排序 第8章,二叉树 第9章,红-黑树 第10章,2-3-4树和外部存储 第11章,哈希表 第12章,堆 第13章,图 第14章,带权图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值