A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敬 中级黑马   /  2012-8-25 15:34  /  2299 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果说让你定义个一null的数组,你会怎么定义
是这么定义
int[] arr = null;
还是
int[] arr = new int[]{};
这里不太理解null和没有数据的数组有什么区别,内存中是什么样子的呢?

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

10 个回复

倒序浏览
数组定义为{} 给它分配了一个内存空间
但是数组定义位 null的话 则只是 定义了一个指针
内存分为堆和笺 嘛
指针只存在于堆中 而不存在于 笺
堆中用于存放指针 笺中用于存放值
回复 使用道具 举报
int[] arr = new int[]{};
System.out.println(arr[0]);
报错:java.lang.ArrayIndexOutOfBoundsException: 0 数组角标越界
int[] arr1=null;
System.out.println(arr[0]);
报错:java.lang.NullPointerException 空指针

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 测试是好方法!

查看全部评分

回复 使用道具 举报
null指的是一个什么都不存在的一个特殊的值,什么都不存在但是他还是有值的只有一个指针
空指的是这个量暂时什么都没有
回复 使用道具 举报
我会用
int [] arr = {};
int [] arr = new [];
这样的都输出的是null
回复 使用道具 举报
如果定义成 int[] arr = null; 表示该数组在内存中没有指向,调用 arr.toString(); 来看一下, 会发生 NullPointerException。
如果定义成int[] arr = new int[]{}; 表示在内存中会为数组开辟一块空间,调用它的 arr.toString(); 为 [I@c17164,并且 arr.length; 为0
回复 使用道具 举报
定义个一null    的数组,应当是指数组中的没有元素,也就是 0个元素
int [] arr = {};
int [] arr = new [];
这样既可,
nt[] arr = null 这样定义数组没用意义,因为,数组是引用类型数据,这样定义,Java内存回收机制会回收这段内存,出现java.lang.NullPointerException 空指针异常。
回复 使用道具 举报
尤洋 中级黑马 2012-8-26 10:22:16
8#
int[] arr = null; 这里arr  这里数组为空     引用变量没有任何指向,一旦调用它,就会出现空指针异常
int[] arr = new int[]{};  这里arr并不为空, 只是new的数组没有值,仅仅进行了默认初始化,而数组属于引用数据类型,初始化的值为null。
回复 使用道具 举报
刘源 发表于 2012-8-25 15:38
数组定义为{} 给它分配了一个内存空间
但是数组定义位 null的话 则只是 定义了一个指针
内存分为堆和笺 嘛

我怎么记得栈中存的是指针,堆中存的是数值呢
回复 使用道具 举报
int[] arr = null;
说明没有分配空间,只是定义了一个指针,
int[] arr = new int[]{};
说明内存中定义了一个内存空间
还有区别就是
如果类定义为空的话,那么他就不能调用里面的方法
而int[] arr = new int[]{};能够调用方法
回复 使用道具 举报
int[] arr=null        虚拟机应该会回收吧。
int[] arr=new int[]{}       虚拟机应该不会回收吧。new了一个空间,而且arr指向这个地址。
我认为栈里面一定是指针, 栈会溢出。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马