零基础Java第八期:一维数组(1)

目录

一、 一维数组的基本概念 

1.1. 什么是数组

1.2. 数组的创建及初始化

1.3. 数组的使用

二、数组是引用类型

2.1. 初始JVM的内存分布

2.2. 基本类型变量与引用类型变量

 2.3. 引用变量的理解

2.4. null 

 三、数组的应用场景

 3.1. 作为函数的参数

3.2. 作为函数的返回值


一、 一维数组的基本概念 

1.1. 什么是数组

       当我们需要存储多个类型相同的变量时,如果一个一个去创建会很麻烦 ,此时我们就可以使用数组去简化这类问题。数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间,地址是连续存放的。每个空间有自己的编号,第一个位置的编号为0,即数组的下标。

1.2. 数组的创建及初始化

 (一)数组的创建规则:

数据类型 [] = new 数据类型[N],其中N表示数组的长度。

        int[] array1=new int[10];//表示一个可容纳10个int型的数组double[] array2=new double[20];//表示一个可容纳20个double型的数组String[] array3=new String[30];//表示一个可容纳30个String性的数组

 (二)数组的初始化 

数组的初始化主要分为动态初始化以及静态初始化。 

(1)动态初始化:在创建数组时,直接指定数组中元素的个数

int[] array=new int[10]

(2) 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

        int[] array4 = new int[]{0,1,2,3,4,5,6,7,8,9};double[] array5 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};String[] array6 = new String[]{"hell", "Java", "!!!"};

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

       如果没有对数组进行初始化,数组中元素有其默认值。如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值。 

