JAVA的学习笔记day05

数组的介绍

什么是数组

数组指的是一种容器,可以用来存储同种数据类型的多个值

数组容器在存储数据的时候,需要结合隐式转换考虑。

例如:int类型的数组容器 :booean和 doule是不可以存入的 但是byte short int是可以存入的

例如:double类型的数组容器中byte short int longfloat double都是可以存入的

建议:容器的类型,和存储的数据类型保持一致

数组的定义与静态初始化

数组的定义

数组的初始化

初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程

完整格式:数据类型\[\] 数组名=new 数据类型\[\]{元素1,元素2, 元素3...);

范例:int\[\] array = new int\[\]{11, 22, 33};

double\[\] array2 = new double\[\] {11.1, 22.2, 33.3);

简化格式

静态初始化

完整格式:数据类型\[\] 数组名=new 数据类型\[\]{元素1,元素2, 元素3...};

简化格式:数据类型\[\] 数组名={元素1,元素2,元素3...};

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        //定义数组存储5个学生的年龄
        int[] array1 = new int[]{11,12,12,14,13};
        int[] array2 = {11,12,12,14,13};

        //定义数组存储3个学生的姓名
        String[] array3 = new String[]{"张三","李四","王五"};
        String[] array4 = {"张三","李四","王五"};
        
        //定义三个同学的身高
        double[] array5 = new double[]{179.2,198.3,178.4};
        double[] array6 = {179.2,198.3,178.4};
    }
}

数组的地址值

数组的地址值表示数组在内存中的位置

[I@b4c966a

[:表示当前是一个数组

在@前面的D表示当前数组里面的元素都是double类的,前面是I表示当前数组里面的元素都是int类型的

@:表示一个间隔符号,这是固定格式

b4c966a:这是数组真正的地址值(十六进制表示)

但是平时习惯将整体[I@b4c966a作为数组的地址值

数组元素访问

格式:数组名索引;

索引

索引:也叫作下标,角标

索引的特点:从0开始逐个+1增长,连续不间断

利用索引对数组中的元素进行访问

1.获取数组里面的元素

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {11,12,12,14,13};
        int number = array[0];
        System.out.println(number);
    }
}

2.把数据存储到数组当中

格式:数组名索引; = 具体数据/变量

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {11,12,12,14,13};
        array[0] = 100;
        System.out.println(array[0]);
    }
}

赋值的数据会覆盖原来的数据,覆盖后原来的数据就不存在了

数组遍历

**数组遍历:**将数组中所有的内容取出来,取出来之后可以(打印,求和,判断..)

**注意:**遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印!

我们可以使用循环来遍历数组

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {11,12,12,14,13};
        for(int i =0;i< array.length;i++){
            System.out.println(array[i]);
        }
    }
}

在Java当中,关于数组的一个长度属性:length

调用方法:数组名.length

自动的快速生成数组的遍历的方式

数组名.fori

练习:

遍历数组并求和

定义一个数组,存储1,2,3,4,5

遍历数组得到每一个元素,求数组里面所有的数据和

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5};
        int sum = 0;
        for(int i =0;i< array.length;i++){
            sum +=array[i];
        }
        System.out.println("数组里面所有的数据和为:"+sum);
    }
}

统计个数

定义一个数组,存储1,2,3,4,5,6,7,8,9,10遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5,6,7,8,9,10};
        int count = 0;
        for(int i =0;i< array.length;i++){
          if(array[i]%3==0){
              count++;
          }
        }
        //当循环结束后,数组里面的数字就都判断完成了,就可以打印出来有多少个能被3整除
        System.out.println("在数组中能被3整除的有"+count+"个");
    }
}

变化数据

定义一个数组,存储1,2,3,4,5,6,7,8,9,10遍历数组得到每一个元素。

要求:

1,如果是奇数,则将当前数字扩大两倍

