Java中8种常见的数据结构_java数据结构-程序员宅基地

技术标签: java  数据结构  开发语言  

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

一、数组

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.内存地址:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ny_forever/article/details/135038602

智能推荐

安卓MediaPlayer切换DataSource_android mediadatasource-程序员宅基地

文章浏览阅读1.6k次。最近在重新学习MediaPlayer的使用,首先扫描出sd卡的所有MP3文件,然后点击item可以切换播放,调用 setDataSource切换数据源,刚开始的切换流程是mMediaPlayer.stop()mMediaPlayer.setDataSource(filePath)mMediaPlayer.prepareAsync()结果闪退,报IllegalStateExcepti..._android mediadatasource

mybatis 进行批量更新操作_mybatis 万能批量更新-程序员宅基地

文章浏览阅读1.7k次。 UPDATE gt_agent_day_corr_optstatus

【C++】习题函数部分-程序员宅基地

文章浏览阅读1k次。1.编写函数正整数的每个位上的数字逆序输出#include <iostream>using namespace std;void reverseDigit(int num){ int n=num,i=0; //判断num是几位数 while(n>0) { n=n/10; i++; } int a[100]; for(int j=0;j<i...

java 线程死锁例子_java多线程死锁简单实例-程序员宅基地

文章浏览阅读75次。TestDeadLock.java:package com.ctgu.testDeadLock;public class TestDeadLock {public static void main(String[] args) {User user = new User("大毛", "123", 22);User user2 = new User("二毛", "456", 44);new Thre..._java多线程死锁的例子

Lingo (Spring Remoting) : Passing client credentials to the server-程序员宅基地

文章浏览阅读103次。http://www.jroller.com/sjivan/entry/lingo_spring_remoting_passing_clientLingo (Spring Remoting) : Passing client credentials to the serverSpring Remoting allows you to export a service interface w..._clientcontextholder

Codova 创建项目,引用jar提示java.lang.VerifyError_codova aar-程序员宅基地

文章浏览阅读307次。背景说明:Android原生的开发包是直接通过gradle加载aar使用,由于客户需要模块的cordova插件,于是只能引用aar解压出来的jar包,通过cordova创建项目,指定Android平台,引入插件,然后编译安装(此时创建的项目可以通过AndroidStudio打开)Cordova创建的项目 在Android6.0上跑报如下错误,字面上看java编译器拒绝编译这个类Re..._codova aar

随便推点

查看docker容器的日志_docker logs查询倒数200行日志-程序员宅基地

文章浏览阅读1.1w次。命令行docker logs -f -t --since="2018-03-31" --tail=100 elastic_raman–since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。 -f : 表示查看实时日志 -t : 查看日志产生的日期 -tail=200 : 查看最后的200条日志。 sleepy_snyder 容器的名称,并不是镜像的名字注..._docker logs查询倒数200行日志

SpringBoot整合RabbitMQ 实现五种消息模型 详细教程_rabbspringbootitmq五种消息模型-程序员宅基地

文章浏览阅读8.1k次,点赞17次,收藏38次。今天说下了消息队列中间件,各种队列性能对比,RabbitMQ队列,交换机(Exchange)以及消息中间件的应用场景,然后带着大家一起实现RabbitMQ的五种消息模型。消息队列中间件消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和终一致性[架构] 使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,K..._rabbspringbootitmq五种消息模型

IDEA Intellij 安装CheckStyle,阿里技术专家深入讲解_checkstyle-idea 插件。 安装步骤-程序员宅基地

文章浏览阅读372次,点赞3次,收藏10次。光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性。_checkstyle-idea 插件。 安装步骤

Ruby 正则表达式(介绍+语法+模式+实例+....++强烈推荐!!)_ruby正则表达式语法大全-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏8次。Ruby 正则表达式1. 简介正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找字符串集合,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。2. 语法正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的模式,如下所示:/pattern//pattern/..._ruby正则表达式语法大全

【Vue+java+阿里云oss】服务端签名后文件直传及文件下载(私有bucket),详细步骤及前后端代码(一)_vue3怎么获得oss bucket文件-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏9次。阿里云OSS控制台:创建私有bucket,创建子账户,添加权限AliyunOSSFullAccess,设置跨域服务端代码:导入依赖,获取policy接口代码前端代码: vue+element UI报错排坑:跨域错误,400错误_vue3怎么获得oss bucket文件

linux网络编程--Circular Buffer(Ring Buffer) 环形缓冲区的设计与实现_环形缓冲区优化的posix实现-程序员宅基地

文章浏览阅读7.4k次,点赞2次,收藏14次。1. 应用场景 网络编程中有这样一种场景:需要应用程序代码一边从TCP/IP协议栈接收数据(reading data from socket),一边解析接收的数据。具体场景例如:用户点击Youtube或优酷网站上的视频内容,这时用户PC上的播放软件就是一边接收数据一边对数据进行解码并播放的。这样的场景的存在如下约束:1. 必须边接收数据,边对数据进行解析,不能等待到数据全部接收完_环形缓冲区优化的posix实现