day04数组

学习目标

  • 了解数组的定义

  • 掌握数组的动态初始化

  • 掌握数组的静态初始化

  • 掌握数组的遍历

  • 掌握数组求最值

  • 掌握数组的排序 冒泡排序

  • 了解数组的内存图

    • 了解java的内存分配

    • 了解一个数组内存图

    • 了解多个数组指向各自空间的内存图

    • 了解多个数组指向同一内存的内存图

1.数组的定义

数组就是用来存储相同数据类型数据的容器

1.1数组定义的格式

/*
   数组定义格式
   数据类型 [] 变量名;
   int [] arr;//定义了一个数组,只能存放int类型相匹配的数据
   数据类型 变量名 [];
   double brr[];//定义了一个double类型的数组,可以存放和double相匹配的数据
*/
public class Demo01数组定义格式 {
}

1.2数组的动态初始化

/*
   数组的动态初始化:
       数据类型 [] 数组名 = new 数据类型[长度];
*/
public class Demo02数组的动态初始化 {
   public static void main(String[] args) {
       //定义一个长度为3的int类型的数据
       int [] arr = new int[3];
       //定义一个长度为5的float类型的数组
       float [] brr = new float[5];
  }
}

1.3动态初始化数组的基本操作 取值 赋值

/*
   动态初始化数组的基本操作
   取值:
       格式:数组的数据类型 变量名 = 数组名[索引];
       索引:是数组在内存中开辟空间编号,从0开始到数组长度减一 例如 数组的长度为5 数组最大索引是4
   赋值:
       格式:arr[索引] = 值;
*/
public class Demo03动态初始化数组的基本操作 {
   public static void main(String[] args) {
       //动态初始化一个长度为5的int类型的数组
       int [] arr = new int[5];//数组的长度为5 只能存放int类型相匹配数据,他的索引是0 1 2 3 4
       //取值:格式:数组的数据类型 变量名 = 数组名[索引];
       int a = arr[0];//取出0索引对应的数值 存放到变量a中
       //打印a
       System.out.println(a);
       int b= arr[1];
       System.out.println(b);
       int c= arr[2];
       System.out.println(c);
       int d= arr[3];
       System.out.println(d);
       int e= arr[4];
       System.out.println(e);
       System.out.println("--------");
       for (int i = 0; i < 5; i++) {
           /*System.out.println(i);*/
          int f =  arr[i];
           System.out.println(f);
      }
       System.out.println("------------------");
       //赋值:格式:arr[索引] = 值;
       arr[0] = 10;
       arr[1] = 20;
       arr[2] = 30;
       arr[3] = 40;
       arr[4] = 50;
       for (int i = 0; i < 5; i++) {
           int x = arr[i];
           System.out.println(x);
      }
  }
}

1.4数组的静态初始化

/*
   数组的静态初始化:
       格式1:
           数据类型[] 数组名 = new 数据类型[]{.........}
           int [] arr = new int[]{1,2,3,4,5,6,7,8,9,0}
       格式2:
           数据类型[] 数组名 = {............};
           int [] brr = {1,2,3,4,5,6,7,8,9};
       提示:
           静态初始化数组推荐使用格式2,当存储元素是已知数据时推荐使用数组的静态初始化
           静态初始化数组有默认值,默认值是初始化是赋给的值
*/
public class Demo04数组的静态初始化 {
   public static void main(String[] args) {
       int [] brr = {1,2,3,4,5,6,7,8,9};
       int a = brr[0];
       System.out.println(a);
       System.out.println("----------");
       for (int i = 0; i < 9; i++) {
           System.out.println(brr[i]);
      }
       System.out.println("---------------");
       int [] crr = {1,2,3,4,5,6,7,8,9,0};
       /*
           求数组的长度 数组提供了一个属性length 用来求数组的长度
           使用格式:
             int l = 数组名.length;
        */
       int l = crr.length;
       System.out.println(l);
       int length = brr.length;
       System.out.println(length);
       //取出数组中所有元素 打印到控制台
       for (int i = 0; i < crr.length; i++) {
           System.out.println(crr[i]);
      }
  }
}

