1、数组的内存空间是何时分配的

Java中的数组是用来存储同一种数据类型的数据结构,一旦初始化完成,即所占的空间就已固定下来,初始化的过程就是分配对应内存空间的过程。即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。 
了解什么是数组看这里:java中的数组是什么 
当仅定义一个数组变量(int[] numbers)时,该变量还未指向任何有效的内存,因此不能指定数组的长度,只有对数组进行初始化(为数组元素分配内存空间)后才可以使用。 
数组初始化分为静态初始化(在定义时就指定数组元素的值,此时不能指定数组长度)和动态初始化(只指定数组长度,由系统分配初始值)。

//静态初始化
int[] numbers = new int[] { 3, 5, 12, 8, 7 };
String[] names = { "Miracle", "Miracle He" };//使用静态初始化的简化形式
//动态初始化
int[] numbers = new int[5];
String[] names = new String[2];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

建议不要混用静态初始化和动态初始化,即不要既指定数组的长度的同时又指定每个元素的值。

当初始化完毕后,就可以按索引位置(0~array.length-1)来访问数组元素了。 
当使用动态初始化时,如在对应的索引位未指定值的话,系统将指定相应数据类型对应的默认值(整数为0,浮点数为0.0,字符为’\u0000’,布尔类型为false,引用类型(包括String)为null)。

public class TestArray {public static void main(String[] args) {String[] names = new String[3];names[0] = "Miracle";names[1] = "Miracle He";/*for(int i = 0; i < names.length;i++) {System.out.print(names[i] + " ");}*///还可以使用foreach来遍历for(String name : names) {System.out.print(name + " ");}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

结果如下: 
Miracle Miracle He null 
Miracle Miracle He null

2、数组在内存中如何储存

首先给出数组(数组引用和数组元素)在内存中的存放形式,如图:

数组引用变量是存放在栈内存(stack)中,数组元素本质是一个对象,是存放在堆内存(heap)中。通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问。 
了解堆和栈看这里:[java堆和栈有什么区别][3] 
[3]: 
当数组在初始化时,就会在堆中分配对应的空间,这个大小是不会因为内部元素的变化而变化,也就是说,如果数组中某个元素被清空,数组占用的内存空间也不会缩小。

存放引用类型数组在内存中如何储存看这里:引用类型数组在内存中如何储存

原文地址:http://blog.csdn.net/ooppookid/article/details/51404440

Java千百问_06数据结构(014)_java数组如何存储在内存中相关推荐

  1. Java千百问局部变量、类变量、实例变量有什么区别

    Java千百问局部变量.类变量.实例变量有什么区别 局部变量.类变量.实例变量有什么区别 在聊局部变量.类变量.实例变量有什么区别之前,我们需要了解一下Java变量. 1.Java变量是什么 在数学世 ...

  2. Java千百问_03基本语法(002)_java都有哪些关键字

    java都有哪些关键字 首先我们来看看什么是关键字,关键字的含义. 1.java关键字是什么意思 关键字是电脑语言里事先定义的,有特别意义的特殊标识符,又叫保留字. Java的关键字对Java的编译器 ...

  3. Java千百问_03基本的语法(005)_二进制是如何做位运算的

    点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种 ...

  4. Java千百问_07JVM架构(015)_XmnXmsXmxXss有什么区别

    点击进入_更多_Java千百问 1.XmnXmsXmxXss有什么区别 首先,Xmn.Xms.Xmx.Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果. ...

  5. Java千百问_07JVM架构(009)_什么是新生代的复制算法

    点击进入_更多_Java千百问 1.什么是新生代的复制算法 了解堆内存看这里:java堆内存是什么样的 了解java垃圾回收看这里:java垃圾回收机制是什么 所谓复制算法(Copying),即将内存 ...

  6. Java千百问_01基本概念(007)_线程的状态有哪些

    点击进入_更多_Java千百问 1.线程的状态有哪些 在java中java.lang.Thread类有一个变量threadStatus,标示了该线程的当前状态,它是一个int类型,但是对应的get方法 ...

  7. Java千百问_01基本概念(012)_Socket是什么

    [点击进入_更多_Java千百问][1] [1]: http://blog.csdn.net/ooppookid/article/category/6134850 ###1.什么是Socket Soc ...

  8. Java千百问_07JVM架构(001)_java内存模型是什么样的

    1.什么是内存模型 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多.Java针对多种异构平台的独立性,使得多线程技术也具有了开拓性的一面.  我们有时 ...

  9. Java千百问_05面向对象(004)_java接口到底是什么

    1.什么是接口 接口(interface)不是一个类,它是抽象方法的集合.一个类实现一个接口,从而继承和实现接口的抽象方法.  抽象方法看这里:java中抽象概念如何体现的 接口的特点如下,先看与类类 ...

最新文章

  1. java8日期加本地,日期时间API(JDK8新增)
  2. 锚文本对网站SEO优化有什么帮助?
  3. webserver通信过程
  4. visual studio 重命名项目和程序集名称
  5. python 面试题 2020_2020年最全python面试题
  6. MySQL如何删除有外键约束的数据
  7. 前端学习(1690):前端系列javascript之知识体系1
  8. sybase不支持的条件表达式_包教包会!7段代码带你玩转Python条件语句(附代码)...
  9. SQL Server 数据库中的几个常见的临界值
  10. php静态类 使用场景,【php】PHP静态方法和非静态方法的使用场景
  11. Chrome 打包扩展程序
  12. Linux内核管理子系统和进程管理子系统
  13. matlab练习程序(图像放大/缩小,双立方插值)
  14. lena-ts 图像处理和卷积操作
  15. 亿道丨三防手机丨手持终端丨零售行业如何选择手持工业终端设备?
  16. 吃了老边饺子,感觉比大清花好吃,呵呵
  17. VS2010设计rdlc报表时找不到“报表数据”选项卡的解决方法
  18. 美通企业日报 | 茅台在海外市场供不应求;默克广东创新中心将正式投入使用...
  19. ASP.NET Image Manipulation Examples: Adding, Zooming, Enlarging
  20. 在Chrome 浏览器上滚动截屏

热门文章

  1. 语法分析——自上而下
  2. Qt:Windows编程—代码注入
  3. 10款 非常酷炫的网站首页焦点图 兼容ie浏览器
  4. 企业建立私有云的N个理由
  5. JavaScript-作用域-预解析
  6. HTML基础(2)——边框
  7. 【读书笔记】设计模式沉思录
  8. Google搜索正在“死亡”
  9. 56秒看完131年英格兰顶级联赛冠军排行:利物浦时隔30年再夺冠
  10. 世界上第一位程序员,竟然是诗人拜伦的女儿?