【JAVA入门】Day03 - 数组

【JAVA入门】Day03 - 数组


文章目录

  • 【JAVA入门】Day03 - 数组
  • 一、数组的概念
  • 二、数组的定义
    • 2.1 数组的静态初始化
    • 2.2 数组的地址值
    • 2.3 数组元素的访问
    • 2.4 数组遍历
    • 2.5 数组的动态初始化
    • 2.6 数组的常见操作
    • 2.7 数组的内存分配
      • 2.7.1 Java内存分配
      • 2.7.2 数组的内存图


一、数组的概念

        数组就是一种容器,可以用来存储同种数据类型的多个值。
        数组在存储数据时,存在隐式转换现象。例如:int 类型数组可以存储(byte short int)这几种类型,因为 int 相比另外二者更高级,在存储时会自动转换为 int 型。同样地,如果把 int 型存入 double 数组,一样会转换为 double 类型存储,double 类型可以存储(byte short int long float double)。

二、数组的定义

        数组有两种定义方法:

  • int [ ] array
  • int array[ ]

int是数据类型,[ ]表示是数组,array是数组名。

2.1 数组的静态初始化

在内存中,为数组提前开辟好空间,并将数据存入容器中。

  • 完整格式:
    数据类型[ ] 数组名 = new 数据类型[ ] { 元素1, 元素2, 元素3…};
  • 例:
int[] array = new int[]{ 11, 22, 33 };
  • 简化格式:
    数据类型[ ] 数组名 = { 元素1, 元素2, 元素3…};
  • 例:
int[] array = { 11, 22, 33 };

2.2 数组的地址值