1.5 动态初始化数组有默认值

/*
   动态初始化数组有默认值:
   基本类型的数组有默认值:
       byte short int long数组 默认值是0
       float double 数组 默认值是0.0
       boolean 数组 默认值是false
       char 数组 默认值 '\u0000'
   引用数据类型数组的默认值是:null

*/
public class Demo05动态初始化数组有默认值 {
   public static void main(String[] args) {
       //int 数组 默认值是0
       int[] arr = new int[3];
       for (int i = 0; i < arr.length; i++) {
           System.out.println(arr[i]);
      }
       System.out.println("-----------");
       //byte 数组 默认值是0
       byte [] brr = new byte[3];
       for (int i = 0; i < brr.length; i++) {
           System.out.println(brr[i]);
      }
       System.out.println("-----------");
       short [] crr = new short[3];
       for (int i = 0; i < crr.length; i++) {
           System.out.println(crr[i]);
      }
       System.out.println("------------");
       long [] drr = new long[3];
       for (int i = 0; i < drr.length; i++) {
           System.out.println(drr[i]);
      }
       System.out.println("------------");
       float[] err = new float[3];
       for (int i = 0; i < err.length; i++) {
           System.out.println(err[i]);
      }
       System.out.println("------------");
       double[] frr = new double[3];
       for (int i = 0; i < frr.length; i++) {
           System.out.println(frr[i]);
      }
       System.out.println("------------");
       boolean [] grr  = new boolean[3];
       for (int i = 0; i < grr.length; i++) {
           System.out.println(grr[i]);
      }
       System.out.println("---------");
       char[] hrr = new char[3];
       for (int i = 0; i < hrr.length; i++) {
           System.out.println(hrr[i]);
      }
       System.out.println("---------");
       //数组 类 接口
       String [] irr = new String[3];
       for (int i = 0; i < irr.length; i++) {
           System.out.println(irr[i]);
      }
  }
}

1.6遍历数组

/*
   遍历数组的通用代码:
       for (int i = 0; i < 数组名.length; i++) {
           System.out.println(数组名[i]);
       }
*/
public class Demo06练习 {
   public static void main(String[] args) {
       int[] arr = {11,22,33,44,55};
       //使用循环最方便 选择for循环
       for (int i = 0; i < arr.length; i++) {
           System.out.println(arr[i]);
      }
  }
}

1.7求数组的最大值

/*
   1.定义最大值
       int max = arr[0];
   2.使用循环遍历数组依次获取数组中的每一个元素
   3.和最大值max比较
       如果比最大值还要大,就更新最大值
*/
public class Demo07求数组的最大值 {
   public static void main(String[] args) {
       int [] arr = {5,44,33,55,22};
       //定义最大值
       int max = arr[0];
       //使用循环遍历数组
       for (int i = 0; i < arr.length; i++) {
           //和最大值比较
           if (arr[i]>max){
               //更新最大值
               max = arr[i];
          }
      }
       System.out.println("数组中元素的最大值是:"+max);
  }
}

1.8求数组的最小值

/*
1.定义最小值
int min = arr[0];
2.使用循环遍历获取数组中每一个元素 依次和最小值比较
如果比最小值还要小,就更新最小值
*/
public class Demo08求数组的最小值 {
public static void main(String[] args) {
int [] arr = {5,44,33,55,22};
//1.定义最小值
int min = arr[0];
//2.使用for循环遍历数组
for (int i = 0; i < arr.length; i++) {
//3.比较
if (arr[i]<min){
//4.更新最小值
min = arr[i];
}
}
//5.打印结果
System.out.println("数组中元素的最小值是:"+min);
}
}

1.9 求数组元素和求平均值

/*
求和:
1.定义求和变量 存储最终和
int sum = 0;
2.使用循环遍历数组,获取数组中的元素,和求和变量累加
3.打印最终和
求平均值:
使用数组中元素和和长度相除
*/
public class Demo09求数组元素和求平均值 {
public static void main(String[] args) {
int[] arr = {5, 44, 33, 55, 22};
//1.定义求和变量 存储最终和
int sum = 0;
//2.使用循环遍历数组,获取数组中的元素,和求和变量累加
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
//3.打印最终和
System.out.println("数组中所有元素的和:"+sum);

//4.求平均值
double avg = sum*1.0/arr.length;
System.out.println("数组中元素的平局值:"+avg);
}
}

