【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 也会发生变化。

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

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

相关文章

【数据结构】--- 深入剖析二叉树(中篇)--- 认识堆堆排序Topk

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 数据结构之旅 文章目录 &#x1f3e0; 初识堆 &#x1f4d2; 堆的概念 &#x1f4d2; 堆的性质 &#x1f3e0; 向上调整算法 && 向下调整算…

【云原生】Pod 的生命周期(一)

【云原生】Pod 的生命周期&#xff08;一&#xff09;【云原生】Pod 的生命周期&#xff08;二&#xff09; Pod 的生命周期&#xff08;一&#xff09; 1.Pod 生命期2.Pod 阶段3.容器状态3.1 Waiting &#xff08;等待&#xff09;3.2 Running&#xff08;运行中&#xff09;3…

《Python编程从入门到实践》day20

#尝试在python3.11文件夹和pycharm中site-packages文件夹中安装&#xff0c;最终在scripts文件夹中新建py文件成功导入pygame运行程序 #今日知识点学习 import sysimport pygameclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(…

memory consistency

memory consistency model 定义了对于programmer和implementor来说&#xff0c;访问shared memory system的行为&#xff1b; 对于programmer而言&#xff0c;他知道期望值是什么&#xff0c; 知道会返回什么样的数据&#xff1b;&#xff1b; 对于implementro而言&#xff0c;…

微信小程序原生代码实现小鱼早晚安打卡小程序

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 小鱼早晚安打卡小程序&#xff1a;开启健康生活&#xff0c;共享正能量 在这个快节奏的时代&#xff0c;我们常常被各种琐事和压力所困扰&#xff0c;以至于忽略了对健康生活方式的追求。然…

【探秘地球宝藏】矿产资源知多少?

当我们仰望高楼林立的城市&#xff0c;乘坐便捷的交通工具&#xff0c;享受各种现代生活的便利时&#xff0c;你是否曾想过这一切背后的支撑力量&#xff1f;答案就藏在我们脚下——矿产资源&#xff0c;这些大自然赋予的宝贵财富&#xff0c;正是现代社会发展的基石。今天&…

OpenHarmony 实战开发——ABI

OpenHarmony系统支持丰富的设备形态&#xff0c;支持多种架构指令集&#xff0c;支持多种操作系统内核&#xff1b;为了应用在各种OpenHarmony设备上的兼容性&#xff0c;本文定义了"OHOS" ABI&#xff08;Application Binary Interface&#xff09;的基础标准&#…

idea中取消自动导包顺序

1、取消自动导入 2、取消导包顺序设置

Python学习笔记------处理数据和生成折线图

给定数据&#xff1a; jsonp_1629344292311_69436({"status":0,"msg":"success","data":[{"name":"美国","trend":{"updateDate":["2.22","2.23","2.24",&qu…

奶爸预备 |《P.E.T.父母效能训练:让亲子沟通如此高效而简单:21世纪版》 / 托马斯·戈登——读书笔记

目录 引出致中国读者译序前言第1章 父母总是被指责&#xff0c;而非受训练第2章 父母是人&#xff0c;不是神第3章 如何听&#xff0c;孩子才会说&#xff1a;接纳性语言第4章 让积极倾听发挥作用第5章 如何倾听不会说话的婴幼儿第6章 如何听&#xff0c;孩子才肯听第8章 通过改…

保研面试408复习 3——操作系统

文章目录 1、操作系统一、进程有哪几种状态&#xff0c;状态之间的转换、二、调度策略a.处理机调度分为三级&#xff1a;b.调度算法 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 为什么越写越少&#xff1f; 问就是在打瓦。(bushi) 1、操作系统 一、进程…

设计模式Java实现-建造者模式

楔子 小七在2019年的时候&#xff0c;就想写一个关于设计模式的专栏&#xff0c;但是最终却半途而废了。粗略一想&#xff0c;如果做完一件事要100分钟&#xff0c;小七用3分钟热情做的事&#xff0c;最少也能完成10件事情了。所以这一次&#xff0c;一定要把他做完&#xff0…

Windows常用快捷键与CMD常用命令

1.win系列快捷键使用 WinD&#xff0c;快速进入桌面 WinE&#xff0c;打开我的电脑&#xff08;文件资源管理器&#xff09; WinI&#xff0c;打开设置界面 WinL&#xff0c;快速锁屏 WinM&#xff0c;最小化所有窗口 WinShiftM&#xff0c;还原最小化的窗口 WinV&#…

为什么下载卡在idealTree:NodeJS: sill idealTree buildDeps

可能使用的是npm config set registry https://registry.npm.taobao.org而这个镜像文件已经过期了 解决方法如下&#xff1a; 先使用 npm cache clean --force 清除缓存 再切换镜像源 再使用npm config get registry 进行查看是否换源成功 再使用 npm install -g vue/cli 就…

【算法】滑动窗口——长度最小的子数组

本篇文章是用一个实例来介绍常用算法之一“滑动窗口”的相关概念&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解2.1暴力求解思路&#xff1a;2.2时间复杂度是多少&#xff1f; 3.暴力求解的优化3.1固定left的情况下&#xff0c;优化right的次数。3.2sum求值优化3.3不同组…

商城数据库88张表结构完整示意图81~88及总览图(十六)

八十一&#xff1a; 八十二&#xff1a; 八十三&#xff1a; 八十四&#xff1a; 八十五&#xff1a; 八十六&#xff1a; 八十七&#xff1a; 八十八&#xff1a; 总览图&#xff1a;

Redis开源社区持续壮大,华为云为Valkey项目注入新的活力

背景 今年3月21日&#xff0c;Redis Labs宣布从Redis 7.4版本开始&#xff0c;将原先比较宽松的BSD源码使用协议修改为RSAv2和SSPLv1协议&#xff0c;意味着 Redis在OSI&#xff08;开放源代码促进会&#xff09;定义下不再是严格的开源产品。Redis官方表示&#xff0c;开发者…

websevere服务器从零搭建到上线(四)|muduo网络库的基本原理和使用

文章目录 muduo源码编译安装muduo框架讲解muduo库编写服务器代码示例代码解析用户连接的创建和断开回调函数用户读写事件回调 使用vscode编译程序配置c_cpp_properties.json配置tasks.json配置launch.json编译 总结 muduo源码编译安装 muduo依赖Boost库&#xff0c;所以我们应…

webpack与vite

webpack 使用步骤&#xff1a; 初始化项目 pnpm init -y安装依赖webpack、webpack-cli在项目中创建src目录&#xff0c;然后编写代码&#xff08;index.js&#xff09;执行pnpm weboack来对代码进行打包&#xff08;打包后观察dist文件夹&#xff09; 配置古文件&#xff08;w…

使用ThemeRoller快速实现前端页面风格美化

使用ThemeRoller快速实现前端页面风格美化 文章目录 使用ThemeRoller快速实现前端页面风格美化一、ThemeRoller二、使用方法1.基本操作面板介绍2.直接用现成的配色风格——Gallery画廊3.自定义风格——Roll Your Own4.下载风格包并应用到页面 一、ThemeRoller ThemeRoller是jQ…