文章目录
- 前言
- 一、数组介绍
- 二、数组的定义域静态初始化
- 三、数组元素访问
- 数组地址中的小拓展:
- 四、数组遍历
- 1.获取数组里面的元素
- 2.把数据存储到数组中
- 3.遍历数组的最快方式
- 4.遍历数组并求和
- 5.统计个数
- 6.变化数据
- 五、数组动态初始化
- 1.数组默认初始化值的规律
- 2.数组动态初始化和静态初始化的区别
- 六、数组内存图
- 1.Java内存分配
- 2.数组的内存图
- 3.总结:
- 4.两个数组指向同一个空间的内存
- 总结:
- 七、数组常见问题
- 小结:
- 八、数组常见操作
- 1.求最值
- 2.遍历数组求和
- 3.交换数组中的数据
- 方法一:
- 方法二:
- 4.打乱数组中的数据
- 总结
前言
一、数组介绍
二、数组的定义域静态初始化
public class test8 {
public static void main(String[] args) {
//格式
//静态初始化
//完整格式
//数据类型 [] 数组名=new 数据类型[]{元素1,元素2...};
//简化格式
//数据类型 [] 数组名={元素1,元素2...};
//需求1:定义数组存储5个学生的年龄
int[] arr1=new int[]{11,12,13,14};
int[] arr2={11,12,13,14};
//需求2:定义数组存储3个学生的姓名
String[] arr3=new String[]{"zhangsan","lisi","wangwu"};
String[] arr4={"zhangsan","lisi","wangwu"};
//需求3:定义数组存储4个学生的身高
double[] arr5=new double[]{1.93,1.65,1.68,1.71};
double[] arr6={1.93,1.65,1.68,1.71};
}
}
三、数组元素访问
数组地址中的小拓展:
解释一下地址值的格式含义
[: 表示当前是一个数组
D: 表示当前数组里面的元素都是double类型的
I: 表示当前数组里面的元素都是int类型的
@: 表示一个间隔符号(固定格式)
776ec8df才是数组真正的地址值(十六进制)
平时我们习惯吧这个整体叫做数组的地址值
public class test8 {
public static void main(String[] args) {
//格式
//静态初始化
//完整格式
//数据类型 [] 数组名=new 数据类型[]{元素1,元素2...};
//简化格式
//数据类型 [] 数组名={元素1,元素2...};
//需求1:定义数组存储5个学生的年龄
int[] arr1=new int[]{11,12,13,14};
System.out.println(arr1);
// int[] arr2={11,12,13,14};
//
// //需求2:定义数组存储3个学生的姓名
// String[] arr3=new String[]{"zhangsan","lisi","wangwu"};
// String[] arr4={"zhangsan","lisi","wangwu"};
//
// //需求3:定义数组存储4个学生的身高
// double[] arr5=new double[]{1.93,1.65,1.68,1.71};
// double[] arr6={1.93,1.65,1.68,1.71};
/*扩展:
解释一下地址值的格式含义
[: 表示当前是一个数组
D: 表示当前数组里面的元素都是double类型的
I: 表示当前数组里面的元素都是int类型的
@: 表示一个间隔符号(固定格式)
776ec8df才是数组真正的地址值(十六进制)
平时我们习惯吧这个整体叫做数组的地址值
*/
}
}
四、数组遍历
1.获取数组里面的元素
2.把数据存储到数组中
public class test9 {
public static void main(String[] args) {
/*利用索引对数组中的元素进行访问
1.获取数组里面的元素
格式: 数组名[索引]
*/
int[] arr={1,2,3,4};
/*获取数组里面的第一个元素
其实就是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]);
}
}
3.遍历数组的最快方式
public class test10 {
public static void main(String[] args) {
//1.定义数组
int arr[]={1,2,3,4,5};
//2.获取数组里面所有的元素
//格式: 数组名[索引]
/*
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(最大索引)
//但是当原始数组里面的元素过多,数量不便于数出时,5的位置处该写什么呢?
/*for (int i = 0; i < 5; i++) {
//i:0,1,2,3,4
System.out.println(arr[i]);
}*/
//在Java当中,关于数组的一个长度属性,length
//调用方式: 数组名.length
for (int i = 0; i < arr.length; i++) {
//i:0,1,2,3,4
System.out.println(arr[i]);
}
//扩展:
//自动的快速生成数组的遍历方式
//idea提供的
//数组名.fori
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
4.遍历数组并求和
public class test11 {
public static void main(String[] args) {
/*
定义一个数组,存储1,2,3,4,5
遍历数组得到每一个元素,求数组里面所有的数据和
*/
//分析
//1.定义一个数组并添加数据
int[] arr={1,2,3,4,5};
//求和变量
int sum=0;
//2.遍历数组得到一个数据,累加求和
for (int i = 0; i < arr.length; i++) {
//i 依次表示数组里面的每一个索引
//arr[i] 依次表示数组里面的每一个元素
sum=sum+arr[i];
}
//当循环结束之后,sum的值就是累加之后的结果
System.out.println(sum);
}
}
5.统计个数
import javax.imageio.metadata.IIOMetadataFormatImpl;
public class test12 {
/*
定义一个数组存储1,2,3,4,5,6,7,8,9,10
遍历数组的到每一个元素,通技术组里面一共有多少能被3整除的数字
*/
public static void main(String[] args) {
//分析:
//1.定义一个数组,存储1,2,3,4,5,6,7,8,9,10
int[] arr={1,2,3,4,5,6,7,8,9,10};
//定义一个变量,用来统计次数
int count=0;
//2.遍历数组得到每一个元素
for (int i = 0; i < arr.length; i++) {
//i 表示数组里面的每一个索引
//arr[i] 表示数组里面的每一个元素
//3.判断当前元素是否为3的倍数,如果是的话,统计变量自增一次
if (arr[i] % 3 == 0) {
count++;
}
}
System.out.println("数组中能被3整除的数字有"+count+"个");
}
}
6.变化数据
public class test13 {
public static void main(String[] args) {
/*
定义一个数组存储1,2,3,4,5,6,7,8,9,10
遍历得到每一个元素
要求:
如果是奇数,将当前数字扩大两倍
如果是偶数,将当前数字变为原来的1/2
*/
//分析
//1.定义一个数组存储数据
int[] arr={1,2,3,4,5,6,7,8,9,10};
//2.遍历数组得到每一个元素
for (int i = 0; i < arr.length; i++) {
if(arr[i]%2==0){
arr[i]=arr[i]/2;
}else {
arr[i]=arr[i]*2;
}
}
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
五、数组动态初始化
1.数组默认初始化值的规律
整数类型:默认初始化值0
小数类型:默认初始化值0.0
字符类型:默认初始化值'\u0000' 空格
布尔类型:默认初始化值 false
引用数据类型:默认初始化值 null
public class test14 {
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]);//0
System.out.println(arr2[1]);//0
System.out.println(arr2[2]);//0
}
}
2.数组动态初始化和静态初始化的区别
六、数组内存图
1.Java内存分配
2.数组的内存图
3.总结:
(1)只要是new出来的,一定是在堆里面开辟了一个小空间
(2)如果new了很多次,那么在堆里面有多个小空间,每个小空间都有各自的数据
4.两个数组指向同一个空间的内存
总结:
当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了
七、数组常见问题
public class test15 {
public static void main(String[] args) {
//1.定义一个数组
int[] arr={1,2,3,4,5};
//长度:5
//最小索引:0
//最大索引:4(数组的长度-1)
System.out.println(arr[10]);
//小结:
//索引越界异常
//原因:访问了不存在的索引
//避免:索引的范围
}
}
小结:
索引越界异常
原因:访问了不存在的索引
避免:索引的范围
八、数组常见操作
1.求最值
public class test16 {
public static void main(String[] args) {
//定义数组求最大值: 33,5,22,44,55
//扩展问题
//1.根据求最大值的思路,自己改写一下求最小值
//2.为什么max要记录为arr[0],默认值不能为0呢?
//不能写0,当数组元素里面有负数时,这时可能最终结果是数组原来不存在的数据
//max的初始值一定要是数组中的值
//循环的开始条件一定是0吗
//循环的开始条件如果是0,那么第一次循环的时候就是自己和自己比了一下,对结果没有任何影响,但是效率偏低
//为了提高效率,减少一次循环的次数,循环开始条件可以改为1
//1.定义数组用来存储5个值
int[] arr={33,5,22,44,55};
//2.定义一个变量max用来存储最大值
//临时认为0索引的数据是最大的
int max=arr[0];
//3.循环获取数组中的每一个元素
//拿着每一个元素和max比较
for (int i = 0; i < arr.length; i++) {
//i索引 arr[i]元素
if(arr[i]>max){
max=arr[i];
}
}
//4.当循环结束之后,max记录的是数组中的最大值
System.out.println(max);//55
}
}
2.遍历数组求和
import java.util.Random;
public class test17 {
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+arr[i];
}
System.out.println("数组中所有数据的和为:"+sum);
//2.平均数
int avg=sum/arr.length;
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.println(arr[i]+" ");
}
}
}
3.交换数组中的数据
方法一:
public class test18 {
public static void main(String[] args) {
/*
需求:定义一个数组,将数组中0索引和最大索引的值进行交换
*/
int[] arr={1,2,3,4,5};
//利用第三方变量进行交换
int temp=arr[0];
arr[0]=arr[4];
arr[4]=temp;
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i] + " ");
}
}
}
方法二:
一直交换到 i = j 或者 i > j
public class test19 {
public static void main(String[] args) {
/*
需求:定义一个数组,存入1,2,3,4,5,交换首尾索引对应的元素
交换前:1,2,3,4,5
交换后:5,2,3,4,1
*/
int[] arr={1,2,3,4,5};
//利用循环去交换数据
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.println(arr[i]+" ");
}
}
}
4.打乱数组中的数据
import java.util.Random;
public class test20 {
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 < arr.length; 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.println(arr[i]+" ");
}
}
}
总结
今天的内容你是否有所收获呢友友们🥰如果有写的不对的地方,欢迎大家帮我指正.最后,希望友友们点赞收藏一下博客关注后续的Java学习内容哦~😘💕💕