2.方式二
- 格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
- 举例:
定义存储1,2,3,4,5,6整数的数组容器。
int[] arr = new int[]{1,2,3,4,5,6};
3.方式三
- 格式:
数据类型[] 数组名 = {元素1,元素2,元素3…};
- 举例:
定义存储1,2,3,4,5,6整数的数组容器。
int[] arr = {1,2,3,4,5,6};
说明:
上面定义数组并初始化的时候,都是使用int[] arr这种形式,Java数组还支持int arr[] 这种形式的定义。
2.2 数组的基本操作
数组是存储一类元素的,有了数组就方便进行元素统一管理,下面介绍一下数组的基本操作。
2.2.1 数组相关概念说明
-
索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
-
格式:
数组名[索引]
- 数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:
数组名.length
,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1
。
2.2.2 数组基本操作
数组创建后,涉及到数组的对应位置元素的初始化、元素的修改、元素的获取。
public static void main(String[] args) {
// 定义一个定长数组
int[] array = new int[3];
// 1、元素赋值
array[0]=1;
array[1]=2;
array[2]=3;
// 2、元素修改
array[0]=11;
// 3、元素获取
int a=array[0];
// 打印数组,Arrays先了解即可
System.out.println(Arrays.toString(array));
}
**注意:**因为数组长度固定,因此数组本身无法添加或者移除元素,但是我们可以在原数组的基础上复制一份数组来改变其长度和元素。
2.2.3 数组初始化值介绍
在前面章节学习java变量的时候介绍过,定义的变量如果没有初始化赋值是不能使用的,否则编译报错。而今天学习的数组,内部可以存放各种数据类型,如果没有初始化赋值是否会报错呢?
public static void main(String[] args) {
// 定义一个定长数组
int[] array = new int[3];
System.out.println(array[0]); // 0
}
上面示例结果没有报错,且输出结果为0,测试发现没有初始化赋值的int类型数组每一个位置都有个默认值0。
所以,这里要强调的是数组作为一个引用数据类型,内部可以存放各种类型元素,如果没有进行初始化赋值,都会有一个默认初始化值。
2.3 数组原理分析
2.3.1 内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
2.3.2 Java虚拟机的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
内存区域说明:
| 区域名称 | 作用 | 说明 |
| — | — | — |
| 程序计数器(寄存器) | 是一块较小的内存区域,可以看做是当前线程执行的字节码的行号指示器 | 给CPU使用,和我们开发无关 |
| 虚拟机栈 | 虚拟机栈描述的是Java方法执行的内存模型 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
| 堆 | 该区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存 | 是Java虚拟机所管理的内存中最大的一块,被进程的所有线程共享,在虚拟机启动时被创建 |
| 方法区 | 存放的是被虚拟机加载的class类信息,常量,静态变量,即时编译器编译后的代码等数据 | 方法区也是线程共享的 |
| 本地方法栈 | 与虚拟机栈类似,为虚拟机使用到的Native方法服务 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行 |
2.3.3 数组在内存中的存储
先定义一个普通数组:
public static void main(String[] args) {
// 定义一个定长数组
int[] array = new int[3];
System.out.println(array); // [I@15db9742
}
以上方法执行,输出的结果是[I@15db9742,这个是什么呢?是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址,是在本地方法栈中存储的。
第3章 二维数组介绍
==========
数组除了包括有简单的一维数组还有嵌套的多维数组(类比嵌套for循环),这里我们就对开发中另一个常用的二维数组为例进行多维数组的讲解。
3.1 二维数组的定义
二维数组,本质就是在一维数组的基础上,每一个元素又由一个新的数组组成。
1. 方式一
- 格式:
数据类型[][] 数组名字 = new 数据类型[长度][长度];
- 举例:
int[][] array = new int[2][3];
这种方式只是设定了数组的一维和二维的长度,并没有赋值。
2.方式二
- 格式:
数据类型[][] 数组名字 = new 数据类型[长度][];
- 举例:
int[][] array = new int[2][];
这种方式在定义的时候只规定了外层的一维数组个数,并未规定内部元素嵌套的二维数组的内容和长度。
3.方式三
- 格式:
数据类型[][] 数组名字 = new 数据类型[][]{{元素1},{元素2}…};
或者
数据类型[][] 数组名字 = {{元素1},{元素2}…};
- 举例:
int[][] array = new int[]
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
[]{{1,2},{3,4}};
int[][] array = {{1,2},{3,4}};
这种方式在定义的时候,直接对数组进行了初始化赋值。
3.2 二维数组的基本操作
二维数组同样,涉及到赋值、修改与获取。
public static void main(String[] args) {
// 定义一个指定容量的二维数组
int[][] array = new int[2][3];
// 1、赋值
array[0][0]=0;
array[0][1]=1;
array[0][2]=2;
array[1][0]=3;
array[1][1]=4;
// 2、修改
array[0][0]=110;
// 3、获取
int a=array[0][0];
// 打印数组
System.out.println(Arrays.deepToString(array));
}
第4章 数组冒泡排序
==========
-
**数组排序:**就是对原数组中杂乱无序的元素按照从小到大或者从大到小的顺序排序。
-
实现思路:
-
参考上述获取数组元素最大值的方式,使用嵌套循环,循环一次获取最大值放在首位或者末尾,依次循环类推。
**数组排序2种常见的方式:**冒泡排序、选择排序。
-
原理:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public static void main(String[] args) {
// 定义一个元素顺序杂乱的数组
int[] arr = { 4, 1, 3, 6, 2, 5};
// 外层循环表示比较轮数
for (int i = 1; i <= arr.length-1; i++) {
// 内层循环对比相邻两个数
for (int j = 0; j < arr.length-i; j++) {
// 定义一个临时变量
int tempMax=0;
// 进行元素位置交换
if(arr[j]>arr[j+1]) {
tempMax=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tempMax;
}
}
}