Java数组深入

内存中的数组

前边提到:数组是一种引用类型,数组引用变量只是一个引用,当它指向有效内存的时候才可以通过数组变量来访问数组元素,也就是说数组变量和数组元素在内存中是分开放的。

可以这么理解,一个人名就是一个引用变量,通过这个人名找到这个人,获取他的所有信息,就是通过引用变量访问其真实对象的过程。

例如数组int[]arr中arr是一个数组引用变量,但他并没有初始化,也就是说没有指向一块内存,所以它并不能被使用。int[]arr = new int[3]; 而这个语句则明确申请了一块三个int(12个字节)空间的内存,并让arr这个数组引用变量去指向他,以此来访问实际的数组对象。

那么,这两个东西在内存中具体在哪呢?

  • 实际的数组对象被存在堆(heap)内存中。

  • 数组引用变量如果是局部变量,就被存在栈(stack)内存中。

Java中的堆和栈

  • 所有的方法中定义的局部变量都会逐个放入栈内存中,方法结束,栈内存就会销毁。

  • 而每创建一个对象,就会被保存到堆内存中,以便反复利用,即运行时数据区,不会随方法的结束销毁,意味着,方法结束后,还可能有另一个引用变量正在指向它。注意:只有当一个对象没有任何引用变量引用它时,才会变成垃圾,被系统的垃圾回收器自动回收。

所以:想要让一个数组彻底变成“垃圾”,直接将数组变量赋值null。

如下:

int[]arr = new int[3];
arr = null;
arr[1]=0;//java.lang.NullPointerException

具体关于Java中的垃圾回收机制,以后再具体的进行总结,待补充。。

基本类型初始化

前边也提到,数组如果没有进行初始化,是不能够使用它的,那么初始化的过程在内存中又是如何体现的呢,基本类型的初始化和引用类型的初始化又有何不同呢。

对于基本数组而言,数组元素的值直接存储在对应的数组元素中。所以初始化数组时,先为数组分配内存空间,然后直接把数组元素的值放到对应的位置上。

public class Test1
{
public static void main(String[] args)
{
//定义一个int[]类型的数组变量
int[] arr;
//动态初始化数组,整型默认为0
arr = new int[4];
//利用for循环给数组每个元素赋值
for(int i = 0;i<arr.length;i++) arr[i]=i;
//打印显示数组结果
for(int i:arr) System.out.print(i+" ");//0 1 2 3
}
}
  • 定义数组变量

  • 动态初始化

  • 赋值

引用类型数组的初始化

欸,数组本身就是引用类型,创建的数组元素又是引用类型,数组元素还指着另外一块内存,那里才装着有效数据

我们知道,类是引用类型的其中一种,所以下面通过建立一个全是类的数组,关于数组,应该很快就要开始学习并总结啦,所以这块还是先肤浅地谈一谈,有待补充。

class Hero
{
public int defenseVal;
public int attackVal;
} public class Test
{
public static void main(String[] args)
{
//定义一个students数组变量,其类型是Hero[]
Hero[] heros;
//动态初始化
heros = new Hero[2];
//创建一个Hero实例,并让Zed变量指向该实例
Hero Zed = new Hero();
//为Zed赋攻击力和防御力属性
Zed.attackVal = 95;
Zed.defenseVal = 5;
//让数组的第一个元素指向实例Zed
heros[0]=Zed;
//发现Zed和heros[0]指向同一片内存。
System.out.println(heros[0].attackVal==Zed.attackVal);
}
}
  • 定义数组变量

  • 动态初始化

  • 创建实例

  • 赋值

Java数组深入的更多相关文章

  1. Java 数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...

  2. 第5章 Java数组

    1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...

  3. Java 数组基础

    数组 数组(Array):相同类型数据的集合. 定义数组 方式1(推荐,更能表明数组类型) type[] 变量名 = new type[数组中元素的个数]; 比如: int[] a = new int ...

  4. Java数组及其内存分配

    几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...

  5. [转载]Java数组扩容算法及Java对它的应用

    原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组 ...

  6. Java数组技巧攻略

      Java数组技巧攻略 0.  声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {" ...

  7. Java数组扩容算法及Java对它的应用

    1)Java数组对象的大小是固定不变的,数组对象是不可扩容的.利用数组复制方法可以变通的实现数组扩容.System.arraycopy()可以复制数组.Arrays.copyOf()可以简便的创建数组 ...

  8. Java数组与vector互转

    Java数组与vector互转 /* Object[] object1 = null ; //数组定义 Vector<Object> object2;//Vector定义 object2 ...

  9. 比较Java数组,ArrayList,LinkedList,Vector 性能比较

    public class PerformanceTester { public static final int TIMES=100000; public static abstract class ...

  10. Java数组的12个常用方法

    以下是12个关于Java数组最常用的方法,它们是stackoverflow得票最高的问题. 声明一个数组 String[] aArray = new String[5]; String[] bArra ...

随机推荐

  1. 深入理解JavaScript中的作用域、作用域链和闭包

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qappleh/article/detai ...

  2. Swagger -- 解决日期不正确

    继  Swagger--解决日期格式显示为Unix时间戳格式 UTC格式 这篇博客解决的日期格式后又发现了一个问题 问题 查询出来的时间没有注意到足足少了8个小时,如图 解决 其实这个问题不是Swag ...

  3. 树莓派上搭建arduino命令行开发环境

    -------------还是博客园上面的格式看这舒服,不去新浪了------------- 为什么要在树莓派上开发arduino呢?总要把树莓派用起来嘛,不然老吃灰. 树莓派使用SSH时没有图形界面 ...

  4. 生成对抗网络(Generative Adversarial Networks,GAN)初探

    1. 从纳什均衡(Nash equilibrium)说起 我们先来看看纳什均衡的经济学定义: 所谓纳什均衡,指的是参与人的这样一种策略组合,在该策略组合上,任何参与人单独改变策略都不会得到好处.换句话 ...

  5. 设计模式(十八)Memento模式

    在使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态. 要想恢复实例,需要一个可以自由访问实例内部结构的权限.但是,如果 ...

  6. 对于Serializable的理解

    对于Serializable的理解 Last Edited: Apr 04, 2019 2:53 PM Tags: java 开始 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢 ...

  7. 2018.8.10 python中的迭代器

    主要内容: 1.函数名的使用 2.闭包 3.迭代器 一.函数名的运用 函数名是一个变量,但他是一个特殊的变量,与括号配合可执行函数的变量. 1.函数名的内存地址 def func(): print(' ...

  8. 【MySQL】MySQL 8.0.X的安装与卸载命令

    1.请读者自行下载MySQL Server https://dev.mysql.com/downloads/mysql/ 2.解压.zip文件 将mysql-8.0.12-winx64.zip解压到 ...

  9. podman初试-和docker对比

    podman初试-和docker对比 1,什么是docker? Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者可以打包他们 ...

  10. idea 2019 1 spring boot 启动报错 An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]

    1.构建一个简单springboot工程,日志打印报错内容如下: 15:38:28.673 [main] DEBUG org.springframework.boot.devtools.setting ...