Javase-数组

文章目录

        • 1.1 为什么要使用数组
        • 1.2 数组的定义及初始化
        • 1.3 数组的使用
        • 1.4 遍历数组
        • 1.5 数组在内存中的存储分析
        • 1.6 数组的传参
        • 1.7 数组的拷贝

1.1 为什么要使用数组

假设现在有一个任务,要你存储5个同学的学习成绩(double类型),这时候我们可以写出来 double score1 = 90.4…等五个语句来定义学生的成绩,那如果我说有50个,100个学生呢?继续这么做么,显然效率太低了,所以我们引入数组这一概念
下面是数组的基本特征

  1. 数组中存放的元素其类型相同
  2. 数组的空间是连在一起的
  3. 每个空间有自己的编号,其实位置的编号为0,即数组的下标
1.2 数组的定义及初始化

数组的创建

数组元素类型[] 数组名 = new 数组元素类型[元素个数]
例如:
int[] arr = new int[5];
创建一个整型数组里面有5个整型元素
String[] arr = new String[4];
创建一个字符串数组,里面存放4个字符串 

数组的初始化
数组的初始化分成动态初始化和静态初始化
1.动态初始化
在定义数组的同时直接指定数组元素的大小

例如:
int[] arr = new int[5];

2.静态初始化,在定义数组的同时不直接指定数组的大小,而是根据后面的内容确定

例如
int[] arr = new int[]{1,2,3,4};
double[] arr =new double[]{1.1,2.2,3.3};
......

静态初始化数组的注意事项
静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
静态初始化时, {}中数据类型必须与[]前数据类型一致。
静态初始化可以简写,省去后面的new T[]。
例如:

int[] arr = {1,5,6,3};

静态和动态的初始化数组可以分步骤,但是静态省略版本不可以

double[] arr;
arr = new double[5];

double[] arr;
arr = new int[]{1,2,3,4,5};

注意:以下操作是不合理的,会报错
double[] arr;
arr = {4,5,6,4};

请注意:
如果不对数组进行初始化,那么数组会进行特定的初始化(这里面我怀疑是因为数组也是一种引用类型,可能有什么构造器之类的,在创建的实话就进行了初始化)
具体的默认值见下表
在这里插入图片描述

1.3 数组的使用

1.数组中的元素访问
在内存中数组是一块连续的内存,通过下标进行的访问
数据的下标范围集中在[ 0 , N ) 之间

int[] arr = new int[]{1,2,3,4};
int ret = arr[2];
此时ret的值就是3
int res = arr[4];
这时候程序就会报错...

错误见下
在这里插入图片描述
其实数组的越界访问,这个错误要记下来,以后会经常遇到
如果一个数组为空,可能存在的异常如下
在这里插入图片描述

在这里插入图片描述
这个也是非常重要的一种异常,叫做空指针异常

1.4 遍历数组

我们有三种方式进行数组的遍历
1.通过基础的for循环来遍历数组

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

这个就是最简单的遍历数组的方式,不用多说了

2.for each循环(增强for循环)

int[] arr = new int[]{1,2,3,4,5};
    for(int element : arr){
        System.out.println(element);
    }
基本原理就是遍历数组arr,将遍历所得到的值保存进入element进行使用
这其实就导致了一个坏处,就是我们只能遍历完所有的数据
而不可以遍历特定范围的数据,也不可以知晓相应的下标

3.Arrays类方法中的toString方法

import java.util.Arrays;
public class Array {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4};
        String ret = Arrays.toString(arr);
        System.out.println(ret);
    }
}
使用这个方法我们要首先进行导包的操作

这个方法其实就是返回一个包含有arr元素的字符串
下面我们想要进行这个方法的源码的分析,ctrl+鼠标左键挪动到指定的方法下面点开点进行,就可以找到相应方法所对应的源码
在这里插入图片描述
如果仔细看,可以发现有好多的方法重载在其中,但是以我们现有的水平,不足以完全看懂底层的一些方法
但是我们可以自己模拟一下属于我们自己的toString方法

public static String myToString(int[] arr){
        if(arr == null){
            return "null";
        }else if(arr.length == 0){
            return "[]";
        }else{
            String ret = "[";
            for(int i = 0; i < arr.length; ++i){
                ret = ret + arr[i] + ", ";
                if(i == arr.length - 1){
                    ret = ret + arr[arr.length - 1] + "]";
                }
            }
            return ret;
        }
    }

这就非常好理解了…

1.5 数组在内存中的存储分析

我们首先分析一下 Java虚拟机运行时的内存区域划分
可以划分为5个区域,分别是我们的

  1. 虚拟机栈
  2. 本地方法栈
  3. 方法区
  4. 程序计数器
    程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址
    虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
    本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的
    堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会销毁
    方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域r): 只是一个很小的空间, 保方法调用相关的一些信息,栈、动态链接等…

