Java基础语法——数组概念、数组内存图解(一个数组、二个数组)及二元数组的应用

news2025/1/11 23:36:23

目录

数组概述

数组定义格式

数组概念

数组的定义格式

数组的初始化

数组初始化概述

数组的初始化方式

Java中的内存分配

Java中一个数组的内存图解

 Java中二个数组的内存图解

 两个数组指向同一个地址的内存图解

 数组操作中两个常见的小问题

二维数组 

二维数组概述

二维数组定义格式

数组概述

需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后再进行操作,这样做会显得很麻烦。为了解决这种问题,Java提供了数组供我们使用。

那么数组到底是什么呢?有什么特点呢?

  • 数组是存储多个变量(元素)的东西(容器)
  • 这多个变量的数据类型要一致

数组定义格式

数组概念

        –数组是存储同一种数据类型多个元素的容器。

        –数组既可以存储基本数据类型,也可以存储引用数据类型。

数组的定义格式

        –格式1:数据类型[] 数组名;

        –格式2:数据类型 数组名[];

        –注意:这两种定义做完了,数组中是没有元素值的。如何对数组的元素进行初始化呢?

数组的初始化

数组初始化概述

        –Java中的数组必须先初始化,然后才能使用。

        –所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

数组的初始化方式

        –动态初始化:初始化时只指定数组长度,由系统为数组分配初始值,初始值都为0。

                (1)格式:数据类型[] 数组名 = new 数据类型[数组长度];

                (2)数组长度其实就是数组中元素的个数。

                (3)举例:

                        •int[] arr = new int[3];

                        •解释:定义了一个int类型的数组,这个数组中可以存放3int类型的值。

​
package com.demo01;

public class ArrayDemo0 {

	public static void main(String[] args) {
		
		// 这样程序比较麻烦
		//int zhangsan = 10000;
		//int lisi = 8000;
		//.......
		
		// 整型数组工资
		int[] gongzi = new int[80];
		int gongzi1[] = new int[]{10000,8000,7500,11000};
	}

}

​

        –静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

                (1)格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};

                (2)举例:

                        •int[] arr = new int[]{1,2,3};

                        •解释:定义了一个int类型的数组,这个数组中可以存放3int类型的值,并且值分别是1,2,3

                •其实这种写法还有一个简化的写法

                –int[] arr = {1,2,3};

package com.demo02;
/*
 * 静态初始化的格式
  (1)格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};

                (2)举例:

                        •int[] arr = new int[]{1,2,3};

                        •解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。

                •其实这种写法还有一个简化的写法

                –int[] arr = {1,2,3};
 */
public class ArrayDemo {
	public static void main(String[] args) {
		//定义数组
		//int[] arr = new int[]{1,2,3};
		int[] arr = {1,2,3};
		
		//输出
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
	}
}

Java中的内存分配

        Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

        –栈 存储局部变量

        –堆 存储new出来的东西

        –方法区 (面向对象进阶讲)

        –本地方法区 (和系统相关)

        –寄存器 (CPU使用)

Java中一个数组的内存图解

——定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。我们定义一个名称为arr的数组,长度为:3,假设输出地址为:001,我们可知局部变量在栈,new新建的对象在堆,arr的地址指向new创建对象的地址,动态分配的初始值为:0 0 0,arr[0]=0;arr[1]=0;arr[2]=0;我们给数组重新赋值:arr[0]=1;arr[1]=2;arr[2]=3;

代码演示:

package com.demo01;

/*
 * 数组:存储同一种数据类型的多个元素的容器
 * 
 * 定义格式:
 * 		A:数据类型[]数组名;	(推荐的方式)
 * 		B:数据类型 数组名[];
 * 
 * 		举例:
 * 			int[] arr; 定义了一个int类型的数组名,数组名是arr
 * 			int arr[]; 定义了一个int类型的变量,变量名是arr数组
 * 
 * 数组初始化
 * A:所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
 * B:数组的初始化方式
 * 	a:动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
 * 	b:静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

 * 动态初始化
 * 		int [] arr = new int [30];
 */
