数组咖啡馆的下午茶

一.数组—引用数据类型<堆>

自恋的老司机说有点难,所以我的小可爱们要认真仔细的学哦!

ok ,那就一起来看一下我们今天要学一些什么

按照惯例,我们一起来看一下本章目标

  • 理解数组的作用

  • 掌握数组的定义

  • 掌握数组的基本使用

  • 掌握数组的常用操作:求:最大/小值、排序等。

    1.理解数组的作用

    什么是数组?

    有限个相同类型的变量所组成的一个集合,数组中的每个变量可以成为一个元素,数组在内存中是顺序存储的,需要开辟连续的内存空间.

2.数组的定义

  1. Java 语言中提供的数组是用来存储固定大小的同类型元素。
  2. 数组属引用数据类型 ,它的数据是存储在jvm中的中的。基本数据类型一般都是存储在栈中。

那说了这么多,这个数组到底是干什么的呢?他能帮助我们做些什么? 他和变量有什么区别?

如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:

int i1, i2, i3, ... i100;

但是这个时候如果按照此类方式定义就会非常麻烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有一个要求,要求你输出这100个变量的内容,意味着你要编写System.out.println()语句100次。

其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配,而数组的定义语法有如下两类。

3.掌握数组的基本使用

变量:

  • 数据类型

  • 数组名(变量名)

  • 变量值

    数组:

  • 数据类型

  • 数组的长度( 一个数组定义了长度就无法更改)

  • 数组的元素 数组元素不赋值也有默认值

    String等引用数据类型默认值为:null (表示没有引用)

  • 数组的下标(索引)

    ps:数组的访问通过索引完成,即:“数组名称[索引]”,但是需要注意的是,数组的索引从0开始,所以索引的范围就是0 ~ 数组长度-1,例如开辟了3个空间的数组,所以可以使用的索引是:0,1,2,如果此时访问的时候超过了数组的索引范围,会产生java.lang.ArrayIndexOutOfBoundsException (数据的索引越界)异常信息;

    两类语法:
    数据类型[] 数组名 = new 数据类型[数组长度];

    数据类型[] 数组名 = new {元素1,元素2,元素3...};

数组中元素的表示方法

想要访问数组里的元素,可以利用索引来完成。Java的数组索引编号由0开始,以一个的score[10]的整形数组为例,score[0]代表第1个元素,score[1]代表第2个元素,score[9]为数组中第10个元素(也就是最后一个元素)。

在这里插入图片描述

第一种语法:数据类型[] 数组名 = new 数据类型[数组长度];

public class Test
{
    public static void main(String[] args)
    {
        
        int[] arr = new int [5];
        arr[0] = 0;
        arr[1] = 1;
        arr[2] = 3;
        arr[3] = 4;
        arr[4] = 5;

        // 利用循环实处每一个元素的值
        for(int i = 0;i < arr.length;i++)//数组名.length就是数组长度
        {
            System.out.print(arr[i]+" ");  
        }
    }
}


第二种语法:数据类型[] 数组名 = new {元素1,元素2,元素3...};

public class Test
{
    public static void main(String[] args)
    {
       
        int[] arr2 = new int []{1,2,3,4,5};//
    }
}


掌握了数组的俩种语法,有聪明可爱的同学就想到了,我如果想要获取数组中的所有数据该怎么做呢?

获取数组中的所有数据:(遍历)

// 定义数组
double[] scores = {90,80,70,77,66};
// 遍历数组
// scores[0];
// scores[1];
// scores[2];

for(int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}

4.掌握数组的常用操作

4.1求一个班的成绩总和和平均分

需求: 求每个班的平均分 每个班的成绩和 以及班级成绩总和。

import java.util.Scanner;

public class Demo5 {
	public static void main(String[] args) {
		// 创建
		Scanner input = new Scanner(System.in);
		// 存储数据
		int[][] array = new int[3][3];
		// 定义三个班总和
		int total = 0;		
		for(int i = 0; i < array.length;i++) {
			System.out.println((i+1) + "班的成绩");
			// 定义每个班的总和
			int sum = 0;
			// 定义平均数
			int avg = 0;
			for(int j = 0;j < array[i].length;j++) {
				System.out.print("请输入第" +(j+1)+"名学生的成绩:"); 
				array[i][j] = input.nextInt();
				// 班级成绩总和
				sum += array[i][j];
				avg = sum / array[i].length;
				total += array[i][j]; 				
			}
			System.out.println("第"+(i+1)+"个班的成绩总和是:"+sum);
			System.out.println("第"+(i+1)+"个班的平均成绩是:"+avg);
				}
		System.out.println(array.length + "个班级的成绩总和:"+ total);
	}


}

4.2求最大值最小值

默认最大值是第一个元素

默认最小值也是第一个元素

遍历数组元素比较数组元素的值和默认的最大值,如果数组元素的值比默认最大值还要大 ,则用数组元素的值作为默认的最大值, 这样遍历一遍之后就可以求出最大值了.求最小值也是同样.