2,如果是偶数,则将当前数字变成二分之一

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5,6,7,8,9,10};
        for(int i =0;i< array.length;i++){
          if(array[i]%2==0){
              //变成了二分之一后还要赋值给数组
              array[i] = array[i]/2;
          }else{
              array[i] = array[i]*2;
          }
            System.out.println(array[i]);
        }
    }
}

数组的动态初始化

动态初始化的格式

数据类型\[\] 数组名 = new 数据类型数据长度;

练习

定义一个数组,用来存班级中50个学生的注名姓名未知,等学生报道之后,再进行添加。

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        String[] array = new String[50];
        //添加学生信息
        array[0]="张三";
        array[1] = "李四";
        array[8] = "王五";
        System.out.println(array[0]);
    }
}

数组默认初始化值的规律

整数类型:默认初始化值0

小数类型:默认初始化值0.0

字符类型:默认初始化值'/u0000'也就是空格

布尔类型:默认初始化值 false

引用数据类型:默认初始化值 null

数组动态初始化和静态初始化的区别

动态初始化:手动指定数组长度,由系统给出默认初始化值。

只明确元素个数,不明确具体数值,推荐使用动态初始化

静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。

需求中已经明确了要操作的具体数据,直接静态初始化即可。

数组常见问题

1.当访问了数组中不存在的索引,就会引发索引越界异常。

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5};
        System.out.println(array[10]);
    }
}

这是访问数组中索引第10的元素,但是数组中没有这个元素,所以报索引越界异常错误

在这个报错中知道错误是在第十二行

数组的常见操作

求最值

需求:已知数组元素为{33,5,22,44,55}

请找出数组中最大值并打印在控制台

分析:

1.定义max变量准备记录擂台上的变化

int max=arr0;

2遍历数组获取每一个元素

复制代码
for(int i =0;i< array.length;i++){
          array[i]
    }

3.让每一个元素跟max进行比较如果找到更大的,就让max记录该元素

复制代码
for(int i =0;i< array.length;i++){
          if(array[i]>max){
          max = array[i];
      }
  }

所以代码:

复制代码
package demo1;
public class Test2 {
    public static void main(String[] args){
        int[] array = {33,5,22,44,55};
        int max =array[0];
        for (int i = 1; i < array.length; i++) {
            if(array[i]>max){
                max = array[i];
            }
        }
        System.out.println(max);
    }
}

循环的开始条件如果为0,那么第一次循环的时候是自己跟自己比了一下,对结果没有任何影响,但是效率较低,所以为了提高效率,我们可以将循环开始条件改为1

求和

遍历数组求和

需求:生成10个1~100之间的随机数存入数组。

1)求出所有数据的和

2)求所有数据的平均数

3)统计有多少个数据比平均值小

1.先定义数组,然后将随机数存入数组中

复制代码
package demo1;

import java.util.Random;

public class Test2 {
    public static void main(String[] args){
        int[] array = new int[10];
        Random r = new Random();
        for (int i = 0; i < array.length; i++) {
            //每循环一次,就会生成一个新的随机数
            int number = r.nextInt(100)+1;
            //把生成的随机数添加到数组中
            //数组名[索引] = 数据
            array[i] = number;
        }
        //1.求出所有数据的和
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            sum+=array[i];
        }
        System.out.println("数组中所有数据的和为:"+sum);

        //2.求所有数据的平均数
        int avg = sum/array.length;
        System.out.println("数组中的平均数:"+avg);

        //3.统计有多少个数据比平均数小
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if(array[i]<avg){
                count++;
            }
        }
        System.out.println("统计有"+count+"数据比平均数要小");

        //遍历数组来证明数据的正确性
        for(int i = 0; i < array.length; i++){
            System.out.println(array[i]);
        }
        }
    }

我们可以将System.out.println(arrayi);改为System.out.print(arrayi+"");

这样遍历的结果就在一行显示(ln删除掉就代表不会换行),如图