public class ArrayDemo {
	public static void main(String[] args) {
		//  		int [] arr = new int [30];
		int[] arr = new int[3];
		/*
		 * 左边
		 * 		int:说明数组的元素类型是 int 类型
		 * 		[]:这是一个数组
		 * 		arr:数组的名称
		 * 
		 * 右边
		 * 		new:Ϊ为数组申请内存分配,开辟空间
		 * 		int:说明数组中的元素类型是int类型
		 * 		[]:说明这是一个数组
		 * 		3:数组长度
		 */
		
		//输出数组名字
		System.out.println("arr:"+arr); //arr:[I@626b2d4a  内存地址
		//我们获取数组的地址是没有意义的,我要的是数组中的元素值,该怎么办呢?
		//不用担心,Java已经帮我们想好了
		//其实数组中每个元素都是有编号的,编号从0开始,最大的编号是数组长度-1
		//ͨ通过数组名和编号的配合使用我们就可以获取指定编号的元素值ֵ
		//这个编号的专业叫法:索引
		//访问格式:数组名[索引]
		System.out.println("*****************************");
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		System.out.println("*****************************");
		//给数组赋值
		arr[0] = 1;
		arr[1] = 2;
		arr[2] = 3;
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
	}
}

 Java中二个数组的内存图解

 ——定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。定义两个数组,分别是arr和arr2,长度为:2和3,假设arr输出地址为:001,arr2输出地址为:002,我们可知局部变量在栈,new新建的对象在堆,arr的地址指向new创建对象的地址,动态分配的初始值为:0 0 ,arr[0]=0;arr[1]=0;我们给数组重新赋值:arr[0]=0;arr[1]=1;arr2的地址指向new创建对象的地址,动态分配的初始值为:0 0 0,arr[0]=0;arr[1]=0;arr[2]=0;我们给数组重新赋值:arr[0]=0;arr[1]=1;arr[2]=2;

代码演示:

package com.demo01;
/*
 * 定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。
 */
public class ArrayTest2 {
	public static void main(String[] args) {
		//定义两个数组
		int[] arr = new int[2];
		int[] arr2 = new int[3];
		
		//分别输出数组名及元素
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		
		System.out.println(arr2);
		System.out.println(arr2[0]);
		System.out.println(arr2[1]);
		System.out.println(arr2[2]);
		System.out.println("--------------------");
		
		//然后分别给数组中的元素赋值ظ�ֵ
		arr[1] = 100;
		
		arr2[0] = 200;
		arr2[2] = 300;
		
		//再次输出数组名及元素ٴ
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		
		System.out.println(arr2);
		System.out.println(arr2[0]);
		System.out.println(arr2[1]);
		System.out.println(arr2[2]);
	}
}

 两个数组指向同一个地址的内存图解

—— 定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素,首先我们定义一个arr数组,给arr数组赋值,arr[0]=100;arr[1]=200;arr[2]=300;然后把第一个数组的地址赋值给第二个数组,第二个数组的地址和第一个数组的地址是一样的,他们的值也是一样的,之后给第二个数组赋值,他们的地址都指向同一个地址,他们重新赋值后,他们值应该都是新的重新赋值的值。

代码演示:

package com.demo01;
/*
 * 定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素
 */
public class ArrayTest3 {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = new int[3];
		//赋值ֵ
		arr[0] = 100;
		arr[1] = 200;
		arr[2] = 300;
		//输出
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		System.out.println("-----------------------------");
		//然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组
		int[] arr2 = arr;
		//给第二个数组赋值ֵ
		arr2[0] = 111;
		arr2[1] = 222;
		arr2[2] = 333;
		
		//再次输出两个数组的名称及元素
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		System.out.println("-----------------------------");
		System.out.println(arr2);
		System.out.println(arr2[0]);
		System.out.println(arr2[1]);
		System.out.println(arr2[2]);
		System.out.println("-----------------------------");
	}
}

 数组操作中两个常见的小问题

数组索引越界

        –ArrayIndexOutOfBoundsException

        –访问到了数组中的不存在的索引时发生。

空指针异常

        NullPointerException

        数组引用没有指向对象,却在操作对象中的元素时。

package com.demo03;

/*
 数组索引越界

        –ArrayIndexOutOfBoundsException

        –访问到了数组中的不存在的索引时发生。

空指针异常

        NullPointerException

        数组引用没有指向对象,却在操作对象中的元素时。
 */
public class ArrayDemo {
		public static void main(String[] args) {
			//定义数组
			int[] arr = {1,2,3};
			
			//访问数组元素
			System.out.println(arr[3]);
			
			//引用类型:类,接口,数组
			//常量:空常量null,是可以赋值给引用类型的
			arr = null;
			System.out.println(arr[1]);
		}
}

数组练习: 

  1. 数组遍历(依次输出数组中的每一个元素)获取数值长度:数值名.length
  2. 数组获取最值(获取数组中的最大值最小值)

练习1:数组遍历(依次输出数组中的每一个元素)获取数值长度:数值名.length

package com.demo04;
/*
 * 数组遍历(依次输出数组中的每一个元素)–获取数值长度:数值名.length
 */
public class ArrayTest {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = {11,22,33,44,55};
		