public class MaxAndMin {
	public static void main(String[] args) {
		int[] array={1,3,67,34,23,89,56,34,21};//定义数组
		System.out.println("----------方法1:-----------");
		int max=array[0];//默认第一个最大
		int min=array[0];//默认第一个最小
		for(int i=1;i<array.length;i++)
		{
			if(array[i]>max)
			{
				max=array[i];//如果有比max大的数就让max记录下大的数
			}
			if(array[i]<min)
			{
				min=array[i];//如果有比min小的数就让min记录下小的数
			}
			
		}
		System.out.println("max="+max);
		System.out.println("min="+min);
		
 

二.多重数组和冒泡排序

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组

多维数组: 在Java的内存模型并不存在多维数组,但是语法层面上支持。 意味着本质上还是一个一维数组。

1.引用数据类新的名称来源

Java中的数据类型分类:

  • 基本数据类型: 数据存储是在栈中的(栈中数据线程不共享,独立的)
    • 数值型:
      • 整数型 byte short int long
      • 浮点型 float double
    • 非数值型 char boolean
  • 引用数据类型: 数据存储是在堆中的(中数据线程共享) 为了更好的利用我们的数据而提出的概念。
    • 数组、类(String就是一个类)、接口、枚举…

2.二维数组语法

二维数组的初始化:直接为每一维分配空间

1.元素类型 变量名 = new 元素类型[行数][列数];

声明整型数组score,同时为其开辟一块内存空间:

例子:

int[][] score = new int[4][3];

小口诀:外层循环控制行数 内层循环控制每行的内容。


public class Test {
    public static void main(String[] args) {
        int score[][] = new int[4][3]; // 声明并实例化二维数组
        score[0][1] = 30 ; // 为数组中的部分内容赋值
        score[1][0] = 31 ; // 为数组中的部分内容赋值
        score[2][2] = 32 ; // 为数组中的部分内容赋值
        score[3][1] = 33 ; // 为数组中的部分内容赋值
        score[1][1] = 30 ; // 为数组中的部分内容赋值
        for (int i = 0; i < score.length; i++) { // 外层循环行
            for(int j=0;j<score[i].length;j++){// 内层循环列
                System.out.print(score[i][j] + "\t");
            }
            System.out.println("") ; // 换行
        }
    }


输出的结构为:

0	30	0	
31	30	0	
0	0	32	
0	33	0	
 

2.元素类型 变量名 = {{元素A1,元素A2...}, {元素B1,元素B2}...};

列子:

int score[][] = {{ 67, 61 }, { 78, 89, 83 }, { 99, 100, 98, 66, 95 }};

public class Test {
    public static void main(String[] args) {
        // 初始化一个二维数组,每行的数组元素个数不一样
        int[][] score = {{ 67, 61 }, { 78, 89, 83 }, { 99, 100, 98, 66, 95 }};
        for (int i = 0; i < score.length; i++) { // 外层循环输出行
            for (int j = 0; j < score[i].length; j++) {// 内存循环输出列
                System.out.print(score[i][j] + "\t");// 输出每一个元素
            }
            System.out.println(""); // 换行
        }
    }


输出结果:

67	61	
78	89	83	
99	100	98	66	95
 

3.Arrays类的使用

Arrays类的定义
Arrays是java.util.Arrays;包下的类,主要是对数组进行操作的。

常用方法

1.equals(数组1,数组2); 比较两个数组是否相等。如:

int[] a = {1,2,3,4};
        int[] b = {1,2,3,4};
        System.out.println(Arrays.equals(a,b));

返回值:true

2.sort(数组名);对数组进行升序排列。 如

int[] a = {100,20,345,4,454};
        Arrays.sort(a);
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+"\t");
        }

返回值:4 20 100 345 454

  1. toString(); 将数组转变为字符串。 如:

    int[] a = {1,2,3,4,5,6};
        System.out.println(a);
        //输出数组所在地址
        System.out.println(Arrays.toString(a));
    

    返回值:[1, 2, 3, 4, 5, 6]

4. 掌握冒泡排序[难点-算法]

冒泡排序的基本思想是:对比相邻的元素值,如果满足条件就交换元素值,把较小的元素值移动到数组前面,把大的元素值移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部。

伟大的老司机说:

外层循环控制行数 内层循环控制每行的内容。

外层循环控制轮数,内层循环控制每轮的比较。

// 定义一个数组 存储原始数据
int[] arr = {99,77,88,92,30,22,90,78};

// 冒泡排序:外层循环n-1   内层循环n-1-i
// 外层循环控制轮数 规律:5个数据则比较4轮  6个数据则比较5轮
for(int i = 0; i < arr.length-1; i++) {
    // 内层循环控制每轮的比较 规律:5个数据第一轮比较4次  6个数据第一轮比较5次
    for(int j = 0; j < arr.length-1-i; 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));

我的小可爱们,这篇笔记有些赶,并不是很详细和严谨
这都是我自己的过失,记完笔记没有及时的整理并上穿
我们的老司机今天要检查,希望他不会抽到我
哦吼,哈哈哈哈哈哈
我深刻的 检讨,老司机讲完我会迅速的整理并上传
为了我的小可爱,为了我的粉丝(虽然粉丝是同学互粉,哈哈哈哈哈)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值