交换数据

交换数组中的数据

需求:定义一个数组,存入1,2,3,4,5。按照要求交换索引对应的元素。

交换前:1,2,3,4,5

交换后:5,2,3,4,1

两个变量的交换

将数组中索引和最大索引出的值进行交换

所以代码:

1.定义数组存储数据

2.利用循环去交换数据

复制代码
package demo1;

public class Test2 {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5};
        for(int i=0,j=array.length-1;i<=j;i++,j--){
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
        for(int i=0;i<array.length;i++){
            System.out.print(array[i]+" ");
        }
        }
    }

打乱数据

打乱数组中的数据

需求:定义一个数组,存入1~5。要求打乱数组中所有数据的顺序。

如何获取随机索引

复制代码
int[] array = {1,2,3,4,5};
索引范围是:0,1,2,3,4
可以使用生成随机数来生成随机索引
Random r = new Random();
int number = r.nextInt(array.length);
System.out.print(number);

package demo1;

import java.util.Random;

public class Test2 {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5};
        Random r = new Random();
        for(int i=0;i< array.length;i++){
            int number = r.nextInt(array.length);
            int temp = array[i];
            array[i] = array[number];
            array[number] = temp;
        }
        for(int i=0;i<array.length;i++){
            System.out.print(array[i]+" ");
        }
        }
    }

数组的内存图

Java的内存分配

JVM

注意

方法运行时使用的内存,比如main方法运行,进入方法栈中执行

new来创建的,都存储在堆内存

内存:

数组的内存

获取数据

赋值

第二个数组内存

两个数组的内存是相互没有任何影响的

总结:

1.只要是new出来的一定是在堆里面开辟了一个小空间

2.如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据

两个数组指向同一个空间的内存图

int\[\] arr1{11,22};

int\[\] arr2 = arr1;

所以就是把arr1的的地址值赋值给了arr2,这样arr1和arr2就是指向同一个空间

所以System.out.print(arr10);和System.out.print(arr20);的结果是一样的

所以arr20 = 33; 就是将同一空间的中的0索引对应的改为33

所以最后打印出来的结果是修改后的33

总结:

1.当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。

题目

题目1

现有一个小数数组{12.9, 53.54, 75.0, 99.1, 3.14}。请编写代码,找出数组中的最小值并打印。

复制代码
package demo1;
public class Test1 {
    public static void main(String[] args) {
        double[] array = {12.9, 53.54, 75.0, 99.1, 3.14};
        double min = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] < min) {
                min = array[i];
            }
        }
        System.out.println(min);
    }
    }

题目2

创建一个长度为6的整数数组。请编写代码,随机生成六个0(包含)-100(不包含)之间的整数存放到数组中,然后计算出数组中所有元素的和并打印。

复制代码
package demo1;
import java.util.Random;
public class Test2 {
    public static void main(String[] args){
        int[] array = new int[6];
        Random r = new Random();
        int sum = 0;
        for(int i=0;i<array.length;i++){
            array[i]=r.nextInt(100);
            sum=sum+array[i];
        }
           System.out.println("和为:"+sum);
        }
    }

题目3

现有一个整数数组,数组中的每个元素都是0-9之间的数字,从数组的最大索引位置开始到最小索引位置,依次表示整数的个位、十位、百位。。。依次类推。请编写

程序计算,这个数组所表示的整数值。例如:

复制代码
package demo1;
public class Test1 {
    public static void main(String[] args) {
        int[] array = {1,3,5,6,8};
        int number = 0;
        for (int i = 0; i < array.length; i++) {
           number= number*10+array[i];
        }
        System.out.println(number);
    }
    }

题目4

定义一个数组来存储10个学生的成绩,例如:{72, 89, 65, 87, 91, 82, 71, 93, 76, 68}。计算并输出学生的平均成绩。