int[] arr = {1,2,3,4,5};
System.out.println(arr);  //[I@6d03e736

        这里直接输出,用数组名作参数,返回的是数组的地址值,表示数组在内存中的位置。[ 表示当前是一个数组,I 表示这是一个 int 型数组,@是一个间隔符号,6d03e736 是数组真正的地址值(十六进制)。

2.3 数组元素的访问

        利用索引来访问数组某个元素。
        格式:数组名[索引];
例:

int[] arr = {1, 2, 3, 4, 5};
int number = arr[0];
System.out.println(number); //1
System.out.println(arr[1]); //2

        利用索引也可以把数据存储到数组中:

arr[0] = 100;
System.out.println(arr[0]); //100

2.4 数组遍历

        数组遍历,就是把数组中所有的内容都取出来。

//1.定义数组
int[] arr = {1, 2, 3, 4, 5};
//2.获取数组里面所有的元素
for(i = 0; i < 5; i++;) {
	System.out.println(arr[i]); //1 2 3 4 5
}
//3.如果不知道数组长度,可以用length
for(i = 0; i < arr.length; i++) {
	System.out.println(arr[i]); //1 2 3 4 5
}

【例1】遍历数组并求和

//1.定义一个数组,并添加数据1,2,3,4,5
int[] arr = {1, 2, 3, 4, 5};
//2.遍历数组得到每一个数据,累加求和
int sum = 0;  //求和变量
for(int i = 0; i < arr.length; i++) {
	sum = sum + arr[i];
}

【例2】统计数组元素个数

//统计数组中能被3整除的数组有多少个
int[] arr = {1,2,3,4,5,6,7,8,9,10};
count = 0;
for(int i = 0; i < arr.length; i++) {
	if(arr[i] % 3 == 0){
		System.out.println(arr[i]);
		count++;
	}
}
System.out.println("数组中能被3整除的数字有" + count + "个");

【例3】变化数组
定义一个数组,遍历之,如果是奇数,当前数字乘2,如果是偶数,当前数字变为二分之一。

int[] arr = {1,2,3,4,5,6,7,8,9,10};
for(int i = 0; i < arr.length; i++) {
	if(arr[i] % 2 == 0) {
		arr[i] = arr[i] / 2;
	}
	else {
		arr[i] = arr[i] * 2;
	}
	System.out.println(arr[i]);
}

2.5 数组的动态初始化

        动态初始化时,只指定数组长度,由系统为数组分配初始值。
格式:数据类型[ ] 数组名 = new 数据类型[数组长度];
例:

int[] arr = new int[3];

        动态初始化后,可以直接给新增的空间位置赋值,即填入元素。

//初始化一个字符串数组
String[] arr = new String[3];
arr[0] = "xiaozhan";
arr[1] = "dingzhen";

        获取元素时,除了已赋值的元素,还可以获取未赋值的空位置,这个位置上存储的值应为默认的初始值。

System.out.println(arr[0]);  //xiaozhan
System.out.println(arr[1]);  //dingzhen
System.out.println(arr[2]);  //null(初始值)

        不同数据类型的数组初始化后有不同的初始值:

//整数类型:0
//小数类型:0.0
//字符类型:'/u0000' 即空格
//布尔类型:false
//引用类型:null (String也是引用类型)

2.6 数组的常见操作

【例1】求最值。
需求:已知数组元素为 {33,5,22,44,55}

int[] arr = {33,5,22,44,55};
int max = arr[0];
for(int i = 0; i < arr.length; i++) {
	if(arr[i] >= max) {
    	max = arr[i];
    }
}
System.out.println(max);
  • 注意,max 的初始值一定要是数组中存在的值,这样才不容易出错。

【例2】遍历数组求和。
需求:生成10个1~100之间的随机数存入数组。然后求出数组的和、平均数,统计多少个元素比平均数小,最后打印数组。

import java.util.Random;

int[] arr = new int[10];
        Random r = new Random();

        for(int i = 0; i < arr.length; i++) {
            //每循环一次,就生成一个新的随机数
            int number = r.nextInt(100) + 1;
            //把生成的随机数添加到数组当中
            arr[i] = number;
        }

        //遍历数组求和
        int sum = 0;
        for(int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println("数组中所有数的和为:"+ sum);

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

        //统计有多少个数据比平均值小
        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.print(arr[i] + " ");

【例3】交换数组中的数据
需求:定义一个数组,存入1,2,3,4,5.按照要求交换索引对应的元素。
交换前:1,2,3,4,5
交换后,5,2,3,4,1

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.print(arr[i]+" ");
}

需求变式:将数组倒置。

int[] arr = {1,2,3,4,5};
int temp = arr[0];

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

【例4】打乱数组顺序。
需求:给定一个数组{1,2,3,4,5},要求打乱这五个数字的顺序。
思路:可以利用 Random 把索引打乱,数组元素自然也会打乱。

int[] arr = {1,2,3,4,5};
//索引范围:0 1 2 3 4
Random r = new Random();
//从0索引开始,打乱数据的顺序
for(int i = 0; i < arr.length; i++) {
	int randomIndex = r.nextInt(arr.length);//随机0~4,括号里要填5,这里arr.length就是5,这样写更泛用
	int temp = arr[i];
	arr[i] = arr[randomIndex];
	arr[randomIndex] = temp;
}
for(int i = 0; i < arr.length; i++) {
	System.out.print(arr[i] + " ");
}

2.7 数组的内存分配

2.7.1 Java内存分配

Java的虚拟机(JVM)在运行时也会占用一部分计算机的内存空间,而 JVM 有更精细的规划:
在这里插入图片描述
注:从 JDK8 开始,“方法区”被移除,改换“元空间”,把原方法区多种功能进行拆分,一部分放到了中,一部分放入了元空间中。

各区域用途

  • 栈                      方法运行时使用的内存,比如 main 方法运行,进入方法栈中执行。
  • 堆                      存储对象或者数组,new 创建的东西,都存储在堆内存。
  • 方法区               存储可以运行的 class 文件。
  • 本地方法栈        JVM 在使用操作系统功能的时候使用。
  • 寄存器               给CPU使用。

2.7.2 数组的内存图

数组在内存中的存储同时用到了栈空间和堆空间,具体存储方式如下:

public static void main(String[] args) {
	int[] arr = new int[2];
	
	sout(arr);
	sout(arr[0]);
	sout(arr[1]);
	
	arr[0] = 11;
	arr[1] = 22;
	sout(arr[0]); 

	sout("-----------------");
	int[] arr2 = {33, 44, 55};
	sout(arr2);
	sout(arr2[0]);
	sout(arr2[1]);
	sout(arr2[2]);
}

在这里插入图片描述
        如图所示,创建一个二元数组,在堆中开辟了一处空间,存放了数组长度、数组元素和索引,然后将这块堆空间的地址值记录下来放入栈中,代表数组 arr 的地址。通过寻访栈内存中的数组地址值,可以找到堆内存中的这块空间,从而找到数组的数据存储所在。
        下图中我们又创建了一个数组 arr2,这次直接将其初始化,同样地也在堆空间里开辟了一块空间存储,然后将这块空间的地址值存储在栈空间。在访问时,先访问栈空间,再根据栈空间的地址值访问堆空间,找到数组内容。
在这里插入图片描述
在这里插入图片描述
        除了以上那种基本的存储方法,还存在两个数组指向同一个空间的内存这样的情况。

public static void main(String[] args) {
	int[] arr1 = {11, 22};
	int[] arr2 = arr1;

	sout(arr1[0]);
	sout(arr2[0]);
	
	arr2[0] = 33;

	sout(arr1[0]);
	sout(arr2[0]);
}

        根据上方的代码,显然 arr1 和 arr2 是同一个数组。在创建 arr1 数组后,仍是开辟了一块堆空间和一块栈空间。
在这里插入图片描述
        而在创建 arr2 数组后,指向了 arr1 ,它们存储的是同一个的地址值。
在这里插入图片描述
        因此它们指向的一定是同一块堆空间,这样就只开辟了一块堆空间。在寻址时,找的自然也是同一块堆空间。因此,我们通过 arr2[0] = 33;修改了堆空间索引为 0 的位置上的值:
在这里插入图片描述
此时 arr1[0] 位置上的值,也会发生改变。因此:

sout(arr1[0]);
sout(arr2[0]);

        输出的值应为一样的,都是33。这是 JAVA 内存存储方式导致的。在使用时,只需要默认认为 arr1 和 arr2 是同一个数组即可,修改 arr1 ,arr2 也会发生变化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

234234235

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

周刊是聪明人筛选优质知识的聪明手段!

这是一个信息过载的时代&#xff0c;也是一个信息匮乏的时代。 这种矛盾的现象在 Python 编程语言上的表现非常明显。 它是常年高居编程语言排行榜的最流行语言之一&#xff0c;在国外发展得如火如荼&#xff0c;开发者、项目、文章、播客、会议活动等相关信息如海如潮。 但…

对XYctf的一些总结

对XYctf的一些总结 WEB 1.http请求头字段 此次比赛中出现的&#xff1a; X-Forwarded-For/Client-ip&#xff1a;修改来源ip via&#xff1a;修改代理服务器 还有一些常见的字段&#xff1a; GET&#xff1a;此方法用于请求指定的资源。GET请求应该安全且幂等&#xff0c…

QTday1

1、QT思维导图 2、自由发挥应用场景&#xff0c;实现登录 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->resize(642,493);this->setFixedSize(642,493);this->setWindowIcon(QIcon("D:/QTText/pictrue/qq.png…

Windows系统本地部署Net2FTP文件管理网站并实现远程连接上传下载

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

Vue入门到关门之Vue高级用法

一、在vue项目中使用ref属性 ref 属性是 Vue.js 中用于获取对 DOM 元素或组件实例的引用的属性。通过在普通标签上或组件上添加 ref 属性&#xff0c;我们可以在 JavaScript 代码中使用 this.$refs.xxx 来访问对应的 DOM 元素或组件实例。 放在普通标签上&#xff0c;通过 th…

CRE-LLM:告别复杂特征工程,直接关系抽取

CRE-LLM&#xff1a;告别复杂特征工程&#xff0c;直接关系抽取 提出背景CRE-LLM 宏观分析CRE-LLM 微观分析1. 构建指令集&#xff08;Instruction Design&#xff09;2. 高效微调大型语言模型&#xff08;Efficient Fine-Tuning on LLMs&#xff09;3. 方法讨论&#xff08;Di…

数据结构——链表专题2

文章目录 一、返回倒数第k 个节点二、链表的回文结构三、相交链表 一、返回倒数第k 个节点 原题链接&#xff1a;返回倒数第k 个节点 利用快慢指针的方法&#xff1a;先让fast走k步&#xff0c;然后fast和slow一起走&#xff0c;直到fast为空&#xff0c;最后slow指向的结点就…

智慧工地)智慧工地标准化方案(107页)

