文章目录
数组
1. 为什么要使用数组
在开发中,可能会遇到需要处理相同数据类型数据,数据量极大的情况。如果按照CV大法进行变量定义操作,会导致以下问题:
1. 代码冗余!!!超出方法建议行数80行
2. 变量名命名压力极大!!!
3. 对于当前数据进行操作处理,没有统一形式,并且操作繁琐。
2. 生活中对于数组的使用情况
超市:
归纳总结!!!
同一个货架上存放的是相同的商品。
图书馆:
T ==> 社科类书籍
<<高频电子线路>> T
图书馆中有10本
同一个书架上
当前书籍会有一个唯一编号
T-100
十本书每一本都有自己的索引
T-100-01 ~ T-100-10
总结:
1. 相同图书存储位置连续
2. 占用空间是同一个空间
3. 具有一个对外的统一名称 T-100
4. 具有每一个数据的独立编号 T-100-01 ~ T-100-10
3. Java中定义数组的格式 【重点】
格式:
数据类型[] 数组名 = new 数据类型[容量];
解释:
赋值号左侧
数据类型:
明确告知编译器,当前数组能够存储的数据类型是哪一个,并且限制有且只能是当前数据类型。【数据类型一致化】
[]:
1. 告知编译器,这里定义的是一个数组类型
2. 数组名是一个【引用数据类型】变量,引用数据类型具有明确的指向性!
数组名:
1. 操作数组非常重要的名字,当前数组数据对外的整体名字
2. 数组名是一个【引用数据类型】变量
左侧:
告知当前定义的数组名是什么,存储的数据类型有且只能是哪一个类型
赋值号右侧
new:
1. 在内存的【堆区】按照要求申请对应的内存数据空间。
2. new关键字会清空整个申请空间的所有数据。
数据类型:
前后呼应,明确告知当前存储的数据类型是哪一个。【数据类型一致化要求】
[容量]:
capacity 当前数组能够存储的最大数据容量。一旦确定无法修改。
容量范围在int范以内。
4. 数组定义和使用【重点】
使用数组,必须要使用数组中的下标操作。
下标:
0 ~ 数组容量 - 1、
例如:
int[] arr = new int[10];
有效下标 0 ~ 9
如果使用下标为负数或者大于9都是【非法下标】
数组使用中,负数一定是非法下标!!!通常会使用-1来作为一定的错误标记和异常情况提示。
/*
基本的数组演示
*/
class Demo2 {
public static void main(String[] args) {
/*
数据类型[] 数组名 = new 数据类型[容量];
*/
int[] arr = new int[10];
/*
1. 定义的数组存储数据为int类型
2. 数组名 arr,同时也是引用数据类型变量
3. 数组的容量为10,不可变!!!容量和【有效元素个数】不冲突。
*/
// 赋值数组中指定下标的元素
// 这里分别对于数组中下标为0,以及下标为5的位置进行赋值操作
arr[0] = 10;
arr[5] = 20;
/*
数组名[要求为int类型数据] -1是符合语法要求,为int类型,编译
不会有任何的错误提示。
当前程序运行时,发现 -1 不合法,提示报错【运行时错误】
*/
// arr[-1] = 20;
/*
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Demo2.main(Demo2.java:27)
ArrayIndexOutOfBoundsException 数组下标越界异常,当前数组下标为-1,超出有效范围
*/
arr[10] = 10;
/*
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Demo2.main(Demo2.java:34)
ArrayIndexOutOfBoundsException 数组下标越界异常
【规矩】
ArrayIndexOutOfBoundsException 如果想要我帮你解决问题,一次50红包发QQ群
一定要学会推演代码的运行过程。
NullPointerException 同上!!!
*/
// 可以进行取值操作
System.out.println(arr[0]);
System.out.println(arr[5]);
}
}
5. 数组内存分析图【重点,难点】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPSz7bym-1614346468515)(img/01-数组内存分析图.png)]
6. 数组和for循环
数组:
int[] arr = new int[10];
获取当前数组的容量属性:
arr.length => 10
. 的
for循环
for (int i = 0; i < arr.length; i++) {
// 循环体
}
class Demo3 {
public static void main(String[] args) {
// 定义一个int类型数组,数组名 arr,容量为10
int[] arr = new int[10];
/*
使用for循环对数组进行赋值操作
i 从 0 开始,到 arr.length - 1 结束。循环范围刚刚好
是整个数组的有效下标范围。
*/
for (int i = 0; i < arr.length; i++) {
// i 我们可以看做是一个下标
arr[i] = i * 2;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BobI2epT-1614346468518)(img/02-循环赋值数组中的元素内容.png)]
7. 数组常用功能事项
7.1 找出数组中指定元素的下标位置
假设:
数组 int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
查询目标元素 15 下标 7
查询目标元素 3下标 1
查询目标元素 25 下标 -1
/*
7.1 找出数组中指定元素的下标位置
假设:
数组 int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
查询目标元素 15 下标 7
查询目标元素 3 下标 1
查询目标元素 25 下标 -1
*/
class Demo4 {
public static void main(String[] args) {
// 目标数组
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
// 目标查询的数据
int find = 125;
/*
利用循环找出数组中指定元素的下标位置
查询数据的预期:
当前数据不存在。
这里需要一个变量来保存目标数据的下标位置,可以预设为 -1
*/
int index = -1;
// 遍历整个数组
for (int i = 0; i < arr.length; i++) {
// 判断目标数据是否对应数组中下标为 i 的元素内容
if (find == arr[i]) {
index = i;
/*
循环没有继续执行的必要性,可以结束当前循环执行
break可以用于跳出循环结构,有且只能跳出一层结构
*/
break;
}
}
// 判断 index 数据变化
if (index > -1) {
System.out.println("找到目标数据下标位置 : " + index);
} else {
System.out.println("没有对应数据");
}
}
}
/*
【方法封装实现】
7.1 找出数组中指定元素的下标位置
假设:
数组 int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
查询目标元素 15 下标 7
查询目标元素 3 下标 1
查询目标元素 25 下标 -1
*/
class Demo4 {
public static void main(String[] args) {
// 目标数组
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
// 目标查询的数据
int find = 11;
/*
调用了一个带有数组作为参数的方法
这里需要传入的实际参数就是数组名
*/
int index = indexOf(arr, find);
// 判断 index 数据变化
if (index > -1) {
System.out.println("找到目标数据下标位置 : " + index);
} else {
System.out.println("没有对应数据");
}
}
/*
方法分析:
public static:
固定格式,不要问
返回值类型:
int 类型返回当前查询目标数据的下标位置,返回值大于等于0表示找到目标数据,
返回值-1,没有找到
方法名:
indexOf
形式参数列表:
1. 需要查询数据的目标数组 int[] arr
2. 找谁,目标数据 int find
方法声明:
public static int indexOf(int[] arr, int find)
*/
/**
* 在指定数组中,找出指定元素所在的下标位置
*
* @param arr 查询数据的目标数组,为 int 类型
* @param find 需要查询的目标数据
* @return 返回值大于等于0,表示找到目标数据,否则没有找到
*/
public static int indexOf(int[] arr, int find) {
/*
利用循环找出数组中指定元素的下标位置
查询数据的预期:
当前数据不存在。
这里需要一个变量来保存目标数据的下标位置,可以预设为 -1
*/
int index = -1;
// 遍历整个数组
for (int i = 0; i < arr.length; i++) {
// 判断目标数据是否对应数组中下标为 i 的元素内容
if (find == arr[i]) {
index = i;
/*
循环没有继续执行的必要性,可以结束当前循环执行
break可以用于跳出循环结构,有且只能跳出一层结构
*/
break;
}
}
return index;
}
}
7.2 找出数组中最大值下标位置
假设:
数组 int[] arr = {1, 3, 5, 7, 19, 2, 4, 6, 8, 10};
最大值下标 4
/*
假设:
数组 int[] arr = {1, 3, 5, 7, 19, 2, 4, 6, 8, 10};
最大值下标 4
*/
class Demo5 {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 19, 2, 4, 6, 8, 110};
// 先找出一个参照物,假设数组中下标为0的元素为最大值。
int maxIndex = 0;
// 利用循环遍历整个数组,进行两两比较
for (int i = 1; i < arr.length; i++) {
// 利用if浦判断,如果发现maxIndex保存的元素小于当前i下标对应元素
if (arr[maxIndex] < arr[i]) {
maxIndex = i;
}
}
System.out.println(maxIndex);
}
}
7.3 找出数组中最小值下标位
假设:
数组 int[] arr = {1, 3, 5, 7, 19, 2, 4, 6, 8, 10};
最小值下标 0
7.4 替换数组中所有元素为1的内容,改为100
假设:
数组 int[] arr = {1, 2, 3, 4, 5, 1, 2, 3, 4, 6};
结果
{1, 2, 3, 4, 5, 1, 2, 3, 4, 6} ==> {100, 2, 3, 4, 5, 100, 2, 3, 4, 6}
/*
假设:
数组 int[] arr = {1, 2, 3, 4, 5, 1, 2, 3, 4, 6};
结果
{1, 2, 3, 4, 5, 1, 2, 3, 4, 6} ==> {100, 2, 3, 4, 5, 100, 2, 3, 4, 6}
增
删
改
查
排序
过滤
*/
class Demo6 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 1, 2, 3, 4, 6};
// target 目标
int target = 3;
replace(arr, target);
showIntArray(arr);
}
public static void replace(int[] arr, int target) {
// 遍历数组,找出数组中元素为 1 的内容。替换操作。
for (int i = 0; i < arr.length; i++) {
if (target == arr[i]) {
arr[i] = 100;
}
}
}
public static void showIntArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
7.5 展示数组中的所有奇数
假设:
数组 int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
结果
展示 1 3 5 7 9
arget) {
// 遍历数组,找出数组中元素为 1 的内容。替换操作。
for (int i = 0; i < arr.length; i++) {
if (target == arr[i]) {
arr[i] = 100;
}
}
}
public static void showIntArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}