打怪升级之小白的大数据之旅(五)
Java基础语法之数组的基本概念
目录
上次回顾
上一期我们讲完了Java的流程控制:分支和循环,本次,将为大家带来数组的分享,数组这里,我分为四块,第一部分是数组的基础知识点,第二部分是数组的基础算法,第三部分是数组的算法升华,也就是常见的数组排序,算法这块,我大力推荐牛客网的左神,他讲的算法是真的好,第四部分是二维数组,因为是学大数据,未来数据的结构大多数的多维的,因此,二维数组一定要理解清楚!!
数组概述
数组的概念与数组的组成
- 数组的概念
- 数组(arry),就是多个相同类型的数据,按照一定顺序排列的集合,并使用一个名字命名,然后用编号区分这些数据
- 数组就是一个数据容器
- 数组的组成:
- 数组名
- 下标(或脚标、索引)(index)
- 元素(element)
- 数组的长度(length)
- 按照我的理解,数组就是这个样子的:
- 上图解释:
- 这个公寓可以理解为一个数组,它在计算机创建后,计算机就给它分配了一片土地让它盖公寓(连续的内存空间), 因此,这个Java数组网红公寓就是一个内存地址(本身存储的十六进制,Java内部会进行一个转换)
- 当这个公寓创建好了之后,因为它是连续的,因此,我们根据房间号就可以直接找到该房间,这个房间号在Java中称之为下标/脚标,用于标记数组中元素的位置
- 那么元素是什么?元素就是住客,比如上面,张三,李四王五和我都住进去了,如果没有人住进去,就会有默认值,这个默认值等下后面会讲到
- 数组的长度就是我这个公寓有多少的房间,因为当我公寓盖好之后,再想加一个房间是不可能的,除非重新盖一个公寓,当然那就不是0XAB网红公寓了,因为计算机土地(内存)很宝贵
- 另外有一个重点: 我想住进这个房间,必须在还有房间的情况下,提前预定并告诉房东,不然就没房子住了,这个就是
数组在使用之前需要先进行声明并初始化
数组的特点
- 数组的长度一旦确定就不能修改(重要),这个我上面提到过原因
- 存储的元素为相同的数据类型,可以是基本数据类型或引用数据类型
- 有索引,创建数组时会在内存中开辟一整块连续的空间。
- 存取元素的速度快,因为可以通过[下标],直接定位到任意一个元素
数组的声明与初始化
数组的声明
- 声明一个数据类型的变量
- 数组声明的格式
//推荐 元素的数据类型[] 数组的名称; int[] age; //不推荐 元素的数据类型 数组名[]; int age[];
不推荐使用int age[]; 这种写法~就当我没提过这种写法
数组的初始化
数组的初始化方式
- 静态初始化
- 定义数组的同时为数组分配内存空间,并赋值。程序员只给定数组元素的初始值,不指定数组长度,由系统决定数组的长度
- 格式:
1). 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};数据类型[] 数组名;
2). 数组名 = new 数据类型[]{元素1,元素2,元素3...}; - 简化方式
数据类型[] 数组名 = {元素1,元素2,元素3...}; - 示例代码:
注意啦:简写方式必须在一个语句中完成,不能分开两个语句写//定义存储1,2,3,4,5整数的数组容器。 int[] arr = new int[]{1,2,3,4,5};//正确 int[] arr; arr = new int[]{1,2,3,4,5};//正确 int[] arr = new int[5]{1,2,3,4,5};//错误的,后面有{}指定元素列表,就不需要在[长度]指定长度。 //简化方式: int[] arr = {1,2,3,4,5};//正确 int[] arr; arr = {1,2,3,4,5};
- 动态初始化
-
程序员只给定数组的长度,后期再给给元素赋值(实际系统会先给出元素的默认值)
-
格式:
1. 数据类型[] 数组名字 = new 数据类型[长度];
2. 数据类型[] 数据名字
数组名字 = new 数据类型[长度] -
示例代码:
//定义可以存储5个整数的数组容器,代码如下: int[] arr = new int[5]; int[] arr; arr = new int[5];
动态初始化比较灵活一些,当我们存储数据时,可以提前开辟大一点的空间,防止数组的溢出(数组中元素个数超过数组的长度)
-
数组元素的访问
索引
-
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
-
索引范围:[0, 数组的长度-1]
-
格式:
数组名[索引] -
访问数组元素
-
数组名[索引],表示指定索引位置的元素
- 数组名[索引]=值,表示为数组中指定索引位置的元素赋值
- 示例代码:
public static void main(String[] args) { //定义存储int类型数组,赋值元素1,2,3,4,5 int[] arr = {1,2,3,4,5}; //为0索引元素赋值为6 arr[0] = 6; //获取数组0索引上的元素 int i = arr[0]; System.out.println(i); //直接输出数组0索引元素 System.out.println(arr[0]); }
数组索引位置默认是从0开始
-
数组的遍历与元素的默认值
数组的遍历
-
就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石
-
数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1。
-
示例代码:
public static void main(String[] args) { int[] arr = {11, 22, 33, 44, 55}; //打印输出数组的长度 System.out.println("数组长度:"+arr.length);//5 //数组遍历(正序): System.out.println("数组遍历:"); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } //数组遍历(逆序): System.out.println("数组逆序遍历:"); for (int i = arr.length-1; i >=0 ; i--) { System.out.println(arr[i]); } }
如果存储的元素超过范围就会造成数组的溢出,所以我们在存储数据的时候,注意这个问题
数组的默认值
- 开篇我提到了默认值这里,之下详细介绍一下
- 当我们使用动态初始化创建数组时:
-
数据类型[] 数组名字 = new 数据类型[长度];
-
此时只确定了数组的长度,那么数组的元素是什么值呢?请看下图
-
上图就是数组的默认值详细介绍,除了数值型数据几乎都是标记为0和布尔的默认false外,所有引用类型在数组中的默认值都是null
数组内存图
这个就是我前面提到的数据存储在内存中的过程,下面我来填一下前面提到的坑
计算机内存与java虚拟机内存划分
- 内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。
- 只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
- 内存这一块,我刚想到一个东东,我们要学习大数据,至少自己计算机的内存是16G的,如果内存不够的小伙伴,记得网购一个内存条,很简单,每个计算机都有提供独立内存的的位置,插~进去就好了
- Java虚拟机要运行程序,必须要对内存进行空间的分配和管理
- Java虚拟机的内存划分
-
图例详解:
区域名称
作用
程序计数器
程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址
本地方法栈
当程序中调用了native的本地方法时,本地方法执行期间的内存区域
方法区
存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
堆内存
存储对象(包括数组对象),new来创建的,都存储在堆内存。
虚拟机栈
用于存储正在执行的每个Java方法的局部变量表等。<br />局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放。
- 我们想知道数组的内存地址,直接打印数组,就可以看到它的"伪内存值"(并不是底层的存储值,中间经过了一个转换)
- 伪内存值这个称呼是我个人杜撰的哈
- 查看内存值的示例代码:
public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr);//[I@5f150435 }
-
数据在内存中的执行流程
首先看这张图::
举几个栗子:
- 两个数组存储的内存图
public static void main(String[] args) { int[] arr = new int[3]; int[] arr2 = new int[2]; System.out.println(arr); System.out.println(arr2); }
执行流程
- 两个变量指向同一个数组
public static void main(String[] args) { // 定义数组,存储3个元素 int[] arr = new int[3]; //数组索引进行赋值 arr[0] = 5; arr[1] = 6; arr[2] = 7; //输出3个索引上的元素值 System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); //定义数组变量arr2,将arr的地址赋值给arr2 int[] arr2 = arr; arr2[1] = 9; System.out.println(arr[1]); } }
执行流程
总结
本章对数据的基本概念进行的分享,然后填补了一下前面的坑--Java的内存的存储,现在大家已经会数组的基本使用了吧,下一期将会带来数组的进阶使用---数组的基本算法,有了这个,我们就可以完成一些简单的数组统计,排序的功能。好啦,今天内容就到这里,不足之处欢迎后台吐槽~