1.数组介绍
目录: 数组介绍 数组的定义和静态初始化 数组的元素访问 数组遍历 数组动态初始化 数组内存图(第二阶段讲) 数组常见问题 数组常见操作 数组:数组指的是一种容器,可以用来存储同种数据类型的多个值 数组容器在存储数据的时候,需要结合隐式转换考虑. 例如: int类型的数组容器(byte short int) 例如: double类型的数组容器(byte short int long float double) 建议:容器的的类型,和存储的数据类型保持一致
2.数组的定义和静态初始化
数组的定义和静态初始化 数组的定义: 格式1: 数据类型[] 数组名 格式2:数据类型 数组名[] eg: int [] array eg: int array [] 数组的初始化: 1.静态初始化 2.动态初始化 数组的静态初始化: 初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器的过程 完整格式:数据类型[]数组名 = new 数组类型[]{元素1,元素2,元素3...} 简化格式:数据类型[]数组名 = {元素1,元素2,元素3...} eg : int[]array = new int[]{11,12,13}; (数组一旦创建完毕后,其长度就固定了,是3,不能发生变化1) int[]array = {11,12,13}; eg: double[]array = new int[]{11.1,22.2,33.3}; double[]array = {11.1,22.2,33.3};
public class Summary1 {
public static void main(String[] args) {
//需求1:定义数组存储5个学生的年龄
int[] arr1 = new int[]{11,12,13,14,15};
int[] arr2 ={11,12,13,14,15};
//需求2:定义数组存储3个学生的姓名
String[] arr3 = new String[]{"zhangsan","lisi","wangwu"};
String[] arr4 = {"zhangsan","lisi","wangwu"};
//需求3:定义数组存储4个学生的身高
double[] arr5 = {17.3,17.4,17.5};
double[] arr6 = {17.3,17.4,17.5};
System.out.println(arr6);//[D@75412c2f
//数组的地址值(表示数组在内存中的位置)
//扩展:
//解释一下地址值的特殊含义[D@75412c2f
//[:表示当前一个数组
//D : 表示当前数组里面的元素都是double类型的
//@ : 表示一个间隔符号(固定格式)
//75412c2f : 才是数组真正的地址.(十六进制)
//平时我们习惯性的把这个整体叫做数组的地址值.
}
}
数组的地址值(表示数组在内存中的位置) 扩展: 解释一下地址值的特殊含义[D@75412c2f [:表示当前一个数组 D : 表示当前数组里面的元素都是double类型的 @ : 表示一个间隔符号(固定格式) 75412c2f : 才是数组真正的地址.(十六进制) 平时我们习惯性的把这个整体叫做数组的地址值.
3.数组元素访问
数组元素访问 格式 : 数组名[索引]; 索引:也叫做下标,角标.(它也表示为数组容器里面每个小格子的编号)
public class Summary2 {
public static void main(String[] args) {
//利用索引对数组中的元素进行访问
//1.获取数组中的元素
// 格式 : 数据名[索引];
int[] arr = {1,2,3,4,5};
//获取数据中的第一个元素
//其实就是0索引上对应的元素
int number = arr[0];
System.out.println(number);//1
//获取数组中1索引上对应的数据,并打印出来
System.out.println(arr[1]);//2
//2.把数据存储到数组当中
// 格式 : 数组名[索引] = 具体数据/变量;
// 细节 : 一旦覆盖后,原来的数据就不存在了
arr[0] = 100;
System.out.println(arr[0]);//100
}
}
4.数组遍历
数组遍历(将数组中所有的内容取出来,取出来之后可以(打印 求和 判断 ...)) 注意: 遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印
public class Summary3 {
public static void main(String[] args) {
//1.定义数组
int[] arr = {1,2,3,4,5};
//获取数组里面所有的元素
//格式:数据名[索引]
/*System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);*/
//利用循环改进代码(如果数组很长,不可以一行行写)
//开始条件 : 0
//结束条件 : 数组长度 - 1(最大索引)
/*for (int i = 0; i < 5; i++) {
// i : 0 1 2 3 4
System.out.println(arr[i]);
}*/
//在java中,关于数组的一个长度属性,length
//调用方式: 数组名 : length
/*System.out.println(arr.length);*/
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//扩展
//自动的快速生成数组的遍历方式
//idea提供
//数组名.fori
}
}
相关练习1
//遍历数组并求和
public class Summary3Test1 {
public static void main(String[] args) {
//定义一个数组,存储1,2,3,4,5遍历数组得到每一个元素,求数组里面所有数据之和
//分析
//1.定义一个数组,并添加数据1,2,3,4,5
int[] arr = {1,2,3,4,5};
//求和变量
int sum = 0;
//2.遍历数组得到数组中的每一个数据,累加求和
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
//i 依次表示数组里面每一个索引
//arr[i] 依次表示数组里面每一个元素
sum = sum + arr[i];
}
System.out.println(sum);
}
}
相关练习2
//统计个数
public class Summary3Test2 {
public static void main(String[] args) {
//定义一个数组,1,2,3,4,5,6,7,8,9,10
//遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字
int[] arr = {1,2,3,4,5,6,7,8,9,10};
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 3 == 0){
count++;
}
}
System.out.println("数组中能被3整除的数字有" + count + "个");
}
}
相关练习3
//数据变化
public class Summary3Test3 {
public static void main(String[] args) {
/*定义一个数组,存储1,2,3,4,5,6,7,8,9,10
遍历数组得到每一个数据
要求:
1.如果是奇数,则将当前数字扩大两倍
2.如果是偶数,则将打钱数字变成二分之一
*/
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0){
arr[i] = arr[i] / 2;
}else{
arr[i] = arr[i] * 2;
}
//System.out.println(arr[i]);
}
//遍历数组
//一个循环只做一件事情.
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
5.数组的动态初始化
数组的动态初始化 int[] arr = {1,2,3,4,5}; 用静态解决 int[] arr = {???}; 用动态解决 动态初始化:初始化时只指定数组的长度,由系统为数组分配初始值 格式: 数据类型[] 数组名 = new 数据类型[数组长度]; eg : int[] arr = new int[3];
public class Summary4 {
public static void main(String[] args) {
/*需求:定义一个数组,用来存班级中50个学生姓名
姓名未知,等学生报到后,再进行添加
*/
//格式:
//数据类型[] 数组名 = new 数据类型{数组长度};
//在创建的时候,由我们自己指定数组的长度,由虚拟机给出默认的初始化值
String[] arr = new String[50];
//添加学生
arr[0] = "zhangsan";
arr[1] = "lisi";
//获取
System.out.println(arr[0]);//zhangsan
System.out.println(arr[1]);//lisi
System.out.println(arr[2]);//打印出来的默认化初始值为null
//数组默认初始化值的规律
//整数类型 : 默认初始化值0
//小数类型 : 默认初始化值0.0
//字符类型 : 默认初始化值'/u0000' 空格
//布尔类型 : 默认初始化值false
//引用数据类型 : 默认初始化值null
int[] arr2 = new int[3];
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
数组动态初始化和静态初始化的区别: 动态初始化 : 手动指定数组的 长度 ,由系统给出默认初始化值 (只明确元素的个数,不明确具体数值,推荐使用动态初始化) eg : 使用数组容器来存储键盘录入的五个整数 int[] arr = {?????}; int[] arr = new int[5]; 静态初始化 : 手动指定数组的 元素 ,系统会根据元素的个数,计算出数组的长度 (需求中已经明确了要操作的具体数值,直接静态初始化即可) eg : 将全班学生成绩存入数组中 11 22 33 int[] arr = {11,22,33}
6.数组常见问题
当访问了数组中不存在的索引,就会引发索引越界异常
public class Summary6 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {1,2,3,4,5};
//长度:5
//最小索引:0
//最大索引:4 (数组长度-1)
System.out.println(arr[10]);
//小结:
//索引越界异常
//原因:访问了不存在的索引
//避免:索引的范围
//最小索引:0
//最大索引:4 (数组长度-1)
}
}
7.数组常见操作:
1.求最值
2.求和
3.交换数据
4.打乱数据
//最值
public class Summary7 {
public static void main(String[] args) {
//需求:定义数组求最大值 33 5 22 44 55
//扩展问题:
//1.根据求最大值的思路,自己改写一下就最小值
//2.为什么max要记录为arr[0],不能为默认值0?
//不能写0
//max的初始化值一定要是数组中的值
//3.循环中开始条件一定是0吗?
//循环的开始条件如果为0,那么第一次循环的时候是自己跟自己比一下,对结果没有任何影响,但效率偏低
//为了提高效率,减少一次循环的次数,循环开始条件可以写1
//1.定义数组用来储存五个值
int[] arr = {33,5,22,44,55};
//2.定义一个max变量用来储存最大吃
//临时认为0索引的值是最大的
int max = arr[0];
//3.循环获得数组中的每一个元数
//拿每一个元素跟max进行比较
for (int i = 1; i < arr.length; i++) {
//i 索引 arr[i] 数组中的元素
if (arr[i] > max){
max = arr[i];
}
}
System.out.println(max);//55
}
}
相关练习4
//求和
import java.util.Random;
public class Summary7Test1 {
public static void main(String[] args) {
/*需求:生成10个1~100之间的随机数存入数组
1)求出所有数据之和
2)求出所有数据的平均值
3)统计有多少个数据比平均值小
*/
//分析:
//1.定义数组
int[] arr = new int[10];
//2.把随机数存入到数组中
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//每循环一次就会随机生成一个新的随机数
int number = r.nextInt(100)+1;
//把生成的随机数添加到数组当中
//数组名[索引] = 数据;
arr[i] = number;
}
//1)求所有数据之和
//定义求和变量
int sum = 0;
for (int i = 0; i < arr.length; i++) {
//循环得到每一个元素
//并把元素累加到sum当中
sum = sum + arr[i];
}
System.out.println(sum);
//2)求出所有数据的平均值
int avg = sum / 10;
System.out.println("所有的数据的平均值为"+ avg);
//3)统计有多少个数据比平均值小
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < avg){
count++;
}
}
System.out.println("统计有" + count + "个数据比平均值小");
//遍历数组,验证答案
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
相关练习5
//交换数组中的数据
public class Summary7Test2 {
public static void main(String[] args) {
/*需求:定义一个数组,存入1,2,3,4,5.交换收尾对应的索引元素
交换前 : 1,2,3,4,5
交换后 : 5,4,3,2,1
*/
//1.定义数组存储数据
int[] arr = {1,2,3,4,5};
//2.利用循环去交换数据
for (int i = 0,j = (arr.length - 1);i < j;i++,j--){
//交换变量i和变量j指向元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//当循环结束时,那么数组中的数据就实现了头尾交换
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
/*int[] arr = {1,2,3,4,5};
int temp1 = arr[0];
arr[0] = arr[4];
arr[4] = temp1;
int temp2 = arr[1];
arr[1] = arr[3];
arr[3] = temp2;
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
*/
}
}
相关练习6
public class Summary7Test3 {
public static void main(String[] args) {
//需求:定义两个变量,交换两个变量记录的值
int a = 10;
int b = 20;
/* //把变量b的值赋值给了a,那么a原来的值就覆盖了
a = b; //a = 20;b = 20
//把变量a的值赋值给了b
b = a; //a = 20;b = 20
System.out.println(a);
System.out.println(b);*/
//定义一个第三方变量
int temp = a;
a = b;
b = temp;
System.out.println(a);//20
System.out.println(b);//10
}
}
相关练习7
public class Summary7Test4 {
public static void main(String[] args) {
//需求:定义一个数组,将数组中0索引和最大索引的值进行交换
//1.定义一个数组
int[] arr = {1,2,3,4,5};
//2.将数组中0索引和最大索引的值进行交换
//也是可以利用第三方变量进行交换
int temp = arr[0];
arr[0] = arr[4];
arr[4] = temp;
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " "); //52341 空格隔开
}
}
}
相关练习8
//打乱数组中的数据
import java.util.Random;
public class Summary7Test5 {
public static void main(String[] args) {
//需求:定义一个数组,存入1-5,要求打乱数组中所有数据的顺序.
//难点:
//如何获取数组中的随机索引
/* int[] arr = {1,2,3,4,5};
//索引范围: 0 1 2 3 4
Random r = new Random();
int randomindex = r.nextInt(arr.length);
System.out.println(randomindex);*/
//1.定义数组1~5
int[] arr = {1,2,3,4,5};
//2.循环遍历数组,从0索引开始打乱数据的顺序
Random r = new Random();
for (int i = 0; i < 5; i++) {
//生成一个随机数组
int randomindex = r.nextInt(arr.length);
//拿着随机索引指示的元素,跟i指向的元素进行交换
int temp = arr[i];
arr[i] = arr[randomindex];
arr[randomindex] = temp;
}
//当循环结束后,那么数组中所有的数据已经打乱顺序了
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}