上面是一些专业的术语,我们现在用我们自己的话翻译一下,首先,我们要知道引用类型new出来的是对象,而对象就是存储在堆空间中的
我们分析一下当下面这段代码运行时发生的事情

int[] arr = new int[5];

在这里插入图片描述
系统首先会执行右侧的代码,先在堆区分配一个20字节的空间,地址为0x666,并且默认初始化为0,然后再栈区创建一个临时变量arr用来保存这个地址
所以如果我们System.out.print(arr),会发现打印出来一个类似于地址的东西
在这里插入图片描述
这就是开辟数组的时候内存的变化情况
其实这也就是所有引用类型的内存逻辑分析

1.6 数组的传参

之前我们提到过,一切传参传递的都是值,现在我们理解了,现在假设我们有以下代码
在这里插入图片描述
在之前的篇章中我们提到过,为什么上述代码可以完成数组元素的交换呢,下面我们通过下面这张图来理解
在这里插入图片描述
当我们运行程序的时候会将arr保存的地址给arr(swap的形参),此时二者都指向了一块相同的空间,该空间的地址也就是0x621所以在方法内部进行的改动,可以影响外部原数组的情况

下面我们再分析一个案例
在这里插入图片描述
分析以下上面这个例子,首先会在堆空间开辟一块内存存储{1,2,3,4,5},然后返回该空间的地址交给arr来管理,假设这个地址是0x111,然后调用方法,此时我们的arr(方法中)也指向了0x111这一块地址,但是方法内部又开辟了一块新的空间,地址为0x222,操作之后最后返回了arrNew也就是0x222,我们知道arrNew是一个局部变量,所以方法结束之后他是会被销毁的,但是我们的开辟的0x222这个地址,如果有返回值接收,那就不会被销毁,如果没有,jvm会自动进行回收,然后我们把ret中保存的0x222这个地址拷贝一份交给了arr,所以此时二者都指向空间0x222,然后jvm虚拟机回收掉没人用的0x111

1.7 数组的拷贝

下面我们介绍三种数组拷贝的方法
方法一:
使用基础的for循环进行数组的遍历

public static int[] copyArray(int[] arr){
        int[] arrNew = new int[arr.length];
        for(int i = 0; i < arr.length; ++i){
            arrNew[i] = arr[i];
        }
        return arrNew;
    }

这个方法比较基础我们就不多说了

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

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

相关文章

谷粒商城-nginx搭建域名访问环境性能压测

nginx搭建域名访问环境 正向代理与反向代理 正向代理&#xff1a;客户端向代理服务器发请求并指定目标服务器&#xff0c;代理向目标服务器转交请求并将获得的内容返回给客户端。 反向代理&#xff1a;用户直接访问反向代理服务器就可以获得目标服务器的资源。反向代理服务器…

Redis能保证数据不丢失吗?

引言 大家即使没用过Redis&#xff0c;也应该都听说过Redis的威名。 Redis是一种Nosql类型的数据存储&#xff0c;全称Remote Dictionary Server&#xff0c;也就是远程字典服务器&#xff0c;用过Dictionary的应该都知道它是一种键值对&#xff08;Key-Value&#xff09;的数…

基于机器学习、遥感和Penman-Monteith方程的农田蒸散发混合模型研究_刘燕_2022

基于机器学习、遥感和Penman-Monteith方程的农田蒸散发混合模型研究_刘燕_2022 摘要关键词 1 绪论2 数据与方法2.1 数据2.2 机器学习算法2.3 Penman-Monteith方程2.4 Medlyn公式2.5 模型性能评估 3 基于机器学习算法的混合模型估算农田蒸散量的评价与比较4 利用人工神经网络算法…

js使用import到本js文件中的函数时报错 Error [ERR_MODULE_NOT_FOUND]: Cannot find module

