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

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

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

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

数组定义和初始化

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

数组的定义

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

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

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

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

注意:因为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中的四个单元赋值后的结果为:


时间: 2024-12-15 21:07:56

J2SE快速进阶——数组(及其内存分析 )的相关文章

J2SE快速进阶——Java内存分析

程序的执行过程 要在Java中分析内存,我们先来了解一下程序的执行过程: 正如上图所示,大致分为3个步骤: 1.最开始,我们的程序是存在于硬盘中的,当启动运行时,程序会被加载(load)到内存中去,这里的内存可以看做我们的内存条: 2.此时,内存中除了存在刚加载的程序的代码,还存在操作系统本身的代码(好吧,此句可以当做废话→_→),操作系统会找到程序中的Main方法开始执行程序: 3.第三步就是本文的重点,系统在程序执行过程中对内存的管理.在Java中,内存大致会被分为四块--heap(栈).s

J2SE快速进阶——向上转型及其内存分析

还记得刚通过C#学习面向对象时,接触了对象转型,最近学习Java,又遇到了.这里再用Java分析一下对象的转型,并适当利用内存分析来加深理解. 向上转型 我们都知道,狗是动物中的一种,那么如果现在有一个Dog类和Animal类,那么他们的关系就是Dog类继承Animal类. 我们经常说,狗是动物,实际上"狗是动物"这句话就是向上转型的一个例子,即把狗(子类)当做动物(父类)来看待.用一句话来总结,向上转型就是父类的引用指向子类的实例. 实例说明&&内存分析 下面就用一个

J2SE快速进阶——IO流的四个基本抽象类InputStream、OutputStream、Reader、Writer

上文中对java.io包中的四个抽象类及其关系简单了解了一下,这里进一步对它们及其子类进一步总结一下. 在上篇博客末尾,贴出了Java中的整个IO家族,之后小编又重修改了一下,在之前的基础上,标识出了节点流与处理流(绿色为节点流,黄色为处理流). 这里我们分别来说一下这四个抽象类. 细心的你也许会发现,大部分输入流和输出流都是成对的,有输入就有输出,一一对应. InputStream 输入字节流InputStream的作用是标志那些从不同数据起源产生输入的类. 基本方法有: int read()

J2SE快速进阶——递归算法

递归算法 递归,百度百科对其定义为:程序调用自身的编程技巧.说白了就是一个函数或者过程在执行时会调用自身. 先用一个 " 求一个数的阶乘 " 的例子来说明 : public class Test { public static void main(String[] args) { System.out.println(Method(3)); } public static int Method(int n){ if(n==1) return 1; else return n*Metho

J2SE快速进阶——Socket编程入门(TCP/UDP)

作品展时,我们的作品 "超级飞聊" 的主打功能就是聊天,包括局域网聊天.外网聊天等,虽然那时是用VB实现的(winsock控件),不过每种编程中的思想还是大同小异的,所以学习Java中的Socket编程时,倍感亲切啊. 概念了解 Socket又称"套接字",用来向网络中的主机发出请求或者应答网络中发出的请求. 文章开头先来简单了解一下TCP与UDP这两个协议: TCP TCP(Transmission Control Protocol传输控制协议)是一种面向连接的.

J2SE快速进阶——Java中的equals和==的区别

我们都知道,Java中数据类型大体上可分为两类:基本数据类型和引用数据类型.equals和==都是用来比较数据与数据是否"相等". 基本数据类型的比较 基本数据类型之间的比较用"==",用来判断它们的值是否相等. 示例代码: public class Test{ public static void main(String[] args){ int i1=9; int i2=9; boolean b1=true; boolean b2=true; char c1='

J2SE快速进阶——IO流

IO流的概念 IO流是从数据从一处流向另一处的抽象,就像水流从管道的一端流向另一端一样.在程序中,所有的数据都是以流的方式来传输和保存的. JDK所提供的所有流类位于java.io包中,并且这些类都分别继承自以下四种抽象流类:InputStream.OutputStream.Reader和Writer. 说明: InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位). OutputStream:继承自OutputStream的流都是程序用于

J2SE快速进阶——多线程之synchronized

我和老婆去银行取钱 有一天,和老婆打了个赌,现在我的银行账号里共有5000块钱,我们去银行同时取钱,看我俩能不能同时取出5000来....(PS:打赌的代价是:如果都能取出5000,那这10000块都给她买吃的!如果只能取5000,嘿嘿,那就只用着5000块给她买吃的~~~~怎么觉得这条件有点怪怪的nie?) 心动不如行动!她拿着存折去柜台取,我拿着银行卡去ATM机取,找了个合适的时机,我在输入好金额时,一直盯着那个teller的手,他在一切准备就绪后敲回车的同时,我以迅雷不及掩耳之势按下了确定

J2SE快速进阶——Java多线程机制

学习Java中的线程时,自然而然地联想到之前学过的操作系统中处理器那一块的知识. 定义 文章开头,先大概说一下程序.进程和线程的概念及其之间的关系. 程序:程序就是一段静态的代码,或者一个可执行程序. 进程:进程是程序的一次动态执行的过程,它对应着从代码加载.运行到结束的一次动态的执行过程. 线程:比进程更小的执行单位,一个进程在执行过程中,可以产生多个线程,也就是多个分支.它是程序执行流的最小单位. 来看一个小程序: public class Test { public static void