类型默认值
byte0
short0
int0
long0
float0.0f
double0.0
char/u000
booleanfalse
Stringnull

        在这里我们只演示boolean和String类型的默认值,代码如下,对此代码进行调试,运行最后一行时,我们就可以看到boolean的默认值为false

    public static void main(String[] args) {boolean[] array=new boolean[3];//默认值为falseSystem.out.println("=====");String[] str=new String[3];}

 

1.3. 数组的使用

(1)数组元素的访问 

      数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素 ,即我们可以通过下标来进行打印、修改,并且不能越界访问,否则会出现如下报错。

        int[] arrays=new int[]{1,2,3,4};arrays[2]=10;System.out.println(arrays[1]);//打印元素System.out.println(arrays[2]);//修改元素System.out.println(arrays[4]);//越界访问

(2)遍历数组:将所有元素都访问一遍。

       如果我们一个一个打印,或者对里面的元素进行修改,会非常麻烦。此时我们可以使用for循环来解决。

        int[] arrays = new int[]{1,2,3,4,5,6};for(int i=0;i<=5;i++){System.out.println(arrays[i]);}

     我们来对此代码进行调试,当运行到“System.out.println(arrays[i]);”时,就会产生如下图所示。

       虽然for循环可以帮助我们解决上面提到的问题,但是我们无法获取数组的长度。那我们就可以通过下面的代码来进行实现。

        int[] arrays = new int[]{1,2,3,4};for(int i=0;i< arrays.length;i++){System.out.print(arrays[i]);}System.out.println();for (int x:arrays) {System.out.println(x);}

      第一种是for循环,原理不必多说;第二种是for-each,原理是遍历数组,将数组中的元素赋值给x,但这种方法无法获取数组元素的下标,也无法对下标进行运算。

     当然还有第三种打印方式,是由Java官方提供操作数组的工具,代码如下:

import java.lang.reflect.Array;
import java.util.Arrays;public class Main {public static void main(String[] args) {int[] arrays=new int[]{1,2,3,4,5};String ret=Arrays.toString(arrays);System.out.println(ret);}
}

         Array需要导入一个Arrays的包,我们可以查看一下toString的源码,是String类型的,所以使用String ret来接收一下,直接打印ret就可以了。 下图为打印结果。

二、数组是引用类型

2.1. 初始JVM的内存分布

       我们经常说数组是引用变量,数组里的元素是如何储存在数组里的呢?要想搞清楚这两个问题,那我们首先需要了解JVM的内存分布。

       我们可以把JVM理解为一个大房子,房子分为客厅、厨房、卧室、厕所。同样,JVM也可以划分出多个内存空间,如下图所示。设想一下,如果我们的房子非常乱,找起东西来就会很麻烦。如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦。 

2.2. 基本类型变量与引用类型变量

       基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。 好,我们来看下面一组代码:

public static void main(String[] args){int a = 1;int[] arrays = {1,2,3,4,5};

      arrays就是一个局部类型的引用变量,数组里的元素会在堆上有一个地址,arrays这个变量就会在栈上存这个地址;a也是main方法里的局部变量,它只会在栈上开辟内存空间,就不会在堆上。所以引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该 地址,引用变量便可以去操作对象。

 

 2.3. 引用变量的理解

看下面一组代码:

    public static void main(String[] args) {int[] array1 = new int[3];array1[0] = 10;array1[1] = 20;array1[2] = 30;int[] array2 = new int[]{1,2,3,4,5};array2[0] = 100;array2[1] = 200;array1 = array2;//重点,必须理解array1[2] = 300;array1[3] = 400;array2[4] = 500;for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}}

       array1=array2,相当于我们把array2的地址赋给了array1,则array1就不能存原来的地址,这样就会造成两块引用同时指向一个空间,相当于通过array1去修改并访问array2,所以说打印出来的值则为100、200、300、400、500。那array1之前所指向的内存空间呢?答案是被回收掉了。

2.4. null 

       null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置.。因此不能对这个内存进行任何读写操作。 一旦尝试读写, 就会抛出 NullPointerException,说明某个引用为空,访问了一个空的引用。

public class Main {public static void main(String[] args) {int[] array1 = {1,2,3};System.out.println(array1);//打印结果是16进制的地址int[] array2 = null;//array2属于引用类型,默认值不能为0
//      array引用不指向任何对象System.out.println(array2.length);//null不指向任何对象,运行就会显示空指针异常}
}

     博主还留下了两个问题给你去思考:1、引用可以指向引用吗? 2、一个引用可以指向多个对象吗?好,第一个问题:array1=array2,上面我们提到了,array1指向的是array2所指向的对象。第二个问题:一个引用只能指向一个对象,比如 int a=10,不能说a在栈上存储了10个数据吗。

 三、数组的应用场景

 3.1. 作为函数的参数

public class Main {public static void print(int[] array){for (int i = 0; i < array.length; i++) {System.out.print(array[i]);}System.out.println();}public static void main(String[] args) {int[] array={1,2,3};print(array);}
}

        虽然两个引用都指向了同一个对象,但两个引用的作用域不一样,上面的array是形参,下面的array是实参 ,打印出来的结果就是1 2 3。在这种情况下,我们修改形参的值, 不影响实参的值。那如果我们来看下面一组代码,参数传数组类型呢?

       两个方法都是传递引用类型,第一个方法改变了形参的地址,形参的指向被改变了;而第二个方法中,形参修改了指向对象的内容。 

public class Main {public static void func1(int[] array){array =new int[]{10,20,30,40,50};}public static void func2(int[] array){array[0]=10;}public static void main(String[] args) {int[] array={1,2,3};func1(array);print(array);main1(args);//在main方法中,我们调用main1,就可以同时运行main和main1}public static void main1(String[] args) {int[] array={1,2,3};func2(array);print(array);}

 

3.2. 作为函数的返回值

我们都知道调用方法时,只能返回一个值,那我们可以使用数组来进行多个返回值的接收,代码如下:利用ret来接收,并返回给array。

import java.util.Arrays;public class Main {public static int[] test(){int[] ret=new int[2];ret[0]=10;ret[1]=20;return ret;}public static void main(String[] args) {int[] array=test();System.out.println(Arrays.toString(array));}
}

 

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

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

相关文章

2024台州赛CTFwp

备注&#xff1a; 解题过程中&#xff0c;关键步骤不可省略&#xff0c;不可含糊其辞、一笔带过。解题过程中如是自己编写的脚本&#xff0c;不可省略&#xff0c;不可截图&#xff08;代码字体可以调小&#xff1b;而如果代码太长&#xff0c;则贴关键代码函数&#xff09;。…

【HarmonyOS NEXT】服务端向终端推送消息——获取Push Token

【需求】 获取Push Token 【文档】 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/push-get-token-V5 【代码】 // EntryAbility.ets 文件 import { pushService } from kit.PushKit; export default class EntryAbility extends UIAbility {onCreat…

第T7周:咖啡豆识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)**难度&#xff1a;夯实基础⭐⭐语言&#xff…

Qt5.14.2 安装详细教程(图文版)

Qt 是一个跨平台的 C 应用程序开发框架&#xff0c;主要用于开发图形用户界面&#xff08;GUI&#xff09;程序&#xff0c;但也支持非 GUI 程序的开发。Qt 提供了丰富的功能库和工具&#xff0c;使开发者能够在不同平台上编写、编译和运行应用程序&#xff0c;而无需修改代码。…

如何通过CDN优化网站服务器访问速度?

CDN&#xff0c;即内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;在现代互联网中起着重要作用。它可以显著提升网站服务器的访问速度。以下是CDN在加速网站访问方面的主要优势及其工作原理。 1. 全球分布的服务器节点 CDN通过在全球范围内布设多个…

CANoe与C#联合仿真方案

引言 CANoe作为一款强大的网络仿真工具,能够模拟各种通信协议,尤其是在汽车领域的CAN、LIN、Ethernet等协议。而C#作为一种广泛使用的编程语言,能够为CANoe提供灵活的用户界面和逻辑控制。本文将探讨如何将CANoe与C#结合,实现高效的联合仿真方案。 1. 系统架构 联合仿真…

Python学习的自我理解和想法(16)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第16天&#xff0c;从今天开始&#xff0c;每天一到两个常用模块&#xff0c;更完恢复到原来的。开学了&#xff0c;时间不多&#xff0c;写…

Bug:通过反射修改@Autowired注入Bean的字段,明确存在,报错 NoSuchFieldException

【BUG】通过Autowired注入了一个Bean SeqNo&#xff0c;测试的时候需要修改其中的字段。通过传统的反射&#xff0c;无论如何都拿不到信息&#xff0c;关键是一方面可以通过IDEA跳转&#xff0c;一方面debug也确实能看到这个字段。但是每次调用set方法报错&#xff1a;NoSuchFi…

Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解

title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…

【数据分享】1901-2023年我国省市县三级逐月最低气温(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;该数据来源于国家青藏高原科学数据中心&#xff0c;很多小伙伴拿到数据后反馈栅格数据不太方便使用&#xff0c;问我们能不能把数据处理为更方便使用的Sh…

Android15之解决gdb:Remote register badly formatted问题(二百三十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

C++临时变量的常量性

C 临时变量的常量性-CSDN博客 #include <iostream> using namespace std; void print(string& str) {cout << str << endl; }int main() {print("hello world");//print(string("hello world"));return 0; }编译器根据字符串"…

探索 Coconut: Python 的新篇章

文章目录 探索 Coconut: Python 的新篇章背景&#xff1a;为何选择 Coconut&#xff1f;Coconut 是什么&#xff1f;如何安装 Coconut&#xff1f;简单的库函数使用方法1. 惰性列表2. 模式匹配3. 函数组合4. 协程5. 模式匹配数据类型 场景应用1. Web 开发2. 数据处理3. 异步编程…

【C++】类的默认成员函数:深入剖析与应用(下)

&#x1f4af;前言 回顾上篇文章&#x1f449;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09;中对构造函数、拷贝构造函数和析构函数的讨论&#xff0c;强调这些默认成员函数在类的创建、初始化和销毁过程中的重要性。 ✍引出本篇将继续探讨剩余…

【工具变量】A股上市企业大数据应用(2001-2023年)-参考柏淑嫄实践

数据简介&#xff1a;企业数字化转型的浪潮孕育出大数据&#xff0c;大数据技术是在数据处理和应用中释放大数据多元价值的必要手段。大数据作为企业发展的战略资源和生产要素对企业转型发展具有重要意义。对上市企业大数据应用程度进行测算不仅有助于了解大数据相关技术在企业…

Triton Inference Server 架构原理

文章目录 TensorRT-LLM & Triton Server 部署回顾部署梳理Triton 架构 为什么要使用 backend &#xff1f;triton_model_repo 目录结构Ensemble 模式BLS 模式 上篇文章进行了 TensorRT-LLM & Triton Server 部署 &#xff0c;本篇简单讲讲 Triton Inference Server 的架…

ECCV2024 Tracking 汇总

一、OneTrack: Demystifying the Conflict Between Detection and Tracking in End-to-End 3D Trackers paper&#xff1a; https://www.ecva.net/papers/eccv_2024/papers_ECCV/papers/01174.pdf 二、VETRA: A Dataset for Vehicle Tracking in Aerial Imagery paper&#…

基于ECS和NAS搭建个人网盘

前言 在数字化时代&#xff0c;数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累&#xff0c;使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备&#xff08;如硬盘、U盘&#xff09;虽然方便&#xff0c;但存在易丢失、损坏和数据…

2013 lost connection to MySQL server during query

1.问题 使用navicat连接doris&#xff0c;会有这个错误。 2.解决 换低版本的navicat比如navicat11。

【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)

零.前置篇章 本篇前置文章为【LVGL快速入门(一)】LVGL开源框架入门教程之框架移植 一.UI设计 介绍使用之前&#xff0c;我们要学习一款LVGL官方的UI设计工具SquareLine Studio&#xff0c;使用图形化设计方式设计出我们想要的界面&#xff0c;然后生成对应源文件导入工程使用…