node:internal/process/esm_loader:97internalBinding(errors).triggerUncaughtException(^Error [ERR_MODULE_NOT_FOUND]: Cannot find module D:\桌面\Pagesizedetection\lib\screensize imported from D:\桌面\Pagesizedetection\index.js Did you mean to import ../lib/sc…

文件上传漏洞--Upload-labs--Pass09(在某些版本的靶场里是Pass10)--点+空格+点 绕过

一、什么是 点空格点 绕过 顾名思义&#xff0c;将 test.php 改为 test.php. . &#xff0c;观察到后缀名php后多出了 点空格点。那么 点空格点 是如何进行绕过的&#xff0c;在什么情况下可以使用&#xff0c;让我们结合题目讲解。 二、代码审计 1、查看题目源代码上半部分&…

Nginx 配置前端工程项目二级目录

前提&#xff1a; 前端工程技术框架: vue 后端工程技术工程&#xff1a;spring boot 需求&#xff1a;需要通过二级目录访问前端工程&#xff1a; 如之前&#xff1a;http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

CrossOver虚拟机软件2024有哪些功能?最新版本支持哪些游戏?

CrossOver由codewaver公司开发的类虚拟机软件&#xff0c;目的是使linux和Mac OS X操作系统和window系统兼容。CrossOver不像Parallels或VMware的模拟器&#xff0c;而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏&#xff0c;而不…

链表之“无头单向非循环链表”

目录 ​编辑 1.顺序表的问题及思考 2.链表 2.1链表的概念及结构 2.2无头单向非循环链表的实现 1.创建结构体 2.单链表打印 3.动态申请一个节点 3.单链表尾插 4.单链表头插 5.单链表尾删 6.单链表头删 7.单链表查找 8.单链表在pos位置之前插入x 9.单链表删除pos位…

力扣645. 错误的集合(排序,哈希表)

Problem: 645. 错误的集合 文章目录 题目描述思路复杂度Code 题目描述 思路 1.排序 1.对nums数组按从小到大的顺序排序; 2.遍历数组时若判断两个相邻的元素则找到重复元素&#xff1b; 3.记录一个整形变量prev一次置换当前位置元素并与其作差&#xff0c;若差等于2着说明缺失的…

一篇文章搞懂CDN加速原理

目录 一、什么是CDN CDN对网络的优化作用主要体现在以下几个方面&#xff1a; 二、CDN工作原理 CDN网络的组成元素&#xff1a; 三、名词解释 3.1 CNAME记录&#xff08;CNAME record&#xff09; 3.2 CNAME域名 3.3 DNS 3.4 回源host 3.5 协议回源 一、什么是CDN CD…

linux增加物理磁盘并挂载到文件系统

centos7增加物理磁盘并挂载到文件系统 1、查看所有磁盘情况 fdisk -l2、创建挂载路径 mkdir /data3、格式化磁盘 #磁盘filesystem(上图标红处) mkfs.xfs -f /dev/sda建议 与其它磁盘文件系统保持一致&#xff0c;我这里是xfs 可通过 cat /dev/sda查看 4、挂载 mount /dev/…

今日必读的9篇大模型论文

1.Customize-A-Video&#xff1a;文生视频&#xff0c;可以自由定制了 图像定制在文本到图像&#xff08;T2I&#xff09;扩散模型中已经得到了广泛的研究&#xff0c;并取得了令人印象深刻的成果和应用。随着文本到视频&#xff08;T2V&#xff09;扩散模型的兴起&#xff0c…

从零开始手写mmo游戏从框架到爆炸(二十一)— 战斗系统二

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 上一章&#xff08;从零开始手写mmo游戏从框架到爆炸&#xff08;二十&#xff09;— 战斗系统一-CSDN博客&#xff09;我们只是完成了基本的战斗&#xff0c;速度属性并没有…

前端数据可视化:ECharts使用

可视化介绍 ​  ​  应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。   ​  数据可视化主要目…

读取7400MB/s!华为发布eKitStor Xtreme M.2闪存条

今日&#xff0c;华为举行数据存储新春新品发布会&#xff0c;不仅发布全新数据湖解决方案&#xff0c;华为还针对商业市场与分销市场发布了全闪存存储新品。 据介绍&#xff0c;面向游戏加速、影视编辑、户外作业等场景&#xff0c;华为发布eKitStor Xtreme系列高性能M.2闪存条…

Leetcode3035. 回文字符串的最大数量

Every day a Leetcode 题目来源&#xff1a;3035. 回文字符串的最大数量 解法1&#xff1a;哈希 排序 由于可以随意交换字母&#xff0c;先把所有字母都取出来&#xff0c;然后考虑如何填入各个字符串。 如果一个奇数长度字符串最终是回文串&#xff0c;那么它正中间的那…

一文读懂Linux内核中的Device mapper映射机制

一、 简介 本文总结Device mapper的映射机制。Device mapper是Linux2.6内核中提供的一种逻辑设备到物理设备的映射框架机制&#xff0c;在该机制下&#xff0c;用户可以很方便的根据自己的需要指定实现存储资源的管理策略&#xff0c;当前比较流行的Linux的逻辑卷管理器比如&a…

轻松打造智能化性能测试监控平台:【JMeter+Grafana+Influxdb】的优化整合方案

在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系统、应…

igolang学习3,golang 项目中配置gin的web框架

1.go 初始化 mod文件 go mod init gin-ranking 2.gin的crm框架 go get -u github.com/gin-gonic/gin 3.go.mod爆红解决

渗透测试之RCE漏洞

RCE&#xff08;remote command execute&#xff09;远程命令执行。应用程序的某些功能需要调用可以执行的系统命令的函数&#xff0c;如果这些函数或者函数的参数被用户控制&#xff0c;就可能通过命令连接符将恶意的命令拼接到函数中&#xff0c;从而执行系统命令。 常见的命…