new int [0]的怪事

前言

在leetcode的从上到下打印二叉树这道题,提交的时候有一个案例未通过,显示如下
题目描述

输入null,输出空数组
看一下部分我们提交的代码

.....
  if(root==null)
  {
      return null;
  }
  .....

这段代码中检测当输入的TreeNode的根节点root为null时,直接输出null。
对于力扣评判系统中对于二叉树是以数组的形式读入的,那么当输入[]时,系统评判输入的测试数据结果为:树为空,即null。
代码判断root为空时,直接返回null是不对的,因为我们需要返回的是一个数组。
这里就引出了java中空数组与null的区别。

//下面两行代码肯定是不一样的,但是不一样在何处啊
return null;
return new int[0];

两者的不同,可以从以下几个角度去理解。

内存使用方面

(1): int []a;
(2): int []a={};
(3):int []a=new int[0];
(4): int []a=null;

从上到下内存使用的越来越多。
代码(1):在栈内存中声明了一个数组变量,但是并没有给这个变量装进具体的数组地址。
代码(2):给array赋了一个数组的地址,但是这个数组{}是里面没有值,长度为0的数组,但是确实在内存里开辟了一块数组的空间。
代码(3):给array赋了一个长度为0的数组地址,但是new int[0] 是在堆里面开辟了一块空间

变量使用方面

代码(1):在java中,这时的a属于没有被赋值的变量,在任何方法中都不能被使用
代码(2): 在java中,可以调用相应的方法对其进行操作
代码(3): 在java中,可以调用相应的方法对其进行操作

结论

  • 对于返回值为数组的题目,注意最后的返回值不能直接为null,可能的原因是为了更进一步的处理数组返回这,如果返回值为null,则任何方法都不能对其进行操作。
  • 同时,这一题给我们的思考就是对于数组作为输入时的判断准则也应该分为两步:对于数组而言,不但要判断它是否为空指针,也需要判断它是否有内容,同时要先判断空指针再判断长度是否为0,顺序不能颠倒,因为空指针没有length属性。
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值