【J2SE快速进阶】——数组(及其内存分析 )

简介: 早在学习其他语言如C、VB、C#、C++等时也学习过数组,平时项目中也经常用,但从没仔细再深入了解,这里学习Java又遇到了,重新整理一下。

 


      早在学习其他语言如C、VB、C#、C++等时也学习过数组,平时项目中也经常用,但从没仔细再深入了解,这里学习Java又遇到了,重新整理一下。


     


      一句话概括数组是什么:数组就是有一组相同数据类型的数据的集合。


      数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组中每个元素的类型可以是任何数据类型。


      数组定义和初始化


      数组的声明可以看做是在内存中为数组的每个元素分配空间的过程;数组的初始化可以看做往分配的空间里赋值的过程。


      数组的定义      


      Java中定义数组的格式为:类型[] 变量名,如int[] arr;          


<pre name="code" class="java">int[] arr;
arr=new int[4];


      int[] arr这句代码定义了一个名为arr的数组变量,只在栈内存中分配一个内容为空的变量。如下图:


71.png


      arr=new int[4]这句代码的执行为变量arr中分配了一块空间,这时会在堆内存中分配一个长度为4的数组(即4个用来存储int类型的存储单元的集合),并且这个数组内的存储单元会自动初始化为0,跟类的成员变量一样。如下图:

72.png


      注意:因为Java中的数组都是存在于堆内存中的,其他一些语言如C、C++中的数组是可以存在于栈内存中,不像C和C++,Java中声明数组时不能指定数组的长度,如 int[4] arr; 这是错误的写法。


      数组的初始化


      初始化一个数组可以静态初始化,也可以动态初始化。

      静态初始化,就是在定义数组的同时为数组赋值,比如:    

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

 

     也可以写成:    


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


      动态初始化,就是先定义数组,然后在需要的时候对它进行赋值,比如:


<span style="white-space:pre">  </span>int[] arr=new int[5];
<span style="white-space:pre">  </span>arr[0]=1;
<span style="white-space:pre">  </span>arr[1]=2;
<span style="white-space:pre">  </span>arr[2]=3;
<span style="white-space:pre">  </span>arr[3]=4;
<span style="white-space:pre">  </span>arr[4]=5;


       动态初始化时,如果不为数组中的元素赋值,则会对应其数据类型生成相应的初始值,跟类的成员变量的默认值一样,布尔类型默认为False,引用类型默认为null,其他类型默认为0。


       无论是静态初始化还是动态初始化,初始化时都必须指定数组的长度。


   


       数组的引用


       定义数组并为其分配了空间后,就可以引用数组中的每个元素了,引用方式为:arr[index]


       arr为数组变量名,index为数组下标,其值可以为整型常数或者表达式长度为n的数组下标的范围为0~n-1。如当定义了一个长度为n的数组a时,a[4]就代表这个数组中的第5个数,即a[n-1]中存储的是数组a中的第n个数据。


       此外,Java中每个数组都有一个length属性指明数组的长度,如a.length的值就是数组a的长度。

       举例说明


       ☆ 定义一个整型数组        

<pre name="code" class="java" style="font-size: 18px;">public class ArrayTest {
  public static void main(String[] args) {
    int arr[]=new int[3];
    arr[0]=1;
    arr[1]=2;
    arr[2]=3;
                arr[3]=4;
  }
}


       代码中定义arr的内存变化与上文定义数组的内存图变化一样,最后为arr中的四个单元赋值后的结果为:


73.png


相关文章
|
10月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
3月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
244 3
|
2月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
137 4
AI代理内存消耗过大?9种优化策略对比分析
|
11月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
178 1
|
12月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
139 2
|
6月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
6月前
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
126 2
|
10月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
320 62
|
10月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
245 1
|
10月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。