IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 何先振第8期:数组(Array) -> 正文阅读

[数据结构与算法]何先振第8期:数组(Array)

? ? 大家好,我叫何先振。这期给大家讲下数组。

数组的概述

?1.数组的定义:

? ??数组是由多个相同类型的变量按照一定的顺序排列的集合,并且统一命名为一个变量,并且通过编号进行管理这个集合中的变量。数组的组成:数组名、数组元素、数组下标、数组长度。

?2.数组的特点:

? ? (1)数组是有序的,通过编号(下标)进行管理。

? ? (2)数组本身是引用数据类型,而数组的元素却可以是任何数据类型。包括基本数据类型和引用数据类型。

? ? (3)创建数组会在内存中开辟一块连续的空间,这块连续的空间依次存放有序的元素,中间不会有其他的数据。

? ? (4)数组的长度一旦确定,就不可以被修改。

3.数组的分类:

? ? (1)按照维度分类:可以分为一维数组、二维数组、三维数组......

? ? (2)按照数组元素的类型分类:基本数据类型的数组、引用数据类型的数组。

一维数组的使用

1.一维数组的声明和初始化:

? ? 对比基本数据类型的声明和初始化,可以有两种方式:第一种是声明和初始化分开进行。第二种是声明和初始化同时进行。声明只做变量声明,初始化是为了确定变量的值。如图:

? ? 那么同样数组也有直接声明加初始化,在初始化的时候同时进行对数据元素赋值操作,我们称为静态初始化。下图我们看到数组的组成有变量名为nums。数组的元素(1、2、3、4)。数组的编号和长度暂时我们后面说。

? ? []括号前面的int和new 后面的int 确定了数组的类型必须存int类型的元素。保证数组只能存相同数据类型的元素。{}括号里面存的就是数组的元素成员。

? ? 在初始化时没有对数组元素进行赋值操作。声明和赋值是分开操作的,我们称为动态初始化。

? ? 这里我们可以看出,不管是动态初始化,还是静态初始化,都需要确定数组的长度,一旦初始化完成,数组的长度就确定了。

2.数组元素的调用:

? ?? 当我们用动态初始化后,没有对数组元素进行赋值。那么我们如何给数组元素进行赋值操作,这就需要用到数组的下标。我们可以通过下标进行赋值和访问数组中的元素。下标默认是从0开始。

? ? 我们定义的长度是5,如果给数组弄了6个值,那么运行时就会提示数组下标越界。ArrayIndex(数组下标)Out(外)OfBounds(边界)。

3.数组的长度和遍历:

? ??数组的长度可以通过数组的属性。.length获取。

? ? 数组可以通过下标进行访问,要想访问全部可以通过for循环进行遍历所有数组元素。

4.数组元素的默认初始化值:

? ? 当我们在动态初始化时,没有对数组进行赋值操作,数组会默认根据类型对元素进行默认初始化值。整型:byte、short、int、long的默认初始化值为0。

? ? 浮点型:float、double的默认初始化值为0.0。

? ? 字符型:char字符串的默认初始化值也为0,这个0是字符集的编码号。

? ? 布尔型:boolean布尔类型的初始化值为false,因为计算机二进制false表示0,true表示1。

? ? 引用类型的变量,默认初始值为null。

5.数组的内存结构说明:

? ? 现在我们来了解下内存结构的简单说明,方便下面讲数组是如何在内存解析的。内存中有很多个模块,其中有三块,一块是栈(Stack)、一块是堆(Heap),一块是方法区。其中栈是存放我们的局部变量,堆是存放new出来的对象、数组。方法区包含了常量池和静态域。

6.数组的内存解析:

? ? 当我们程序进入main方法时,在方法中的变量都叫局部变量。当我们在main方法中声明了一个数组,那么这个数组的变量名,就会保存在栈空间中。

? ? 然后用new关键字 new出来的数组对象会在堆区中开辟一块连续的空间,存放里面的数组元素。这个开辟出来的数组空间有个十六进制表示的地址值,这个地址值是记录这块堆空间在堆中的位置。

? ? 这个地址值会保存到栈的变量中,也就是说数组变量中存放的是堆中空间的地址值。通过变量能访问数组中的元素,是因为这是通过变量里面的地址值去找到对应堆空间中存放的数组元素的。

二维数组的使用

1.二维数组的定义:

? ? 对于二维数组的理解,我们可以看成是一维数组的元素也是一个一维数组。从数组底层上看,其实没有多维数组。

2.二维数组的初始化:

? ? 静态初始化:初始化的同时并且赋值。