1.10 冒泡排序 最初版

import java.util.Arrays;
/*
冒泡排序的原理:
1.数组中相邻两个数字比较 如果前面的数据大于后面的数据 则交换位置
2.第一轮比较完成以后 获取到数组中最大值放到最大值索引位置
3.数组有多长我们就 遍历多少轮
*/
public class Demo10冒泡排序 {
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
/* //第一轮交换 求出数组中最大值放到最大索引位置
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
//第二轮交换 求出数组中最大值放到最大索引位置
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
//第三轮交换 求出数组中最大值放到最大索引位置
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
//第四轮交换 求出数组中最大值放到最大索引位置
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));*/

for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-1; j++) {
if (arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//打印数组的元素
System.out.println(Arrays.toString(arr));
}
}

1.11 数组查找

import java.util.Scanner;

/*
需求:已知一个数组 arr = {19, 28, 37, 46, 50};
键盘录入一个数据,查找该数据在数组中的索引,并在控制台输出找到的索引值。
1.键盘录入
2.查找键盘录入的数据在数组中的索引
3.输出索引
*/
public class Demo11数组查找 {
public static void main(String[] args) {
int []arr = {19, 28, 37, 46, 50};
//1.键盘录入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
//2.查找键盘录入的数据在数组中的索引 如果不存输出-1
//定义一个变量用来存存数组的索引
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (num == arr[i]){
index = i;
}
}
System.out.println(num+"在数组中索引"+index);
}
}

1.12 评委打分

import java.util.Arrays;
import java.util.Scanner;

/*
需求:在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
选手的最后得分为:去掉一个最高分和一个最低分后的4个评委平均值 (不考虑小数部分)。
1.定义长度为6的数组 存放6个评委的打分
2.键盘录入6个成绩
3.求最大值最小值
4.求和 求平均值
*/
public class Demo12评委打分 {
public static void main(String[] args) {
//定义数组
int [] arr = new int[6];
//键盘录入6个成绩
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
System.out.println("请第"+(i+1)+"个评委打分:");
int score = scanner.nextInt();
if (score>=0&&score<=100){
arr[i] = score;
}else {
System.out.println("您的打分不和法!");
i--;
}
}
System.out.println(Arrays.toString(arr));
// 3.求最大值最小值
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i]>max){
max = arr[i];
}
}
System.out.println("max = "+max);
int min = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i]<min){
min = arr[i];
}
}
System.out.println("min = "+min);
//4.求和 求平均值
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
System.out.println("sum = "+sum);
//平均值
double avg = (sum-max-min)*1.0/(arr.length-2);
//double l = Math.round(avg * 100)*1.0 / 100;
System.out.println("运动员的最终成绩:"+avg+"分");
}
}

2.数组的内存分配

2.1 Java内存分配 以及单个数组的内存图

/*
栈内存
方法运行时,进入的内存
堆内存
new出来的内容都会进入堆内存,并且会存在地址值
方法区
字节码文件(.class文件)加载时进入的内存
本地方法栈:
调用操作系统相关资源
寄存器
交给CPU去使用
*/
public class Demo01Java内存分配 {
public static void main(String[] args) {
int [] arr = new int[3];
System.out.println(arr);//[I@119d7047
/*
[I@119d7047
[:数组
I:int类型
@:分隔符
119d7047:地址值 存在堆内存中
*/
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);

arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
System.out.println(arr);//[I@119d7047
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);



double [] brr = new double[3];
System.out.println(brr);

System.out.println(brr[0]);
System.out.println(brr[1]);
System.out.println(brr[2]);
double [][] crr = new double[3][4];
System.out.println(crr);

}
}

01单个数组的内存图

2.2 两个数组的内存图