2.2 设计思路 对于某某智慧工地管理系统的建设&#xff0c;绝不是对各个子系统进行简单堆砌&#xff0c;而是在满足各子系统功能的基础上&#xff0c;寻求内部各子系统之间、与外部其它智能化系统之间的完美结合。系统主要依托于智慧工地管理平台&#xff0c;来实现对众多子系统…

动态规划算法:路径问题

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于这种「路径类」的问题&#xff0c;我们的状态表⽰⼀般有两种形式&#xff1a; i. 从 [i, j] 位置出发&#xff0c;巴拉巴拉&#xff1b; ii. 从起始位置出…

《自动机理论、语言和计算导论》阅读笔记:p428-p525

《自动机理论、语言和计算导论》学习第 14 天&#xff0c;p428-p525总结&#xff0c;总计 98 页。 一、技术总结 1.Kruskal’s algorithm(克鲁斯克尔算法) 2.NP-Complete Problems p434, We say L is NP-complete if the following statements are true about L: (1)L is …

AI预测体彩排3第3套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多&#xff0c;回来比较晚了&#xff0c;趁着还未开奖&#xff0c;赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日排列3预测结果 6-7码定位方案如下&#xff1a; 百位&#xff1a;2、3、1、5、0、6 十位&#xff1a;4、3、6、8、0、9 个位&#xf…