? ? 动态初始化:初始化跟赋值的操作是分开的。初始化方式一:知道数组元素的数组长度。

? ? 初始化方式二:不知道数组元素的数组长度。

3.二维数组的调用:

? ??通过在[]括号中指定访问的下标访问和修改值。

? ? 子数组没有指定长度,直接访问会报错,需要先初始化,才能访问。

4.二维数组的长度和遍历:

? ? 长度:.length是拿到外层数组的元素长度,想访问哪个元素的数组长度就通过下标先获取哪个下标的 子数组,然后通过子数组的属性.length进行访问。

? ? 遍历:遍历二维数组,需要用嵌套循环,第一层遍历外部数组元素,第二层遍历数组元素中的子数组中的值。

5.二维数组的初始化默认值:

? ? ?int [] [] nums=new int [3][4];外层数组中的元素为nums[0]、nums[1]、....等。内层数组中的元素为nums[0][0]、nums[0][1]、....等。

? ? ?外层数据的初始化默认值为内层数组的地址值。因为二维数组其实是一维数组中的数组元素也是个一维数组,一维数组中的变量中存放的是地址值。所以访问外层元素时,如果已经初始化就是保存地址值。

? ? 访问内层数组,参考一维数组,是int类型的默认为0。

? ? 如果没有赋值,默认初始化值就是空,因为引用类型默认是null,数组是属于引用类型。

? ? 访问没有初始化的内层数组元素是会报空指针异常。

6.二维数组的内存解析:

? ? 二维数组在栈中保存的是地址值,这个地址值指向new 出来的长度为3的连续空间。

? ? 每个空间里面,存放了一个数组的地址值,这个数组的地址值指向了,堆中长度为4的连续空间。

? ? 里面的值都是int类型的,默认初始化值为0。

数组中涉及的算法

? ? 1.数组的反转:第一个跟最后一个交换,第二个跟倒数第二个交换。直到i=j为止。

? ? 2.二分法查找:对半的缩小搜索的范围查找,比线性查找效率要高,前提是要排序好。

? ? 3.数组元素的排序算法:(1)冒泡排序:冒牌排序就是数组中的元素每个数,都于相邻的数进行比较,找出最大值,然后把最大值交换位置,继续与相邻比较,直到求出这个数组的最大值。然后再拿第一个数又开始于相邻数比较,交换位置,再继续于相邻比较,找到第二个最大值。

? ? (2)十种排序方式对比图: 这个只需要了解,实际开发中,这些排序都会有对应的工具类中的方法给我们调用。但是冒泡排序需要掌握会写。因为他是最简单的排序实现。

数组的常用工具类

? ? 上小节我们说到过,那些排序我们不需要每个都要求掌握,因为实际开发中都会提供工具类,让我们调用。JDK就提供了工具类Arrays类。

? ? Java提供了Arrays的工具类,帮助我们对数组做一些操作。这个我们可以搜索jdk版本的api文档可以看到。

? ? Arrays工具类,里面定义了很多操作数组的方法,我们在api文档上可以看到。

? ? 1.我们常用的几个方法:boolean equals(int []a,int [] b)方法,判断两个数组是否相等,顺序不一样也不相等。

这是equals内部源码。

? ? String toString(int []a) 方法输出数组信息。

? ? void fill(int []a,int val) 将指定值填充到数组中,会将数组中的所有值全部替换,都变成指定的值。

? ? void sort(int []a) 对传进去的数组进行排序。

? ? 看源码底层用了QuickSort(快速)排序算法。

? ? int binarySearch(int []a,int key) 对排序后的数组进行二分法检索指定的值,这里我们要找3,返回的是这个数组的索引,如果没有找到会返回负数。

数组中常见的异常

1.数组角标越界异常,英文名ArraysIndexOutOfBoundsException

? ? 如果我们访问的数组没有这个下标,就会报这个错,并且会提示越界的索引。

? ? 如果索引比数组本身最小的索引小也不行,比如用负数。

2.空指针异常,英文名NullPointerException

? ? 空指针异常是因为内存中的值为空,如果你用空去调用方法或者属性都会报错。比如这里,如果定义的数组为空的话,用数组下标访问就会报null。

? ? 还有就是二维数组中,如果内部数组没有初始化长度,那么默认生成的也是null。

? ? 如果访问内部数组的元素也会报错。

? ? 以上就是我们的数组的介绍,学习更多Java知识请点击关注,下期我们开始讲Java的面向对象。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-18 11:25:30  更:2021-11-18 11:26:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:47:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码