		//输出
		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]);
		System.out.println("--------");
		
		//ͨ通过for循环实现获取数据0-4
		for(int x=0; x<5; x++) {
			System.out.println(arr[x]);
		}
		System.out.println("--------");
		
		//Ϊ为了解决我们去数数组中元素的个数,数组提供了一个属性:length
		//用于获取数组元素中的个数
		//格式:数组名.length
		System.out.println("数组共有"+arr.length+"个");
		System.out.println("--------");
		
		for(int x=0; x<arr.length; x++) {
			System.out.println(arr[x]);
		}
	}
}

练习2: 数组获取最值(获取数组中的最大值最小值)

package com.demo04;
/*
 * 数组获取最值(获取数组中的最大值最小值)
 */
public class ArrayTest2 {
	public static void main(String[] args) {
		//定义数组
		int[] arr = {12,45,98,73,60};
		
		//定义参照物
		int max = arr[0];
		
		//遍历数组,获取除了0以外的元素,进行比较
		for(int x=1; x<arr.length; x++) {
			if(arr[x] > max) {
				max = arr[x];
			}
		}
		
		//输出max即可
		System.out.println("max:"+max);
	}
}

二维数组 

二维数组概述

        –一年级有6个班,可以用数组来存储。一个班有30个学生,这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。

        –由此可见:其实二维数组其实就是一个元素为一维数组的数组。

二维数组定义格式

定义格式

        –数据类型[][] 数组名;

        –数据类型 数组名[][]; 不推荐

        –数据类型[] 数组名[]; 不推荐

package com.demo05;

public class ArrayArrayDemo0 {

	public static void main(String[] args) {
		int[][] a = new int[6][30];
		int[]   a1[] = new int[6][30];
		
		System.out.print("1");
		System.out.println();
		System.out.print("2");
	}

}

初始化方式

        –数据类型[][] 变量名 = new 数据类型[m][n];

        –数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};

                •简化版格式:数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};

二维数组的操作

        •二维数组遍历

                –int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

package com.demo05;

public class ArrayArrayDemo {
	public static void main(String[] args) {
		//数据类型[][]数组名={{元素…},{元素…},{元素…}};
		int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
		
		System.out.println(arr); 
		System.out.println(arr[0]); 
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		
		//如何获取二元数组的元素呢?
		System.out.println(arr[0][0]);
		System.out.println(arr[1][1]);
		System.out.println(arr[2][2]);
		System.out.println(arr[2][1]);
	}
}

 

练习:二维数组的遍历

package com.demo05;