软件公司为什么很少接二开项目?

前言 很多企业由于原有项目还在继续运营&#xff0c;但原有技术公司不想再合作或者不想再维持整个技术团队等原因&#xff0c;就需要找一个新的软件公司继续维护原有软件系统。但是一接触往往发现很多软件公司拒绝接手第三方的软件项目&#xff0c;这究竟是什么原因呢&#xff…

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;东莞六淳智能科技股份有限公司&#xff08;下称“六淳科技”&#xff09;及其保荐人撤回上市申请材料。因此&#xff0c;深圳证券交易所决定终止对其首次公开发行…

暂不要创业,谁创业谁死

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 卢松松视频号会员专区有个会员提问&#xff0c;我感觉挺有代表性的&#xff0c;写成公众号文章&#xff0c;分享给大家&#xff1a; 松哥&#xff0c;我花了太多时间在思考上&#xff0c;而一直没有行动&#xff…

ESG视角下的多期DID构建(2009-2022年)4.5万+数据

随着ESG信息越来越受到重视&#xff0c;一些第三方评级机构开始推出ESG评级产品&#xff0c;目前在第三方数据库能够查到华证、富时罗素、商道融绿、社会价值投资联盟以及Wind自有的ESG评级数据等。其中&#xff0c;商道融绿是中国最早发布ESG评级数据的机构&#xff0c;也是国…

一文读懂Vue生命周期(Vue2)

一文读懂Vue生命周期&#xff08;Vue2&#xff09; 目录 一文读懂Vue生命周期&#xff08;Vue2&#xff09;1 前言2 Vue生命周期2.1 基本生命周期2.1.1 8个生命周期2.1.2 案例 2.2 组件生命周期2.2.1 父子生命周期2.2.2 案例 2.3 keep-alive生命周期2.3.1 案例 2.4 其他 3 总结…

快速入门!学习鸿蒙App开发的终极指南!

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款分布式操作系统&#xff0c;旨在为不同设备提供统一的操作体验。鸿蒙App开发可以让应用程序在多个设备上实现流畅运行。本文将介绍鸿蒙App开发的终极指南&#xff0c;帮助您快速入门。 开发环境搭建 鸿蒙App开发过程需要…

VS Code 远程连接 SSH 服务器

文章目录 一、安装 Remote - SSH 扩展并连接远程主机二、免密连接远程主机1. 生成 SSH 密钥对2. 将公钥复制到远程服务器3. 配置 SSH 客服端4. 连接测试 随着技术的不断迭代更新&#xff0c;在 Linux 系统中使用 Vim、nano 等基于 Shell 终端的编辑器&#xff08;我曾经也是个 …

VueComponent构造函数

//创建school组件——注册给谁 在谁的结构上写const school Vue.extend({name: school,//开发者工具的显示template: <div><h2>学校名称&#xff1a;{{schoolName}}</h2><h2>学校地址&#xff1a;{{adress}}</h2> </div>,//结构data() {…