/*
两个数组指向各自对内存,无论谁修改自己堆内存中的数据,最后取值的时候,取得是修改后的最新值
*/
public class Demo02两个数组的内存图 {
public static void main(String[] args) {
int [] arr = new int[3];
System.out.println(arr);//[I@119d7047
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
System.out.println(arr);//[I@119d7047
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);

int [] brr = new int[3];
System.out.println(brr);
System.out.println(brr[0]);//0
System.out.println(brr[1]);
System.out.println(brr[2]);
brr[0] = 11;
brr[1] = 22;
brr[2] = 33;
System.out.println(brr);
System.out.println(brr[0]);//11
System.out.println(brr[1]);//22
System.out.println(brr[2]);//33
}
}

02两个数组的内存图

2.3 多个数组指向同一片堆内存

/*
多个数组指向同一片堆内存,无论谁修改堆内存中的值,再去取值的时候取得是修改后的最新值
*/
public class Demo03两个数组指向同一片堆内存 {
public static void main(String[] args) {
int [] arr = new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);

int [] brr = arr;
System.out.println(brr);
System.out.println(brr[0]);
System.out.println(brr[1]);
System.out.println(brr[2]);
brr[0] = 11;
brr[1] = 22;
brr[2] = 33;
System.out.println(brr);
System.out.println(brr[0]);//11
System.out.println(brr[1]);//22
System.out.println(brr[2]);//33
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}

03两个数组指向同一片堆内存的内存图

2.4 数组在操作中出现问题

public class Demo04数组在操作中出现问题 {
public static void main(String[] args) {
//1.访问了数组不存在索引 .ArrayIndexOutOfBoundsException 数组索引越界异常
int [] arr = new int[3];
//System.out.println(arr[3]);//.ArrayIndexOutOfBoundsException
//2.空指针异常 NullPointerException
System.out.println(arr);
arr = null;
System.out.println(arr[0]);
}
}
 

 

 

 

 

 

 

 

 

 

 

 

posted @   忘了鱼尾纱的猫  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?

阅读目录(Content)

此页目录为空

  1. 1 刘哈哈与大先生 刘心&大鹏
  2. 2 我们打着光脚在风车下跑,手上的狗尾巴草摇啊摇 等一下就回家 / -艾兜
  3. 3 哎呦 毛不易
  4. 4 夜、萤火虫和你 AniFace
刘哈哈与大先生 - 刘心&大鹏
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 刘心/大鹏

作曲 : 刘心

刘:我越来越没自信了

破头发还是不停的脱

那些快乐 快乐 不属于我

还剩下什么 一把吉他陪我唱歌

鹏:这不是我想的生活

鹏:这不是我想的生活

多希望有美眉爱看我

不是笑我 笑我 调侃着我

搞得像个失败者

其实我妈妈说我优点也很多

刘:这个世界开始变得越来越快了

刘:这个世界开始变得越来越快了

可是怎么却都不快乐

鹏:脱下你沉重的假面听我唱首歌

鹏:脱下你沉重的假面听我唱首歌

简单有时比复杂值得

刘:我想要点春风 我想要点感动

刘:我想要点春风 我想要点感动

鹏:我想要点香槟 我想要碟花生

沙滩 海风

刘:美女如云穿梭

这是我的美梦(合)白日梦

刘:这不是我想的生活

刘:这不是我想的生活

多希望有美眉爱看我

不是笑我 笑我 调侃着我

搞得像个失败者

其实我妈妈说我优点也很多

鹏:这个世界开始变得越来越快了

鹏:这个世界开始变得越来越快了

可是怎么却都不快乐

刘:脱下你沉重的假面听我唱首歌

刘:脱下你沉重的假面听我唱首歌

简单有时比复杂值得

鹏:这个世界开始变得越来越快了

鹏:这个世界开始变得越来越快了

可是怎么却都不快乐

刘:脱下你沉重的假面听我唱首歌

刘:脱下你沉重的假面听我唱首歌

简单有些时候都要比复杂值得

鹏:我想要点春风 我想要点感动

鹏:我想要点春风 我想要点感动

刘:我想要点香槟 我想要碟花生

沙滩 海风

鹏:美女如云穿梭

这是我的美梦(合)白日梦

点击右上角即可分享
微信分享提示