复制代码
package demo1;
public class Test1 {
    public static void main(String[] args) {
        int[] array = {72, 89, 65, 87, 91, 82, 71, 93, 76, 68};
        int sum = 0;
        double avg =0;
        for (int i = 0; i < array.length; i++) {
           sum= sum+array[i];
        }
        avg = sum/array.length;
        System.out.println("平均数:"+avg);
    }
    }

题目5

有一个数组,其中有十个元素从小到大依次排列 {12,14,23,45,66,68,70,77,90,91}。再通过键盘录入一个整数数字。要求:把数字放入数组序列中,生成一个新的数组,并且数组的元素依旧是从小到大排列的。执行效果如下:

  1. 数组的长度是不能改变的,所以增加一个元素需要定义一个新数组。

所以步骤是

1.先重新定义一个比原来的数组大一个的数组array2

2.使用键盘录入,来录入一个数字number

3.定义一个变量来记录number的索引位置index

4.遍历原来的数组,如果都是小于等于number,那就直接复制到新的数组array2中,index要在原数组索引数上加一表示在新的数组的最后一位,如果大于number,那就从新数组的索引1开始开始将原数组上的元素赋值过去

复制代码
package demo1;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        int[] array = {12,14,23,45,66,68,70,77,90,91};
        int[] array2 =new int[array.length+1];
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入一个整数:");
        int number = sc.nextInt();
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            if(array[i]<=number){
                array2[i]=array[i];
                index=i+1;
            }else{
                array2[i+1]=array[i];
            }
        }
        array2[index]=number;
        for(int i=0;i<array2.length;i++){
            System.out.println(array2[i]);
        }
    }
    }

题目6

定义一个数组其中包含多个数字。用自己的方式最终实现,奇数放在数组的左边,偶数放在数组的右边。(可以创建其他数组,不必须在原数组中改变)

  1. 定义出原数组array,其中包含多个数字。

  2. 定义新数组array2,和array的长度一样。

  3. 定义变量left,初始值是0准备从左边放元素,定义变量right,初始值是arr.length-1准备从右边放元素。

  4. 对原数组array进行遍历。

  5. 如果元素是奇数,则放在新数组array2的左边,left变量加一。

  6. 如果元素是偶数,则放在新数组array2的右边,right变量减一。

  7. 遍历新数组array2打印最终结果。

    package demo1;
    public class Test1 {
    public static void main(String[] args) {
    int[] array = {12,14,23,45,66,68,70,77,90,91};
    int[] array2 =new int[array.length];
    int left =0;
    int right=array.length-1;
    for(int i=0;i<array.length;i++){
    if(array[i]%2==1){
    array2[left]=array[i];
    left++;
    }else{
    array2[right]=array[i];
    right--;
    }
    }
    for(int i=0;i<array2.length;i++){
    System.out.print(array2[i]+" ");
    }
    }
    }

相关推荐
Devin~Y2 分钟前
大厂 Java 面试实战:从 Spring Boot 微服务到 AI RAG 音视频平台全链路解析
java·spring boot·redis·spring cloud·微服务·rag·spring ai
让我上个超影吧3 分钟前
Cluade code:Subagents (子代理)
java·ai
aXin_ya13 分钟前
乐尚代驾,总结
java
仙俊红18 分钟前
Java JUC:CompletableFuture 详解,多个任务并行执行并等待全部完成
java·python·spring
JAVA面经实录91721 分钟前
MongoDB(文档型 NoSQL)
java·数据库·mongodb·nosql
cfm_291421 分钟前
JVM类加载机制初步了解
java·jvm
旅僧22 分钟前
机械臂学习笔记(更新中)
笔记·学习
让我上个超影吧23 分钟前
Cluade code:上下文压缩
java·服务器·ai
plainGeekDev26 分钟前
批量写入 → Room 事务
android·java·kotlin
宋哥转AI26 分钟前
MCP 第一天我没写@Tool,先在一个大仓库里划这三层
java·agent·mcp