数组【重点】
1. 数组
1.1 生活中的数组
超市
生活中非常常见的归纳总结数据的过程。
图书馆
图书分类
社科类 T
图书会根据书架位置有一个独立编码
一本书可能出现多本
<<NIO与Socket编程技术指南>> 10本
T-1-20-01 ~ T-1-20-10
1. 可以统一管理
2. 又可以做到独立操作。
总结:
1. 该图书会在图书馆中占据一个连续的存储空间
2. 该图书有一个统一的名称<<NIO与Socket编程技术指南>> ==> T-1-20
3. 每一本图书都有一个独立编号T-1-20-01 ~ T-1-20-10
1.2 代码中对于数组的期望
实际开发场景中,一定会出现大量相同数据的使用情况。如果按照单一变量数据方式处理,会导致代码中出现以下问题;
1. 代码过程臃肿
2. 代码阅读性极差
3. 代码操作性,维护性极差
可以模仿图书馆管理图书的方式来处理数据操作过程:
1. 连续存储
2. 统一名称
3. 独立编号
1.3 Java中定义数组的格式【重点】
数据类型[] 数组名 = new 数据类型[容量];
赋值号左侧:
数据类型:
明确告知编译器,当前数组可以保存支持的数据类型到底是哪一个,并且有且只能
是哪一个。保证【数据类型一致化】
[]:
1. 明确告知编译器,这里定义的是一个数组类型
2. 告知编译器,当前数组名是一个【引用数据类型】的变量
数组名:
1. 是当前数组的操作使用的,重要名称
2. 数组名是一个【引用数据类型】变量
赋值号右侧:
new:
new关键字在内存中申请内存【堆区】数据空间,并且将申请的内存空间全部擦除干
净。
堆区:相当于一个生活中的仓库,new关键字用于申请仓库中的空间。当前申请的仓
库空间需要清理干净
数据类型:
前后呼应,要求和赋值号左侧完全一致,明确告知编译器,当前能够使用的数据类
型到底是哪一个。保证【数据类型一致化】
[容量]:
当前数组可以保存指定数据类型的容量个数,容量一旦确定无法更改~~~
1.4 Java中定义数组演示
class Demo2 {
public static void main(String[] args) {
int[] arr = new int[10];
}
}
1.5 数组使用和下标问题
1. 数组操作是依赖于数组名进行
数组名是代表整个数组
2. 数组操作需要使用下标,下标范围是0 ~ 数组容量 - 1
int[] arr = new int[10];
有效下标范围:
0 ~ 9
【原则】下标没有负数,负数可以用于操作非法情况
如果操作过程中下标位置超出范围
ArrayIndexOutOfBoundException 数组下标越界异常
数组操作【重点】
1. 数组分析
1.1 数组内存分析
1.1.1 生活案例引入
洗浴中心
引用数据类型 ==> 洗浴中心的名片
洗浴中心的名片有该洗浴中心的地址
开着凯迪拉克 XT4 根据地址导航到目的地
寻址 ==> 寻找当前地址
我在门口等着你,给你一个小惊喜(手牌)
手牌有对应柜子的编号,可以存放物品
柜子就是数组的数据空间,手牌是数组中的下标位置
1.1.2 数组内存分析图【重点】
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/722ac6f1e94035f2df413a7890b25e2f.png)
1.2 数组转移问题
class Demo1 {
public static void main(String[] args) {
int[] arr1 = new int[10];
int[] arr2 = new int[10];
arr1[0] = 10;
arr2[5] = 200;
System.out.println(arr1[0]);
System.out.println(arr2[5]);
arr1 = arr2;
arr1[5] = 500;
arr2[0] = 100;
System.out.println(arr1[0]);
System.out.println(arr2[5]);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/30801aa945093e696d490bc6f6b158ea.png)
2. 数组操作
2.1 数组和for循环不得不说的故事
数组属性:
数组名.length 获取当前数组的容量/长度
for循环格式
for (循环条件初始化; 循环条件判断; 循环条件变更) {
// 循环体
}
例如:
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
}
class Demo2 {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
}
}
2.2 数组作为方法参数的封装
模版:
public static void main(String[] args) {
}
格式:
public static 返回值类型 方法名(数据类型[] 参数数组名) {
}
class Demo3 {
public static void main(String[] args) {
int[] arr = new int[10];
assignIntArray(arr);
printIntArray(arr);
}
public static void assignIntArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] = 2 * i;
}
}
public static void printIntArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
}
}
2.3 逆序数组中的数据
数组原型:
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
==>
{10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
public static void reverse(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
}
2.4 找出数组中最大值下标位置
数组原型:
int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 1};
max index = 4
class Demo5 {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 19, 2, 4, 16, 28, 1};
int maxIndex = findMaxIndex(arr);
System.out.println("maxIndex : " + maxIndex);
}
public static int findMaxIndex(int[] arr) {
int maxIndex = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[maxIndex] < arr[i]) {
maxIndex = i;
}
}
return maxIndex;
}
}
2.5 找出数组中最小值下标位置
数组原型:
int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 1};
max index = 0
class Demo5 {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 19, 2, 4, 16, 28, 1};
int minIndex = findMinIndex(arr);
System.out.println("minIndex : " + minIndex);
}
public static int findMinIndex(int[] arr) {
int minIndex = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i;
}
}
return minIndex;
}
}
2.6 找出指定元素在数组中的下标位置
数组原型:
int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10}
找出元素 5 对应下标为 2
找出元素 10 对应下标为 9
找出元素 20 对应下标为 -1 表示没有找到
class Demo6 {
public static void main(String[] args) {
int num = 9;
int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
int index = indexOf(arr, num);
if (-1 == index) {
System.out.println("指定数据未找到");
} else {
System.out.println("目标元素所在下标位置 : " + index);
}
}
public static int indexOf(int[] arr, int num) {
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (num == arr[i]) {
index = i;
break;
}
}
return index;
}
}
2.7 在指定数组中的指定下标位置插入元素【难点】
存在一个数组,数组中的元素为
int[] array = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
要求
1. 0是无效元素,仅占位使用
2. 当前数组中【有效元素】个数为 9
需求
在该数组中的指定下标位置放入指定元素
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/912b82d62eb1a2475c91813a86ddd2ab.png)
class Demo7 {
public static void main(String[] args) {
int index = 5;
int insert = 20;
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
boolean result = add(arr, index, insert);
if (result) {
printIntArray(arr);
}
}
public static boolean add(int[] arr, int index, int insert) {
if (index < 0 || index > arr.length - 1) {
System.out.println("Illegal Index 非法下标!");
return false;
}
for (int i = arr.length - 1; i > index; i--) {
arr[i] = arr[i - 1];
}
arr[index] = insert;
return true;
}
public static void printIntArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
}
}
2.8 删除数组中的指定下标的元素【难点】
存在一个数组,数组中的元素为
int[] array = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
要求:
1. 0是无效元素,仅占位使用
需求:
在当前数组中删除指定下标的元素
例如:
指定下标5
结果 {1, 3, 5, 7, 9, 13, 15, 17, 19, 0}
0占位!!!
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/19e32c85efb8d9c07e12f807edd0f5a4.png)
class Demo8 {
public static void main(String[] args) {
int index = 1;
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
boolean ret = remove(arr, index);
if (ret) {
printIntArray(arr);
}
}
public static boolean remove(int[] arr, int index) {
if (index < 0 || index > arr.length - 1) {
System.out.println("ArrayIndexOutOfBoundsException 数组下标越界");
return false;
}
for (int i = index; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
arr[arr.length - 1] = 0;
return true;
}
public static void printIntArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.prin2tln("arr[" + i + "] = " + arr[i]);
}
}
}
2.9 找出指定元素在指定数组中所有下标位置 【难点】
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aa9103d034ae1ae8b822f5735d9da95e.png)
2.10 排序算法推演
int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
第一题:
找出数组中最大值,和下标为0的元素交换位置
{10, 3, 5, 7, 9, 2, 4, 6, 8, 1}
第二题:
找出数组中剩余数据最大值(当前数组中下标为0的元素是最大值),和下标为1的元素交换位置
{10, 9, 5, 7, 3, 2, 4, 6, 8, 1}
第三题:
找出数组中剩余数据最大值(当前数组中下标为0, 1的元素是最大值),和下标为2的元素交换位置
{10, 9, 8, 7, 3, 2, 4, 6, 5, 1}
核心思路
1. 找
2. 换
3.二维数组
二维数组可以看做数组的数组:二维数组就是一个特殊的以为数组,其每一个元素都是一维数组
int array[][] = new int[2][3];
这个二维数组array可以看做一个二行三列的数组
int a[][] = {{1,2}, {2,3}}
public class Test {
public static void main(String[] args) {
int a[][] = {{1,2}, {2,3}};
for (int i = 0; i < a.length; i++) {
for (int j = 0; j <a[i].length ; j++) {
System.out.println(a[i][j]);
}
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f188425dd82e59446e35aeb21ce09d82.png)