public class ArrayArrayTest {
	public static void main(String[] args) {
		//二维数组遍历
		int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
		

		for(int i = 0;i<arr.length;i++) {
			for(int j = 0;j<arr[i].length;j++) {
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
	}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++11 标准模板(STL)(std::forward_list)(十一)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

前端架构处理Cookie、Session、Token

1. Cookie Cookie 总是保存在客户端中。按在客户端中的存储位置&#xff0c;可分为内存 Cookie 和硬盘 Cookie。 内存 Cookie 由浏览器维护&#xff0c;保存在内存中&#xff0c;浏览器关闭后就消失了&#xff0c;其存在时间是短暂的。硬盘 Cookie 保存在硬盘里&#xff0c;…

Spring Boot、Spring MVC热部署

一、相关概述 JVM能够识别的是字节码.class文件每次重新运行都是一个重新编译的过程&#xff0c;也就是说会生成新的target字节码文件&#xff1b;但是每次修改了代码之后也必须要重新运行&#xff0c;这样比较麻烦。热部署就能较好地解决该问题&#xff0c;直接刷新页面就可以…

(22)go-micro微服务kibana使用

文章目录一 kibana介绍二 Kibana主要功能三 Kibana侧边栏四 Kibana安装1.拉取镜像2.运行命令3.查看是否运行五 Kibana使用六 Kibana图形化界面七 最后一 kibana介绍 Kibana &#xff1a;是一个开源的分析和可视化平台&#xff0c;旨在与 Elasticsearch 合作。Kibana 提供搜索、…

初识Nonebot2

文章目录什么是nonebot2&#xff1f;机器人工作流程WebSocket协议OneBot标准Nonebot2框架工作路径什么是nonebot2&#xff1f; 关于NoneBot2&#xff0c;我们先来引用一下官方文档的描述 NoneBot2是一个可扩展的 Python 异步机器人框架&#xff0c;它会对机器人收到的事件进行…

创建进度条 tqdm模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 创建进度条 tqdm模块 选择题 以下python代码最后输出错误的一项是? from tqdm import tqdm import time text{loss:0.2,learn:0.8} print(【开始执行】) for i in tqdm(range(50)…

python图像处理(图像缩放)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像缩放也是isp处理的一个基本功能。现在的camera像素越来越大,但是显示设备的分辨率是一定的,如果想把图像显示在显示器或者lcd上面,那就要符合对应显示设备的分辨率。一般来说…

【数据结构与算法理论知识点】5、图与贪心算法

5、图与贪心算法 逻辑结构 5.1、图的定义和术语 图&#xff1a;Graph(V,E) V:顶点&#xff08;数据元素&#xff09;的有穷非空集合&#xff1b; E:边的有穷集合。 **无向图:**每条边都是无方向的 有向图:每条边都是有方向的 完全图:任意两个点都有一条边相连 稀疏图:有很…

SSM 农产品销售管理系统

SSM 农产品销售管理系统 SSM 农产品销售管理系统 功能介绍 首页 用户登录注册 图片轮播 最新上架 农产资讯 产品商城 产品详情 在线留言 加入购物车 提交购买 评论 收藏 系统简介 系统公告 关于我们 友情链接 后台管理 登录 系统用户管理 修改密码 用户权限管理 产品信息管理…

Hadoop基础之《(4)—Yarn概述》

一、什么是Yarn YARN&#xff08;Yet Another Resource Negotiator&#xff09;&#xff0c;简称YARN&#xff0c;另一种资源协调者&#xff0c;是Hadoop的资源管理器。 二、Yarn的组成 Yarn有两个核心组件&#xff0c;ResourceManager和NodeManager。 1、ResourceManager&am…

UE Operation File [ Read / Write ] DTOperateFile 插件说明

蓝图直接操作文件的功能节点 可以获取文件基本信息以及读写文件 目录 1. File Exists 2. File Size 3. File Delete 4. File Is Read Only 5. File Move 6. File Save By String 7. File Save By Array String 8. File Save By Array Binary 9. File Append By Strin…

Jenkins(一):什么是Jenkins?

目录 一、Jenkins是什么&#xff1f; 二、安装步骤 1.访问官网&#xff0c;下载安装包 2.解锁Jenkins 3.设置Jenkins的工作目录&#xff08;可选&#xff09; 总结 前言 近期在研究自动化部署&#xff0c;在这里对Jenkins做个笔记。 一、Jenkins是什么&#xff1f; Jenk…

数据挖掘,计算机网络、操作系统刷题笔记36

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记36 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…

泊松过程与排队论

全国同理:随机过程随机会过 ......唉 你说热统,他为什么要搭配着随机过程一起学 ......唉 你说数模比赛 为什么不能白送一个奖牌小摘要泊松过程泊松过程来到间隔与等待时间的分布来到时刻的条件分布M/G/1 忙期非齐次泊松过程复合泊松过程条件泊松过程排队系统输入常见的输入分布…

Python eval()和exec()函数详解

eval() 和 exec() 函数都属于 Python 的内置函数&#xff0c;由于这两个函数在功能和用法方面都有相似之处&#xff0c;所以将它们放到一节进行介绍。eval() 和 exec() 函数的功能是相似的&#xff0c;都可以执行一个字符串形式的 Python 代码&#xff08;代码以字符串的形式提…

Elasticsearch:深入理解 Elasticsearch 查询:过滤器查询 vs 全文搜索

如果我必须用一句话来描述 Elasticsearch&#xff0c;我会这样说&#xff1a; 当搜索遇到大规模分析时&#xff08;近乎实时&#xff09; Elasticsearch 是目前最受欢迎的 10 大开源技术之一。 公平地说&#xff0c;它包含许多本身并不独特的关键功能&#xff0c;但是&#xff…

ARP渗透与攻防(八)之ARP攻击防御

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP渗透与攻防(六)之限制网速攻击 ARP渗透与攻防(七)之Ettercap Dns劫持 ARP攻击防御 …

【Linux】调试器-gdb使用

一、背景 程序的发布方式有两种&#xff0c;debug模式和release模式Linux gcc/g出来的二进制程序&#xff0c;默认是release模式要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 当我们不加 -g 选项的时候&#xff0c;我们生成的可执行文件的相关符…

python刷题-关于分词词频、数组排序,数组插数的题

目录标题1、对多种日期格式进行标准化2、实现英文分词计算词频-re.split、value_counts()3、中文文章分词4、统计《鹿鼎记》小说中的人名5、用1234能组成多少个互不相同且无重复数字的三位数6、两个矩阵相加7、用逗号分隔列表-join8、在升序的序列中插入一个数---重要9、对任意…

带滤波器的PID控制仿真-3(Simulink仿真)

在带滤波器的PID控制仿真-2的基础上对算例进行Simulink仿真。控制器采用积分分离PI控制&#xff0c;即当误差的绝对值小于等于0.80时&#xff0c;加入积分控制&#xff0c;仿真结果如图1和2所示。图1 加入滤波器时PID控制阶跃响应图2 无滤波器时PID控制阶跃响应初始化程序&…