数组
数组是一个变量,存储相同数据类型的一组数据
声明一个变量就是在内存空间划出一块合适的空间
声明一个数组就是在内存空间划出一串连续的空间
在内存池中开了一个空间,空间里的值是30,并且会有一个相应的内存地址
我们无法记住内存地址,但我们可以记住变量名,只要让变量名与这个内存地址有一个明显的指向关系
数组的内存地址也只有一个,所以数组的名字也只要记一个,不同的是在一个空间里还有若干的小的区域,区域数目又由数组长度决定
数组名和数组的内存地址是一一对应关系,所以通过数组名可以直接找到大的蓝色区域,但我们实际要找的是小的蓝色的区域,所以要加入指针或者索引或者下标,就可以找到
所以实际上数组就是一个变量,只不过内存分配机制和常规变量不一样,但数组声明的时候就会赋初始值(int类型的数组的初始值都是0),和变量不一样
构成数组的核心要素:数组类型,数组名,数组长度
数组创建的静态方法:
特征:1、长度固定(非弹性化,不能扩容,不能缩容)
2、静态创建数组都有初始值
3、静态创建的数组可以通过数组名中括号的下标在对其进行重新的赋值以及直接使用
例子:此时k=0,它就是把ilist的第三下标的值赋给了类型为int,名为k的变量
数组类型已经规定了数组类型后,里面就只能保存一种类型的数据
数组越界
数组没有这个下标,这是一个异常,超出它的长度
动态创建数组的方法:
此时数组的长度不是明文显示的,数组长度是由里面所提供的值的个数决定
两种方法的相同点是前面一样的,不同点首先数组长度的决定方式不同,然后是它会把大括号里的内容根据索引依次分配,不能本末倒置,例如ZS就只能在0下标,不能在1下标,其次就是动态创建的数组初始值是人为赋予的,当然动态创建的数组的值也能被重新赋值
如何使用数组
声明数组
声明数组:告诉计算机数据类型是什么
声明数组时不规定数组长度
分配空间
分配空间:告诉计算机分配几个连续的空间
中括号前后要有空格,但括号里可以不要
声明数组并分配空间
数组元素根据类型不同,有不同的初始值
数组赋值
赋值:向分配的格子里放数据
数组遍历的语法结构
如果数组名【下标】出现在等号的左侧,就意味着对于数组的某个下标内的值进行重新的赋予
如果数组名【下标】出现在等号的右侧,就意味着将数组内的值赋给了某个变量
数组与内存
在内存里划分了三个区域
栈内存:基本数据类型 堆内存:引用数据类型
此时k是在内存里由开了一个新的区域,但这个开的值是i复制给它的,是100
那此时就算对k进行运算,对i的值也不会有影响,还是100
总结1:
基本数据类型是值地址,它会将自己的值复制给其他区域,但其他区域的变化也不会影响本身
那么此时ss和str是共用了Hello,因为缓冲地址的存在,导致它们看起来是有两个区域,实际上是共用,那么对ss进行操作,会影响str变化
总结2:
引用数据类型是址地址
举例:
此时这两个数组是在共用一个内存地址
此时对slist重新赋值,而ilist的值的确发生了变化,就证明了
遍历方法1:
遍历方法2:
两种方法的区别:
for循环是建立在循环下标的体系上,foreach没有下标的体系
例题
首先要两个数组,并且这两个的下标要有绝对的统一性,名字的0下标对应成绩的0下标
首先创建两个数组,他们的数组长度都是7
通过循环依次收录信息
此时数据就可以收集起来了
最后遍历输出,不能用foreach,因为是两个数组同时遍历
此时提示语不好,但实际上这个代码还是保存在0下标,所以要进行修改,但不能在蓝色位置改1否则会浪费一个索引位,浪费0下标,但最后遍历的时候还是会用到,就会出现一个空位
==>
求数组极值
练习1:猜数游戏
有一个数列:8,4,2,1,23,344, 12
循环输出数列的值
求数列中所有数值的和
猜数游戏:从键盘中任意输入一个数据,判断数列中是
否包含此数
两个方法:1、冒泡排序 2、打擂台算法
此时设置第0下标就是最大的,然后开始循环
只要第1下标大于了第0下标,那它就变成了最大项,依次类推
此时这个i没从0开始,而是从1开始是因为没有必要和自己比较,它已经比不出什么结果了
不用设置break或continue,直接让它一直循环到结束
求最小值也是一样的,如果此时比较的值比自己拟定的最小值还要小,那就证明它更小
冒泡排序
如何实现数字升序排序
每次比较相邻两数
小的交换到前面
每轮结束后最大的数交换到最后
冒泡排序速记口诀(升序)
N个数字来排队
两两相比小靠前
外层循环 N-1
内层循环 N-1-i
举例:
冒泡排序的核心代码(升序)
外层循环从0开始,小于数组长度减1
此时说明前面的数比后面的数大,就让二者互换位置
这样就实现了换位
最后遍历输出
使用Arrays为数组排序
使用java.util.Arrays类
java.util包提供的工具类
Arrays类提供操作数组的方法,如:排序、查询
Arrays类的sort()方法:对数组进行升序排列
举例:
Arrays类
多维数组
理论上来说并没有多维数组,只有单维数组
三维及以上的数组很少使用
主要使用二维数组
从语法上Java支持多维数组
从内存分配原理的角度讲,只有一维数组
二维数组
<数据类型> [ ][ ] 数组名; 或者 <数据类型> 数组名 [ ][ ];
举例:
int [ ][ ] scores; //定义二维数组
scores=new int[5][50]; //分配内存空间
//或者
int [ ][ ] scores = new int[5][50];
定义二维数组时,要定义最大维数
二维数组与内存2-1
int[ ][ ] s =new int[3][5];
二维数组与内存2-2
int[ ][ ] scores=new int[3][5];
score[0][0]=90;
score[2][3]=70;
二维数组定义
定义并赋值
写法1
int[ ][ ] scores=new int[ ][ ]{ { 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 }};
写法2
int scores[ ][ ] = {{ 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 } };
数组常用操作
举例:
建立一个数组,数组长度15
添加
首先标识出具有空位的下标
然后找空
最后给结论
删除+查看
找空
根据结论做操作
打印结果